我希望有一个类包含由构造函数初始化的std::unique_ptr
,然后在类的其他地方使用。
所以我有一个类似std::unique_ptr
的类:
class ObjectA
{
public:
ObjectA();
~ObjectA();
void SomeFunction();
private:
std::unique_ptr<ObjectB> myPointer;
}
然后在类的源文件中myPointer
在构造函数中设置并在SomeFunction()
中使用。
ObjectA::ObjectA()
{
ObjectC objectC;
myPointer = std::move(std::unique_ptr<ObjectB>(objectC.getPointer())); //setup pointer
}
ObjectA::~ObjectA() {}
void ObjectA::SomeFunction()
{
//use myPointer here
}
问题是,我无法在myPointer
中使用SomeFunction()
,这就是原因。
显然必须在堆上分配myPointer
以确保在构造函数执行完毕后不会销毁它。假设ObjectC
及其函数来自外部库。当我调用ObjectC::getPointer()
时,返回的指针可能在堆栈上分配给堆。现在我假设是这种情况,因为在构造函数执行完毕后我得到了一个错误。
基本上我依靠一个函数来给我一个指针,然后我可以在其他地方使用它。但是,该函数在堆栈而不是堆上分配对象。
有没有一些特殊的方法来解决这个问题,可能有一个双指针?或者每次我想在每个执行块中使用指针时,我都必须调用ObjectC::getPointer()
吗?如果ObjectA
中有很多依赖于myPointer
的函数,那么每个函数调用ObjectC::getPointer()
将是多余的,但我不知道是否有更好的方法来解决这个问题,并且我觉得一个函数(ObjectC::getPointer()
)不应该强迫我进入冗余。
答案 0 :(得分:1)
当你致电ObjectC::getPointer()
时,你不只是得到“一个”指针。该函数必须指定哪些操作对指针有效,特别是如何处理它。
通常,这将是delete
,但它也可以是例如fclose
。 objectC
。你必须阅读文档。如果返回指针的生命周期与objectC
的生命周期匹配,则myPointer
的生命周期应与myPointer
匹配。所以它可能应该是一个成员,这反过来意味着private: ObjectB& getB() { return *myObjectC.GetPointer(); }
可能是多余的。你可以替换{{1}}