子类数据的超类设置对象
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
也可用。
我在 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
也可用。