我使用的是第三方库,它返回一个新创建的对象作为原始指针。我将它存储在一个unique_ptr
中,并使用自定义析构函数通过调用库的自定义析构函数来正确地销毁对象。然而,这个对象将被同一个父类拥有的其他对象使用。我想知道将第三方对象作为引用传递到其他对象中是否是一个可接受的设计。由于它们有相同的父对象,第三方对象的生存时间可以超过其他对象,只要它在其他对象之前声明,其他对象将保持它作为一个引用。这个想法是否有任何问题,或者更好的方法?下面是一个例子:
class ChildClass
{
public:
ChildClass (ThirdPartyClass& third) : thridparty (third)
{
// do sth...
}
private:
ThirdPartyClass& thirdparty;
};
class ParentClass
{
public:
void addChild()
{
children.emplace_back (*thirdParty);
}
private:
std::unique_ptr<ThirdPartyClass> thirdParty;
std::vector<ChildClass> children;
};
1条答案
按热度按时间vhmi4jdf1#
第三方对象的生存期可以超过其他对象,只要它在将其作为引用保存的其他对象之前声明即可
是的,类成员字段按照它们在类主体中声明的顺序构造,并按照相反的顺序销毁。
对于用户定义的或隐式定义的析构函数,在执行析构函数的主体并析构主体内分配的任何自动对象之后,编译器以声明的相反顺序调用类的所有非静态不变数据成员的析构函数,然后它以构造的相反顺序调用所有直接非虚基类的析构函数(这反过来调用它们的成员和它们的基类的析构函数,等等),然后,如果这个对象是最派生的类,它调用所有虚基类的析构函数。
因此,您的设计是有效的,在某些情况下(例如,您总是希望传递一个有效的对象,而不是
nullptr
到ChildClass
)建议使用。但是,请确保您的
std::unique_ptr<3rdPartyClass> thirdParty;
尽快指向由您的第三方库返回的对象,最好是在ParentClass
构造函数中,否则您将无法安全地调用addChild
,因为您将面临nullptr
解引用的风险,这是UB。还有:
3rdPartyClass
不是有效的C++ IDChildClass(*thirdParty)