作为结构的成员初始化类
initiating class as a member of 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?而不是在其成员结构中?
谢谢。
是的,在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,G
是Result
的成员,而不是A
的成员。因此,正常的方法是在A
的constructor
中启动Result
,而Result
的constructor
将启动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
的构造函数中(不是主体,而是成员初始化列表(,我认为这是您的意思。
相关文章:
- 为什么在C++中首先初始化成员类
- 是否可以防止省略聚合初始化成员?
- 正在复制具有未初始化成员的结构
- 使用大括号或括号初始化成员变量
- C++结构:强制初始化成员?
- C++中未初始化成员布尔变量的默认值是多少?
- 使用默认值初始化成员引用
- 在构造函数中初始化成员时,是否应该在成员上使用 std::move?
- C++使用 { } 初始化成员变量
- 如何根据构造函数参数使用超类类型初始化成员变量?
- OpenGL C++:VBO 的结构包装器不会初始化成员
- 有没有办法在Brace中初始化成员
- 从现有 istream 或类本身创建的 istream 初始化成员 istream
- 从其后声明的另一个成员数据初始化成员数据是否为未定义行为
- 通常应用方法,使用带有构造函数委托的 SFINAE 通过类模板的构造函数初始化成员
- 如何在嵌套类中初始化成员?C
- 是否可以在构造函数主体中初始化成员变量,而不是初始值设定项列表
- 编译器错误,因为构造函数必须显式初始化成员
- 如何使用成员函数初始化成员函数指针
- C 如何使用隐藏的默认构造函数初始化成员