gpt4 book ai didi

c++ - 实例与新实例热交换自身

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:36:27 26 4
gpt4 key购买 nike

我有一些操作...查看、编辑、 checkout 等。业务逻辑规定,如果文档已经 checkout ,则所有 View 都会变成编辑。

有没有一种简洁的 OO 方法来做这样的事情:

class Action
{
public:
Document document;
virtual void execute();
};
class View, Edit, Checkout : public Action;

View::execute()
{
if (document.isCheckedOut)
{
delete this;
this = new Edit;
this->execute();
}
/* execute view */
}

更新:你们怎么看这个:

class Action
{
public:
static int type;
Document document;
virtual void execute();
static Action* construct(int type, Document document) = 0;
private:
Action();
};
class View, Edit: public Action;

Action* View::construct(Document document)
{
if (document.isCheckedOut)
return new Edit(document);
return new View(document);
}

Action* Edit::construct(Document document)
{
return new Edit(document);
}

void onViewButton(Document document)
{
Action *action = View::construct(document);
action->execute();
delete action;
}

最佳答案

没有办法像那样重新分配“this”指针。您可以使用智能指针实现来通过添加一个间接层来执行类似的操作。

class action_ptr  
{
Action* m_Data;
public:
action_ptr(Action* value)
{
m_Data = value;
}

Action* operator->()
{
if(m_Data->isView() && m_Data->isCheckedOut())
{
delete m_Data;
m_Data = new Edit();
}
return m_Data;
}
};


// usage
action_ptr pAction(new View());
pAction->DoViewStuff();
pAction->Checkout();
pAction->OtherStuff(); // If isCheckedOut returned true, this now magically operates on an Edit instead!

这绝不是一个完整的实现,只是一个示例 - 存在内存泄漏和许多缺失的功能。

关于c++ - 实例与新实例热交换自身,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3453826/

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