【问题标题】:Function that instantiates several objects at once一次实例化多个对象的函数
【发布时间】:2023-04-04 00:13:01
【问题描述】:

我正在制作一个简单的游戏,其中包含属于同一类的多个项目对象。我不想用一个永无止境的对象列表填充我的主函数,而是想创建一个执行此操作的函数,然后在主函数的开头调用它,但我意识到一旦它们的函数结束它们就会像平常一样被销毁变量。是否有一种解决方法来实例化所有对象而不在我的主函数中编写一个巨大的列表? (以下代码不是我在我的程序中使用的,它是简化的)

#include <iostream>

class Items
{
    public:
    std::string name;
    int number;
};

void CreateObjects()
{
    Items obj1 = {"Obj1", 1};
    Items obj2 = {"Obj2", 2};
    Items obj3 = {"Obj3", 3};
}

int main ()
{
    CreateObjects();
    std::cout << obj1.name;
    //here I get an error saying "Identifier obj1 is undefined"
}

【问题讨论】:

  • 这是std::vector(或std::array)的情况,或者有什么特殊原因需要这些单独的变量?
  • 我会尝试使用向量,我是 C++ 的新手,所以我不知道解决问题的所有可能“方法”哈哈。无论如何,谢谢。
  • 如果您的目标是创建多个多种类型 的对象,则另一种方法是返回具有多个成员(显然是所需类型)的struct。该函数创建struct 的实例,初始化每个成员,然后返回struct

标签: c++ function object destructor


【解决方案1】:
class Items
{
    public:
    std::string name;
    int number;
};

你用这些变量声明了一个类。太好了,现在让我们用以下三个项目创建另一个类:

class Objects {

public:

    Items obj1, obj2, obj3;

    Objects() : obj1{"Obj1", 1},
                obj2{"Obj2", 2},
                obj3{"Obj3", 3}
    {
    }
};

任务完成,您甚至不需要单独的功能!只需在你的 main 中实例化一个 Objects 类,作为一个局部变量,你就完成了:

Objects objects;

std::cout << objects.obj1.name;

【讨论】:

    【解决方案2】:

    obj1 不在您正在使用的函数的范围 中。对于来自 C/C++/Java/JS/F#/... 范围的编程语言的语言来说,这是一个非常基本的概念:变量不能从定义它们的 {} 之外(它们的范围)访问。在您的情况下,当您尝试访问它们时,它们甚至不再存在:所有三个obj1/2/3CreateObjects 的末尾都被销毁了。

    因此,在您的用例中,您可能会编写完全不同的内容¹。但是你可以做类似的事情

    #include <iostream>
    #include <string>
    #include <tuple>
    class Item {
    public:
      std::string name;
      int number;
    };
    
    auto createStuff() {
      Item obj1{"Obj1", 1};
      Item obj2{"Obj2", 2};
      Item obj3{"Obj3", 2};
      return std::tie(obj1, obj2, obj3); 
    }
    
    int main() {
      auto [a,b,c] = createStuff();
      std::cout << "a: " << a.name << " b: " << b.name << " c: " << c.name << "\n";
    }
    
    

    ¹(被编辑废弃)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多