C++ 工会地址上的新职位
我想在课堂上使用新的位置。 为了使缓冲区适合多个不同的类,我创建了一个union成员作为缓冲区。 定义如下的类C++ 工会地址上的新职位,c++,memory-management,polymorphism,new-operator,C++,Memory Management,Polymorphism,New Operator,我想在课堂上使用新的位置。 为了使缓冲区适合多个不同的类,我创建了一个union成员作为缓冲区。 定义如下的类 class MyBase { public: virtual void vFunc0(){} virtual void vFunc1(){} protected: int memberA; int memberB; }; class SubClassA:public MyBase { virtual void vFunc0()override{}
class MyBase
{
public:
virtual void vFunc0(){}
virtual void vFunc1(){}
protected:
int memberA;
int memberB;
};
class SubClassA:public MyBase
{
virtual void vFunc0()override{}
virtual void vFunc1()override{}
};
class SubClassB:public MyBase
{
int subMemberB;
};
我定义了一个warp类
class WarpClass
{
public:
WarpClass( EMySubType subType )
{
memset(&m_Buffer,0,sizeof(m_Buffer));
void* pBuffer = &m_Buffer;
switch (subType)
{
case ESubA:
::new (pBuffer) SubClassA();
break;
case ESubB:
::new (pBuffer) SubClassB();
break;
default:
::new (pBuffer) MyBase();
break;
}
}
private:
union
{
char _b0[sizeof(MyBase)];
char _b1[sizeof(SubClassA)];
char _b2[sizeof(SubClassB)];
}m_Buffer;
};
因为我工作的项目没有memeory Manager,所以我想创建一个静态数组,它可以适合一个系列类和子类,我想用这种方法来扭曲它们
那么这样会不会造成问题呢?或者有没有更好的方法来定义新位置的安全缓冲区?另外,堆栈溢出不是代码检查的好地方。所以问题应该是具体的技术问题,并有一个客观的答案(而不是“好吧,你可以做X、Y或Z,这取决于你更喜欢什么”)。可能更适合这个问题。std::aligned\U union如何?en.cppreference.com/w/cpp/types/aligned\u union看起来像是在试图重新发明轮子。使用c++14,您可以享受std::variant。它提供了您正在寻找的功能。在较旧的平台上,您可以尝试boost::variant.@Red.Wave variant是17而不是14,这会增加更多内存开销。如果您不需要内存提供的附加功能,那么这并不理想。