0

我想让一个类包含一个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
}

但问题是我不能使用myPointerin SomeFunction(),这就是原因。

显然myPointer必须在堆上分配以确保在构造函数执行完成时它不会被破坏。假设ObjectC它的功能来自外部库。当我调用ObjectC::getPointer()返回的指针时,它可能分配在与堆相对的堆栈上。现在我假设是这种情况,因为在构造函数完成执行后我得到一个错误。

基本上我依靠一个函数给我一个指针,然后我可以在其他地方使用它。但是,该函数在堆栈而不是堆上分配对象。

是否有一些特殊的方法可以解决这个问题,也许是双指针?还是ObjectC::getPointer()每次我想在每个执行块内使用指针时都必须调用?如果我有很多ObjectA依赖的函数,myPointer那么调用ObjectC::getPointer()每个函数将是多余的,但我不知道是否有更好的方法来解决这个问题,我觉得函数 ( ObjectC::getPointer()) 不应该强迫我进入那种冗余.

4

1 回答 1

1

当你打电话时ObjectC::getPointer(),你不只是得到“a”指针。该函数必须指定对指针有效的操作,特别是应该如何处理它。

通常是delete,但也可能是fclose。您必须阅读文档。如果返回指针的生命周期与 的生命周期匹配objectC,则 的生命周期objectC应该匹配myPointer。所以它可能应该是一个成员,这反过来意味着这myPointer可能是多余的。你可以代替private: ObjectB& getB() { return *myObjectC.GetPointer(); }

于 2013-06-21T11:17:56.080 回答