超类设置子类数据的对象

时间:2016-09-15 15:03:06

标签: c++ class inheritance friend

我在C ++中有一个基类,它有一些受保护的成员变量(尽管在这种情况下,我认为它不受保护与私有相关)。

我有一个派生类派生自这个基类。在其中,有一个公共函数,它创建基类的对象并返回该对象。但是,在该函数中,我需要能够将受保护的成员变量设置为特殊状态。

示例:

class Base
{
protected:
  int b_value;
};

class Derived : public Base
{
public:
  Base createBase()
  {
    Base b;
    b.b_value = 10;
    return b;
  }
};

我特别希望派生类能够受保护的成员变量。我不想在基类中使用公共访问器方法。

我最初试图通过使派生类的createBase()函数成为Base类的朋友来解决这个问题。像这样:

class Base
{
protected:
  int b_value;
  friend Base Derived::createBase();
};

class Derived : public Base
{
public:
  Base createBase()
  {
    Base b;
    b.b_value = 10;
    return b;
  }
};

正如您所看到的,由于尚未定义Derived,因此无法编译。如果重要,这两个类在单独的头文件中定义。我想一种描述这个问题的方法是“鸡和蛋”问题,首先需要另一个问题。

我有一种感觉,这必须是“我没有正确设计我的课程,需要重新思考我是如何做到这一点的”,但我无法弄清楚如何让它发挥作用。

1 个答案:

答案 0 :(得分:2)

您可以转发声明Derived,然后在Base中将其设为好友:

class Derived;
class Base
{
    friend class Derived;
protected:
  int b_value;
};

class Derived : public Base
{
public:
  Base createBase()
  {
    Base b;
    b.b_value = 10;
    return b;
  }
};

然而,正如您已经说过的那样,这个设计对我来说似乎存在严重缺陷,您应该在createBase()类中使Base成为静态公共方法,并为b_value创建一个setter或构造函数设定它。

请记住,现在createBase()内,this->b_value也可用。