我正在尝试创建一个带有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?而不是在其成员结构中?
感谢。
答案 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成员的结果。结果,G
是Result
的成员,而不是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
的构造函数中(不是正文,而是成员初始化列表),我认为这意味着你。