gpt4 book ai didi

c++ - 带有多态指针的类的复制构造函数问题

转载 作者:搜寻专家 更新时间:2023-10-31 00:04:16 25 4
gpt4 key购买 nike

我有两个字段的类是指向抽象类的指针。我如何编写复制构造函数来复制用两个指针指向的数据。

这是类

class OSGFMenu;
class OSGFMenuItem;
typedef void(OSGFMenu::*OSGFMenuCommand)(OSGFMenuItem*);
typedef int (OSGFMenuItem::*FNMETHOD) ( int, char* );
class OSGFMenuItem:
public OSGFDrawableComponent
{
public:
OSGFMenuItem(Game& game,OSGFMenu& menu)
:OSGFDrawableComponent(game),mMenu(menu),mActive(false)
{
}
OSGFMenuItem(const OSGFMenuItem& menuItem)
:OSGFDrawableComponent(menuItem),mMenu(menuItem.mMenu)
{
Copy(menuItem);
}
OSGFMenuItem& operator=(const OSGFMenuItem& menuItem)
{
if(&menuItem != this)
Copy(menuItem);
return *this;
}
void SetActive(bool active)
{
mActive = active;
}
void Activate()
{
SetActive(true);
}
void DeActivate()
{
SetActive(false);
}
void SetCommand(OSGFMenuCommand command)
{
mCommand = command;
}
virtual void Render()const
{
if(!mActive)
DrawIfNotNull(mDrawData);
else
if(!DrawIfNotNull(mActiveDrawData))
DrawIfNotNull(mDrawData);

}
virtual void Update(double dTime)
{
OSGFDrawableComponent* drawData =
dynamic_cast<OSGFDrawableComponent*>(mDrawData);
if(drawData)
drawData->Update(dTime);
}
void Invoke()
{
(mMenu.*mCommand)(this);
}
~OSGFMenuItem()
{
SafeDelete(mDrawData);
SafeDelete(mActiveDrawData);
}
protected:
void SetDrawData(IDrawable* drawData)
{
mDrawData = drawData;
}
void SetActiveDrawData(IDrawable* drawData)
{
mActiveDrawData = drawData;
}
private:
bool DrawIfNotNull(IDrawable* drawData)const
{
if(!drawData)return false;
drawData->Render();
return true;
}
void Copy(const OSGFMenuItem& menuItem)
{
mCommand = menuItem.mCommand;
*mDrawData = *menuItem.mDrawData;
*mActiveDrawData = *menuItem.mActiveDrawData;
mActive = menuItem.mActive;
}
OSGFMenuCommand mCommand;
OSGFMenu& mMenu;
IDrawable* mDrawData;
IDrawable* mActiveDrawData;
bool mActive;
};

最佳答案

问题是多态指针指向的对象是否需要复制。如果是这种情况,最好的选择是在包含的类层次结构中提供一个 clone() 虚拟方法,该方法将创建对象的拷贝。

struct base {
virtual base* clone() = 0;
virtual void foo() = 0;
};
struct derived : base {
virtual derived* clone() { return new derived(*this); }
virtual foo();
};
class container {
base * ptr;
public:
container( base * p ) : ptr(p) {}
container( container const & lhs ) : ptr( lhs.ptr->clone() )
{}
};

关于c++ - 带有多态指针的类的复制构造函数问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4507565/

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