在另一个构造函数中实例化的对象的构造函数内调用函数
call a function inside a constructor of an object instantiated in an another constructor
#include <iostream>
struct D{};
struct B{};
struct C
{
C();
};
struct A
{
A();
B * b;
C * c;
D * d;
static A& pInstance()
{
static A a;
return a;
}
};
A::A()
{
b = new B;
c = new C;
d = new D;
}
C::C()
{
A::pInstance().b;
}
int main()
{
A::pInstance();
std::cin.ignore();
}
上述情况是否存在任何潜在问题,因为 C 构造函数调用 A 字段,而 A 类尚未完全解释。
我在生产中拥有此代码。该应用程序似乎在启动时随机崩溃,我想知道这是否是由于这种"糟糕"的设计。
它
被明确声明为未定义的行为:(§ 6.7/4("如果在初始化变量时控件以递归方式重新进入声明,则行为是未定义的。
[是否]上述情况可能存在任何问题,因为 C 构造函数调用 A 字段,而 A 类尚未完全构造。
是的。这可能会给您带来问题,因为行为是未定义的......
在static
A
(a
(完全构造之前初始化C
实例。 然后a
在C
的构造函数中被引用。由于a
不是构造的,因此您可以*进入递归循环。
这就是使用 g++ 构建它时发生的情况。
相关文章:
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- 构造函数/函数声明参数列表中的统一初始化
- 在c++中为链接列表创建复制构造函数/函数
- 如何声明模板函数,以便可以在类构造函数/函数中传递
- 在C 中,如何调用构造函数函数
- 在C++中构造模板函数时出现编译错误 C2664 和 C2440
- Rcpp:构造模板函数
- 采用nulltpr_t的构造函数:函数定义不声明参数
- 使用基于模板的构造函数构造std::函数
- 构造函数:函数不接受3个参数
- 就地构造 std::函数目标
- 将字符串构造作为函数参数传递
- C++:从模板化方法构造std::函数
- 构造std::函数的向量时出现编译器错误
- 构造<stl_hashtable>函数参数是否在
- libstdc++和libc++在用lambda构造std::函数时的不同行为
- 编译器构造-带有函数的类的c++sizeof()
- 使用 c++11 构造映射函数
- 调用构造与函数原型混淆
- 在不调用initializer_list构造函数的情况下,将不可复制、不可移动的类型构造为函数形参