【问题标题】:Convert data type a of class object (C++)转换类对象的数据类型a (C++)
【发布时间】:2018-12-05 18:06:48
【问题描述】:

我正在编写一个游戏,其中一个对象有能力变成另一个类别的对象(例如克拉克肯特 -> 超人)。我想知道实现这一点的最有效方法是什么。

我当前代码的逻辑: 我在 ClarkKent 类中创建了一个 turnInto() 函数。 turnInto 函数调用超人类的构造函数,将所有需要的信息传递给它。下一步是将超人对象的地址分配给当前的 ClarkKent 对象。

void ClarkKent::turnInto() {
    Superman sMan(getName(), getMaxHP(), getDamage());
    &(*this) = &w; // <- error here
    this->ClarkKent::~ClarkKent();
}

正如您可能已经猜到的那样,编译器给出了表达式不可赋值的错误。不知道如何找到正确的解决方案。

【问题讨论】:

  • 这是自找麻烦。保持简单。
  • 我当前代码的逻辑: -- 你不能把一个现有的对象foo,变成另一个对象bar。 foo 是 foo,bar 是 bar。你需要退后一步,想出一个更好的设计。也许是一个单一的班级,其中一个成员决定了班级拥有什么“权力”。改变“powers”成员,然后你会让克拉克肯特变成超人。
  • 不要碰这个也不要调用析构函数。
  • 游戏中有多少个超人/克拉克肯特?听起来好像你应该重新设计你的设计,也许超人和克拉克肯特是同一类的两个实例?也许你不想创建一个新的实例,但它们实际上是一样的(你见过超人和克拉克肯特在同一个房间里吗?;)
  • 听起来更像是您希望拥有一个具有克拉克或超人等角色的实体,并且您不想改变实体本身,而只是改变它的角色/能力。

标签: c++ type-conversion


【解决方案1】:

保持简单,不要对你的对象玩你不理解的把戏。

Superman ClartkKent::turnInto() {
    return {getName(), getMaxHP(), getDamage()};
}

在被调用者处:

ClartkKent some_guy{...};
auto some_other_guy = some_guy.tunInto();

或者如果你需要一些花哨的东西:

using NotBatman = std::variant<ClartkKent, Superman>;
NotBatman some_guy = ClartkKent{...};
using std::swap;
swap(some_guy, some_guy.tunInto());

IDK

【讨论】:

  • 但坦率地说,你的课程是代码味道。上次查看时,只有一个克拉克肯特和一个超人;不是一堆。
  • 谢谢你们。我想我真的需要重新设计我的代码。在这种情况下,一个简单的布尔变量似乎是一个更好的选择。
  • @GasperJ。是的。你不能改变某些东西的类型,你当然不能通过赋值来做到这一点:)
猜你喜欢
  • 2011-08-02
  • 1970-01-01
  • 1970-01-01
  • 2016-04-28
  • 2012-05-09
  • 1970-01-01
  • 2013-09-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多