【问题标题】:Create Multiple Objects in a loop c++在循环中创建多个对象 C++
【发布时间】:2021-06-14 02:48:55
【问题描述】:

我是一个初学者,正在研究是否可以从数组中获取一个名称,然后将该名称作为对象的名称放入 for 循环中。

a 专门为这个问题创建的代码如下所示:

#include <iostream>

using namespace std;

class YourMum{
    public:
        string name;

        YourMum(string aName){
            name = aName;
        }
};

int main()
{
    string names[5] = {"Jeremy_Clarkson", "Boris_Johnson", "Vladmir_Putin", "Peter_Griffin", "MeAndYourMum"};

    for(int i = 0; i < 4; i++) {
        YourMum names[i];

        cout << names[i].name << endl;
        cout << "You are great if you answer my question!";
    }

    return 0;

}

【问题讨论】:

  • 您有关于您的代码的具体问题吗?它没有达到你的预期吗?
  • 从答案中的一个 cmets 看来,您似乎希望创建一个变量 named Jeremy_Clarkson from 字符串,以便您可以Jeremy_Clarkson.name。如果这就是您要问的,那么,您不能这样做——因为 C++ 是静态类型的,并且您不能从字符串文字中具体化新的符号名称
  • 谢谢你告诉我

标签: c++ arrays class for-loop object


【解决方案1】:

首先,您应该将 name 变量重命名为 _name 或 name_ 之类的名称(以将其与不在类中的变量区分开来),并且您还应该使用类的私有部分来声明它并使用 getters/setters 函数对其进行编辑。其次,在您的代码中,您在循环中声明对象,因此一旦循环再次迭代,它就会被销毁,因此,如果您想在循环中创建 n 个对象并在您应该使用容器类之后与它们交互(如 std::vector)或使用默认构造函数(更好)。这是您的代码的更新版本:

#include <iostream>
#include <string>

class YourMum
{
    public:

    YourMum(void) : _name() { }
    YourMum(std::string name) : _name(name) { }

    std::string getName(void) const { return _name; }
    void setName(std::string name) { _name = name; }


    private:

    std::string _name;
};

int main()
{
    std::string names[5] = { "Jeremy_Clarkson", "Boris_Johnson", "Vladmir_Putin", "Peter_Griffin", "MeAndYourMum" };
    YourMum mums[5];

    for (int i = 0; i < 5; i++)
    {
        mums[i].setName(names[i]);
        std::cout << mums[i].getName() << std::endl
        << "You are great if you answer my question!" << std::endl;
    }
    // this way you can still access mums here if you want to
    return 0;
}

如果你想通过它的名字作为索引来访问一个类,你也可以像这样使用 std::map

#include <map>

int main()
{
    std::string names[5] = { "Jeremy_Clarkson", "Boris_Johnson", "Vladmir_Putin", "Peter_Griffin", "MeAndYourMum" };
    std::map <std::string, YourMum> mums;

    for (int i = 0; i < 5; i++)
        mums[names[i]] = YourMum(names[i]);
    std::cout << mums["Jeremy_Clarkson"].getName() << std::endl;
    return 0;
}

【讨论】:

    【解决方案2】:

    您显示的YourMum 类不是默认可构造的,因此YourMum names[size]; 将不起作用。 YourMum 的每个对象都需要传递一个参数才能创建它。您可以为此使用placement-new,例如:

    #include <iostream>
    #include <type_traits>
    using namespace std;
    
    class YourMum{
        public:
            string name;
    
            YourMum(string aName){
                name = aName;
            }
    };
    
    int main()
    {
        string names[5] = {"Jeremy_Clarkson", "Boris_Johnson", "Vladmir_Putin", "Peter_Griffin", "MeAndYourMum"};
    
        std::aligned_storage<sizeof(YourMum), alignof(YourMum)>::type arr[5];
        YourMum *mums = reinterpret_cast<YourMum*>(arr);
    
        for(int i = 0; i < 5; i++) {
            new (&mums[i]) YourMum(names[i]);
        }
    
        for(int i = 0; i < 5; i++) {
            cout << mums[i].name << endl;
            cout << "You are great if you answer my question!";
        }
    
        for(int i = 0; i < 5; i++) {
            mums[i].~YourMum();
        }
    
        return 0;
    }
    

    或者,您可以改用std::vector

    #include <iostream>
    #include <vector>
    using namespace std;
    
    class YourMum{
        public:
            string name;
    
            YourMum(string aName){
                name = aName;
            }
    };
    
    int main()
    {
        string names[5] = {"Jeremy_Clarkson", "Boris_Johnson", "Vladmir_Putin", "Peter_Griffin", "MeAndYourMum"};
    
        std::vector<YourMum> mums;
        mums.reserve(5);
    
        for(int i = 0; i < 5; i++) {
            mums.emplace_back(names[i]);
        }
    
        for(int i = 0; i < 5; i++) {
            cout << mums[i].name << endl;
            cout << "You are great if you answer my question!";
        }
    
        return 0;
    }
    

    【讨论】:

      【解决方案3】:

      好的,目前尚不清楚您要做什么,但您有一些不是一个好主意的事情。

      首先,您定义了string names[5],然后在循环内部通过创建第二个同名变量来隐藏names。虽然这是合法的,但这是一种不好的做法。

      第二,你在非法使用第二个(YourMum names):

      1. 您将其声明为长度 i(使用编译器的非标准功能),但随后引用元素 i。长度为i 的数组的元素范围为0..i-1,因此[i] 是末尾的一个元素。

      2. 而且你还没有初始化它。

      我不太清楚你要做什么,所以我什至无法提供如何做的示例代码。

      【讨论】:

      • 由于 YourMum 不是默认可构造的,因此您不能拥有它们的原始数组。我的猜测是像std::vector&lt;YourMum&gt; 这样的调用,像mums.emplace_back(names[i]) 这样的调用会满足提问者的要求吗?但我也无法说出实际需要什么行为。
      【解决方案4】:

      试试这个

      > for(int i = 0; i < 4; i++) {
      >         YourMum name(names[i]);
      > 
      >         cout << name.name << endl;
      >         cout << "You are great if you answer my question!";
      >     }
      

      【讨论】:

      • 我可以像... cout 那样访问对象的值吗?
      • @GeneralFishy 变量名称是静态类型的。它们实际上需要在编译时命名。如果这是您所要求的,您无法查看字符串并将它们转换为变量名。
      • @GeneralFishy 如果你有 YourMum mums[] 之类的东西(请参阅我的答案作为示例),那么你可以使用 YourMum &amp;Jeremy_Clarkson = mums[0];,然后 Jeremy_Clarkson.name 就可以了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-08
      • 1970-01-01
      • 1970-01-01
      • 2011-12-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多