将类作为struct的成员启动

时间:2015-06-10 12:56:14

标签: c++

我正在尝试创建一个带有struct成员的类:

.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?而不是在其成员结构中?

感谢。

3 个答案:

答案 0 :(得分:6)

是的,在Result的构造函数中使用初始化列表:

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

}

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

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

对于小型演示,请参阅here

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

所以这是另一个示例代码,它使用aggregate initialization来初始化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{};
}

另一个演示here

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

答案 1 :(得分:1)

  

我的问题是,是否有另一种方式来启动UGraph G课程   在A类的构造函数中?而不是在其成员结构中?

如果没有&#39;构建&#39;你不能发起G成员的结果。结果,GResult的成员,而不是A的成员。 因此,正常的方法是在Result的{​​{1}}中发起constructor,而A的{​​{1}}将启动constructor

答案 2 :(得分:1)

您可以使用列表初始化在m_tempStructResult的成员初始化列表(或G的括号或等于初始值设定项)中使用专门构造的A构造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的构造函数中(不是正文,而是成员初始化列表),我认为这意味着你。