作为结构的成员初始化类

initiating class as a member of struct

本文关键字:初始化 成员 结构      更新时间:2023-10-16

我正试图创建一个内部有结构成员的类:

.h文件:

class A
{
 public:
 struct Result 
 {
  int x;
  UGraph G;       <------ class definition
 };
 Result m_tempStructResult;
 A:A(void);
 void function();
}

.cpp文件

A::A()
{
}
void A::function()
{
 UGraph Graph(10);      <---- object has to receive a value
 ...
              //manipulations on Graph
 ...
 m_tempStructResult.G = Graph;
}

我得到的编译错误是:

error C2512: 'A::Result' : no appropriate default constructor available

所以我想问题是缺少默认构造函数,所以我添加了这个:

struct Result
    {
        Result::Result(int graph_size=0) : G(graph_size){
        }
        int x;
        UGraph G;
    };

问题解决了。

我的问题是,是否有其他方法可以在类A的构造函数内启动类UGraph G?而不是在其成员结构中?

谢谢。

是的,在Result:的构造函数中使用初始值设定项列表

Result::Result() : G(0)  // you have to insert some integer here
{
}

C++11中的另一种方法是在类中给它一个默认值:

struct Result
{
    UGraph G = UGraph(10);
};

有关小型演示,请参阅此处。


编辑感谢@OthmanBenchekroun,我终于相信我理解了这个问题:

因此,这里是另一个示例代码,它使用聚合初始化来初始化Result的成员(而不更改后者的构造函数(。

struct G
{
    G(int) {}
};
struct Result
{
    int x;
    G g;  
};
struct A
{
    A() : m_tempStructResult{1, G(1)} {}
    Result m_tempStructResult;
};
int main()
{
    A{};
}

另一个演示在这里。

然而,这并不意味着我建议这样做。相反,我会给Result一个合适的默认构造函数。否则,它可能无法使用。

我的问题是,是否有其他方法可以启动课程UGraph G在类A的构造函数内部?而不是在其成员结构中?

如果不"构造"Result,则不能启动作为Result成员的G,GResult的成员,而不是A的成员。因此,正常的方法是在Aconstructor中启动Result,而Resultconstructor将启动G

您可以使用列表初始化来构造m_tempStructResult,其中A的成员初始化列表中有专门构造的G(或A::m_tempStructResult的大括号或相等初始化器(:

A::A():
    m_tempStructResult {
        0, // x
        10 // G, braces can be elided (only for non-explicit constructors as pointed out by davidhigh)
    }

G仍然在成员对象中初始化,但代码在A的构造函数中(不是主体,而是成员初始化列表(,我认为这是您的意思。