【问题标题】:C++ Creating objects from an array of namesC++ 从名称数组创建对象
【发布时间】:2017-08-13 22:16:15
【问题描述】:

这是我在这里的第一个问题,我很兴奋!

我想从 Person 类创建很多对象,从字符串数组中获取每个对象的名称。

类似这样的:

class Person 
{
// bla bla bla
};

string listOfPersons [5000];

// here i will fill in the whole array with names

for (int i=0;i<5000);i++){
// here: create the objects with the name from the array
// like Person Mary.... Person John... Person... Patricia...

}

非常感谢!!

【问题讨论】:

  • 你的问题是现在?
  • 我不明白这个问题。
  • 嗨,Pablo,欢迎来到 StackOverflow。当您说“它不起作用”时,请更具描述性。如果可能的话,给出一个准确的错误信息,以及预期的输入和输出。此外,您可能希望从较小的人开始,可能是 1 人而不是 5k :-)
  • Person listOfPersons [i] //here is where it doesn't work 正确,由于多种原因会失败。 1. 您的 Person 数组必须在循环外声明。 2.不要和你的字符串数组一样命名。
  • create object 是什么意思?如果您的意思是在运行时创建新类型,那么您不能。

标签: c++ arrays class object


【解决方案1】:

这可能是最愚蠢的答案,但如果我理解你想要做什么,无论如何这都是愚蠢的。

如果你想要声明 Person 类型的对象,并且 Object 的名称(这里我的意思是变量的名称)是从字符串中设置的,我认为这是不可能的。

listOfPersons[i] 是一个字符串对象,它可能等于程序中其他位置的另一个字符串对象(例如,您的数组中可以有两个“Johns”字符串)。

但是当你声明一个 Person 类型的变量时:

Person person_name;

person_name 是引用此Person 类型变量的唯一ID,并且此ID 无法通过编程方式设置,因为这不是字符串,是您在编写C++ 代码文件时编写的.因此,如果您想要这样声明对象:

Person john;
Person patricia;
Person edward;
//...

您只能手动执行此操作。特别是不要在字符串数组中的 for 循环中,因为这是没有意义的。

如果您想要使用字符串访问Person 对象,那么您想要使用的是map

using <map>

class Person 
{
// bla bla bla
};

string listOfPersons [5000];
std::map<string, Person> persons;

// here i will fill in the whole array with names

for (int i=0;i<5000);i++){
    Person temp;  // declare a temp Person object. Here you might instead want to use a constructor that you defined.
    persons[listOfPersons[i]] = temp; // Add the Person object into the map

    // This will be like doing persons["Patricia"] = temp;    
}

然后当你想访问对象时,你可以调用:

persons["name"];

然后用它做你想做的事。您还可以使用迭代器对整个人物地图进行操作。

【讨论】:

  • 好的,谢谢指教。有另一种方法可以做到这一点。伤心你说:“我不认为这是可能的”。总有办法的。再次感谢您的宝贵时间。
  • 想想当你声明一个int时,你写“int i = 0”。绝对没有办法从代码中以编程方式设置变量的名称(这里是“i”),因为这段代码应该被编译,而代码本身不能依赖于运行时会发生什么。
  • @PabloLopez 在这种情况下,答案确实是“没有办法”。 C++ 还没有反射,更不用说内省了,这是在运行时创建变量所需要的。
【解决方案2】:

根据您更新的问题,您希望创建一个源文件,其中源代码中的这些变量名称基于您的数组中的名称。

在这种情况下,您将需要编写一个单独的程序来以这种方式生成源代码。

这里有一个简单的模型来说明如何做到这一点

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main(){
    fstream fstr("pablos.cpp",ios::out);
    string names[]={string("John"),string("Joe"),string("Sally")};

    if(fstr.is_open()){
        fstr <<     "#include <iostream>\n"  /* include what you need for the code */
                    "#include <Person.h>\n"
                    "int main(){\n";

        for(int i=0;i<3;i++){
            fstr << "   Person " << names[i]<<";\n";
        }

        fstr <<     "   return 0;\n"
                    "}\n";
        fstr.close();
    }

    return 0;
}

如果你运行这个程序,你会生成一个新的源文件Pablo.cpp,它看起来像这样:

#include <iostream.h>
#include <Person.h>
int main(){
   Person John;
   Person Joe;
   Person Sally;
   return 0;
}

您现在可以直接进一步编辑此源代码,或在编译之前按照您认为合适的方式更改上面的生成程序(如果这恰好是目标)。我会留给您根据需要更新此来源。我不知道您为什么要在源代码中包含 5,000 个不同命名的变量,但可以采用这种方式。

乍一看,根据 cmets,您似乎在建议一个自我修改的源代码,这不是事情的工作方式。源代码需要编译才能act,直接或间接执行。

原帖(供参考)

我认为您可能会将构造函数与数组混淆,或者将字符串类与个人类混淆。

以下代码将创建两个单独的数组,每个数组包含 5000 个条目。如果您拥有或能够向您的 Person 类添加 setName 方法,那么您可以分配所有 5000 个 Person 对象和 5000 个字符串。之后,用名称填写您的字符串数组(看来您已经有办法这样做了)。最后,只需遍历您的 Person 数组并为每个具有相应字符串的条目调用 setName 方法即可。

class Person 
{
   // bla bla bla
   // includes a setName(string) method
   //
};

string arrayOfNames [5000];
Person arrayOfPersons [5000];

// after filling the whole array with names...
// (I assume this means arrayOfNames is filled in now..)  

for (int i=0;i<5000;i++){
    arrayOfPersons[i].setName(arrayOfNames[i]);  
}

【讨论】:

  • 非常感谢!那是工作。是一个解决方案,但是,我想设置从 arrayOfNames [] 中获取这些名称的对象的名称。因此,在循环之后,创建了许多名为 John、Mary、Isabella... 的对象,而不是 arrayOfPersons [0] = {John}... arrayOfPersons [1] = {Mary} ....
  • 我编辑了问题。感谢大家的耐心等待。
  • 啊,我现在从你的编辑中看到你在说什么。您希望将 C++ 代码中的变量名称称为 this。好吧,根据我的想法,你这样做的方式是编写另一个程序,然后为你编写一个 .cpp 文件,并将名称注入其中。
  • 这种事情在 PHP、JavaScript、CSS 等中出现的频率更高(至少在我的经验中;然后它经常是混乱的)。
  • 感谢“信息”。这样,我真的可以以编程方式命名整个对象。当“没有答案”时,我也是答案。我想这是一些工作,但我可以管理一个预制的功能,以便将来轻松。我将学习如何管理文本文件并以编程方式创建它们(我猜就是这个词)。
猜你喜欢
  • 2016-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-21
  • 1970-01-01
  • 2022-10-16
  • 1970-01-01
相关资源
最近更新 更多