我在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,因此无法编译。如果重要,这两个类在单独的头文件中定义。我想一种描述这个问题的方法是“鸡和蛋”问题,首先需要另一个问题。
我有一种感觉,这必须是“我没有正确设计我的课程,需要重新思考我是如何做到这一点的”,但我无法弄清楚如何让它发挥作用。
答案 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
也可用。