子类数据的超类设置对象

Superclass Setting Object of Subclass Data

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

我有一个派生的 class 派生自这个基础 class。在其中,有一个 public 函数创建基 class 和 returns 该对象的对象。但是,在该函数中,我需要能够将受保护的成员变量设置为特殊状态。

示例:

class Base
{
protected:
  int b_value;
};

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

我特别希望派生的 class 能够访问受保护的成员变量。我不想在基础 class.

中使用 public 访问器方法

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

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,因此无法编译。如果重要的话,这两个 class 是在单独的头文件中定义的。我想描述这个问题的一种方式是 "chicken and egg" 一个先需要另一个的问题。

我觉得这一定是 "I am not designing my classes correctly and need to rethink how I am doing this" 但我不知道如何让它工作。

你可以转发声明 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;
  }
};

然而,正如您已经说过的那样,这种设计对我来说似乎存在严重缺陷,您可能应该在 Base class 中将 createBase() 设为静态 public 方法,并有一个setter 用于 b_value 或设置它的构造函数。

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