【问题标题】:How can I get private information from a class pointed to by a private pointer inside another class?如何从另一个类中的私有指针指向的类中获取私有信息?
【发布时间】:2013-05-13 08:52:19
【问题描述】:

我有一个类Player,其成员变量Creature *character 将指向Elf : public Creature 派生类。

我希望能够声明一个Player 对象,然后让它的一个成员指向Elf 并获取信息。

我知道数据成员应该是私有的,但这是一种特殊情况,或者我如何从main 函数中的Elf 成员获取信息?

void Player::set_character(Creature &c)
{
  character = &c;
}

...
Player me;
Elf me_elf;
me.set_character(me_elf);

【问题讨论】:

  • 看起来不错。你能发布一个重现问题的最小示例吗?
  • 您发布的代码看起来是正确的,我怀疑它的其他部分失败了。运行时错误到底是什么,请您提供sscce.org
  • 我现在可能以某种方式让它工作了,我希望我知道我刚刚做了什么。很抱歉,现在我只需要知道如何在指针为私有时访问Elf,假设我想保持私有。
  • 好的,所以您不应该通过更改标题并提出不同的问题来真正“回收问题”。您的问题的简单答案是“不要将其设为私有”、“使用访问器函数(setters/getters)”或“使其成为朋友”。
  • @MatsPetersson 抱歉,如果这让您感到困扰,我坚信回收利用 :)

标签: c++ pointers derived-class


【解决方案1】:

如果您有“有”关系,则必须使用包装函数来访问数据。

如果您有“是”关系,则如果数据受到“保护”,您将能够访问数据。没有任何其他麻烦。具有保护允许派生类访问数据。

【讨论】:

  • 没错,我确信 protected 会起作用,但这违背了 private 的目的。
  • protected 的全部要点是它允许相关的类,但不允许不相关的类访问成员。这完全取决于您想要实现的目标。 publicprotectedprivate 之间的区别在于不同类型的设计需要不同级别的访问权限。 [这就是为什么我们需要一个更完整的例子和一个正确表述的问题——当涉及到真正物质的东西时,回收是好的——计算机中的比特和字节无论如何都会被回收]
  • @juanchopanza 好吧,因为它没有“是”关系对吗?
  • @Leonardo 没错。另外,无论如何您都需要以某种方式将信息传递给main,因此您仍然必须从Player 接口传递它。
  • @Leonardo 您可以在播放器界面中创建函数,并且通过动态绑定,您可以在运行时为该生物调用正确的显示函数。
【解决方案2】:

你可以通过Player的公共方法来做到这一点:

class Creature
{
 public:
  virtual void hello() const = 0;
};

class Player{
 public:
  void hello() const { charatcer->hello(); }
  // other methods as before
 private:
  Creature* character;
};

【讨论】:

  • 所以这段代码有效,但只有当我删除 = 0; 部分时。否则,它会给出错误“无法分配抽象类型'Creature'的对象”,因为虚函数在'Creature'中是纯的:然后它转到最后带有= 0;的函数。这发生在派生类中的构造函数上,例如Elf : public Creature。为什么在这里使用= 0;
  • @Leonardo 使void hello() 成为Creature 中的纯虚方法。我假设Creature 是一个基类,一切都将在派生类型中实现。如果要实例化Creature,请删除=0 并添加一个实现。
猜你喜欢
  • 2018-10-29
  • 1970-01-01
  • 2010-12-14
  • 1970-01-01
  • 1970-01-01
  • 2020-11-08
  • 1970-01-01
  • 2020-10-13
  • 2015-06-19
相关资源
最近更新 更多