在C++中,我想像这样定义一个对象作为类的成员:
Object myObject;
但是这样做会尝试调用它的无参数构造函数,它不存在。但是我需要在包含类完成一些初始化之后调用构造函数。类似于这样。
class Program
{
public:
Object myObject; //Should not try to call the constructor or do any initializing
Program()
{
...
//Now call the constructor
myObject = Object(...);
}
}
8条答案
按热度按时间jutyujz01#
存储指向
Object
的指针,而不是实际的Object
因此:
不要忘记在析构函数中
delete
它。现代C++可以帮助你,因为你可以使用auto_ptr shared_ptr而不是原始内存指针。9rbhqvlz2#
其他人已经发布了使用原始指针的解决方案,但智能指针将是一个更好的主意:
这避免了添加析构函数的需要,并且隐式地禁止复制(除非您编写自己的
operator=
和MyClass(const MyClass &)
)。如果你想避免单独的堆分配,可以使用boost的
aligned_storage
和placement new。或者,如果
Object
是可复制的(或可移动的),则可以使用boost::optional
:uplii1fm3#
你可以通过这个技巧完全控制对象的构造和析构:
应用于您的样品:
这种解决方案的最大优点是,它不需要任何额外的分配,对象内存分配正常,但您可以控制何时调用构造函数。
Another sample link
3duebb1j4#
如果你可以访问boost,这里有一个方便的对象,叫做
boost::optional<>
--这避免了动态分配的需要,例如:inb24sb25#
你也可以重写你的代码来使用构造函数初始化列表,如果你可以把其他的初始化移到构造函数中:
你需要注意的是,遵循这样的模式将导致你在构造函数中做很多工作,这反过来又导致需要掌握异常处理和安全性(因为从构造函数返回错误的规范方法是抛出异常)。
yhqotfr86#
你可以使用一个指针(或智能指针)来实现。如果你不使用智能指针,确保你的代码在对象被删除时释放内存。如果你使用智能指针,不用担心它。
vu8f3i0k7#
匿名联合和放置new的技巧
这与Jenkas的回答相似,但更直接
然而,问题是现在你必须显式定义所有特殊成员函数,因为编译器会在默认情况下删除它们。
xjreopfe8#
您可以通过使用
union
联合的成员未初始化
尝试创建一个联盟
创建一个
uninitialized_value_of
的对象,并将其引用到它的成员value
示例