【问题标题】:Initialize array of objects in constructor在构造函数中初始化对象数组
【发布时间】:2021-09-10 10:32:07
【问题描述】:

我编写了一个包含对象数组的类,每个对象都希望在其构造函数中指向一个 c-struct 的指针:

这里有一些代码:

 class TheOtherClass
   {
     private: 
       SomeCStruct* m_pCStruct;
       int m_ObjIdx;

     public:
         TheOtherClass::TheOtherClass(SomeCStruct* pCStruct, int ClassIdx)
            : m_pCStruct(pCStruct),
              m_ObjIdx(ClassIdx)
         {}
     }

   class MyClass
    {
     private:
         TheOtherClass m_objects[4];
         SomeCStruct* m_pMyCStruct;

     public:
         MyClass::MyClass(SomeCStruct* pCStruct)
             : m_pMyCStruct(pCStruct)
         {
             m_objects[4] = {TheOtherClass(&pCStruct, 1), TheOtherClass(&pCStruct, 2), 
                             TheOtherClass(&pCStruct,3), TheOtherClass(&pCStruct, 4)};
         }

我实际上想在构造函数的初始化列表中初始化 MyClass 的成员对象,但我正在阅读这不可能吗? 因此我尝试了上述方法,但我总是收到错误:“TheOtherClass”:没有合适的默认构造函数可用。

另外要提的是,我正在运行的编译器是最先进的 C++03 编译器;-)(它是 DSP 的代码,TI 有点不想更新编译器)

任何帮助将不胜感激!

【问题讨论】:

  • private: TheOtherClass m_objects[4]; -- 您的错误不需要复制所有这些代码:int main() { TheOtherClass t; } -- 仅此一项是无法完成的,这都是因为没有默认构造函数。

标签: c++ pointers struct constructor


【解决方案1】:

由于MyClass(SomeCStruct* pCStruct) 构造函数没有(不能)在成员初始化器列表中初始化TheOtherClass m_objects,所以m_objects 需要默认构造 首先,然后此成员将在MyClass 构造函数的主体中重新分配新值

TheOtherClass 不会有合成的构造函数,因为你已经定义了(其他的,非默认的)ctor,它接受SomeCStruct*int。因此,您的代码中没有它的默认构造函数。

这里,我们定义了一个默认构造函数:

class TheOtherClass {
    SomeCStruct* m_pCStruct;
    int m_ObjIdx;
public:
    TheOtherClass() : m_pCStruct(nullptr), m_ObjIdx(0) {} // Default ctor
    TheOtherClass(SomeCStruct* pCStruct, int ClassIdx)
            : m_pCStruct(pCStruct),
              m_ObjIdx(ClassIdx) {}
};

至于MyClass。由于您已经将参数作为指针MyClass(SomeCStruct* pCStruct) 传递,因此您不需要获取它的地址(如&pCStruct)。

MyClass 中的主要问题是m_objects 的类类型为TheOtherClass,它没有定义任何operator=,包括采用大括号括起来的初始化列表的类。所以,你不能这样做:

m_objects[4] = { // The operator '=' has not been defined for the TheOtherClass, also note the subscript
    TheOtherClass(pCStruct, 1),
    TheOtherClass(pCStruct, 2), 
    TheOtherClass(pCStruct,3),
    TheOtherClass(pCStruct, 4)
};

再次,当您尝试对它进行列表初始化时,它已经被默认构造了。因此,要使这种方法起作用,您需要定义这样的 复制赋值运算符 来对已经默认构造的 TheOtherClass 实例进行这种赋值。至于如何实现这个算子,主要取决于整体设计和其他本帖未提及的因素。

更新

如果您将拥有MyClass 构造函数的以下主体,它将起作用:

MyClass(SomeCStruct* pCStruct) : m_pMyCStruct(pCStruct) {
    // Assign to default initialized TheOtherClass object
    m_objects[0] = TheOtherClass(pCStruct, 1); 
}

我建议你检查这些:

Operator overloading

Constructors and member initializer lists

【讨论】:

  • @KarlPoarf 您可能需要考虑使用最适合的标准库容器,而不是可变长度数组。
  • 感谢您抽出宝贵时间提供详细的答复。在该示例中, & 运算符当然是错误的。称之为复制/粘贴错误;)我添加了一个默认构造函数,如果我知道自己初始化数组的每个成员,它似乎确实有效。所以 MyClass 的构造函数体中的 init 现在看起来像这样:m_objects[0] = TheOtherClass(&pCStruct, 1);
  • 我猜你的意思是矢量之类的东西?为此,我需要深入研究嵌入式标准库,但可能值得一试....有几个原因
  • @KarlPoarf 使用方便绝对值得研究。
  • 日本好用。希望当我测试这个时不会出现任何惊喜:P 我会检查这些链接。我显然对这个主题缺乏了解。
猜你喜欢
  • 1970-01-01
  • 2021-11-06
  • 1970-01-01
  • 2021-07-12
  • 1970-01-01
  • 2012-03-05
  • 2021-07-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多