gpt4 book ai didi

c++ - 在没有堆分配的情况下使用虚拟方法实例化类

转载 作者:太空宇宙 更新时间:2023-11-04 13:12:53 24 4
gpt4 key购买 nike

class Base
{
public:
virtual ~Base() {}
virtual void Foo() = 0;
};

class FirstDerived: public Base
{
public:

void Foo() { cout << "FirstDerived" << endl; }
};

class SecondDerived: public Base
{
public:

void Foo() { cout << "SecondDerived" << endl; }
};

union PreallocatedStorage
{
PreallocatedStorage() {}
~PreallocatedStorage() {}

FirstDerived First;
SecondDerived Second;
};

class ContainingObject
{
public:

Base* GetObject()
{
if (!m_ptr)
{
// TODO: Make runtime decision on which implementation to instantiate.
m_ptr = new(&m_storage) SecondDerived();
}

return m_ptr;
}

~ContainingObject()
{
if (m_ptr)
{
m_ptr->~Base();
}
}

private:

PreallocatedStorage m_storage;
Base* m_ptr = nullptr;
};

int main()
{
auto object = make_unique<ContainingObject>();

// ...
// Later, at a point where I don't want to make more heap allocations...
// ...
auto baseObject = object->GetObject();
baseObject->Foo();

return 0;
}

我想在这里实现的目标:

  • 我需要实例化一个具有虚拟方法的类。
  • 在我确切知道要实例化哪个派生类的时间点,我无法进行进一步的堆分配(这只是出于好奇,所以确切的原因不相关)。
  • 因此,我想以某种方式预先分配足够的空间来容纳任何可能的实现,然后再决定要在其中实例化哪个类。

上述代码中是否存在任何不符合标准/未定义的行为?

最佳答案

代码是正确的。请参阅关于该问题的评论以获得一些有趣的见解,特别是 std::aligned_union 的使用,它可以用作上述 PreallocatedStorage union 的通用替代品。

关于c++ - 在没有堆分配的情况下使用虚拟方法实例化类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38885881/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com