对象矢量的初始化

Initialization of vector of objects

本文关键字:初始化 对象      更新时间:2023-10-16

在我提出问题之前,让我提前提到,我知道这个话题已经讨论了很多,但通过查看大多数答案,我再次未能找到实现我想要的东西的正确方法(很可能是因为我错过了给出的答案)。所以,假设我想创建20倍的对象向量(比如每个向量的大小为10),它应该是全局范围的(从某种意义上说,这是在类内完成的,我希望这些对象向量在类外传递)。因此,我真的不确定以下内容是否有效:

for ( int i =0; i<20; i++)
 vector<A> * vec_of_class = new vector<A>(10);
 /*where A is the class and I use new to have them in the heap,
 so that they won't be local */

现在,我知道这意味着我应该格外小心地处理它们并确保我准备删除它们,但我不确定我正在做的操作是否有效。一般来说,我想实现初始化对象A的20个不同向量,这些向量可以在全局范围内使用(操作发生在其他类的函数中),我知道它可以使用对象a的向量的向量,但我想知道如何正确地进行这种操作(在其他类的体函数中初始化对象a的20个不同向量,并全局使用它们)。我希望,我的问题不会让人困惑,你可以在这里给我一些帮助。

动态分配任何标准容器(包括vector)时都不应该出现这种情况。所以std::vector<> = new <>总是错的。

要初始化矢量,可以使用多种技术。我发现初始值设定项列表特别方便,比如这里:

std::vector<int> vec{10, 20, 30, 40, 50};

所以,假设我想创建20倍的物体矢量(比如每个物体的大小为10)

这很容易。用途:

std::vector<std::vector<A>> my_data{20, std::vector<A>{10}};

这应该是全局范围的(从某种意义上说,这是在类内完成的,我希望这些对象向量在类外传递)。

我不清楚你想在这里完成什么。

当某些事情在类内完成时,可以在static成员函数或常规成员函数中完成。似乎您应该使用static成员函数,但我不确定。

如果您使用static成员函数,我建议:

std::vector<std::vector<A>> const& TheClass::get_my_data()
{
   static std::vector<std::vector<A>> my_data{20, std::vector<A>{10}};
   static bool inited = false;
   if ( !inited )
   {
      // Set the values of the elements in my_data
      // ...
      inited = true;
   }
   return my_data;
}

如果使用常规成员函数,我建议在构造函数中填充my_data并从函数返回。

// Need to make my_data a member variable
TheClass::TheClass() : my_data{20, std::vector<A>{10}}
{
   // Set the values of the elements in my_data
   // ...
}
std::vector<std::vector<A>> const& TheClass::get_my_data() const
{
   return my_data;
}

如果在函数中声明一个变量,那么该变量的作用域就是函数。外面无法进入。

您可以做的是在全局范围内声明20个指针,并在任何需要的地方(例如,在函数内部)初始化它们。