Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 访问与父类为好友的类的私有成员_C++_Class_Inheritance - Fatal编程技术网

C++ 访问与父类为好友的类的私有成员

C++ 访问与父类为好友的类的私有成员,c++,class,inheritance,C++,Class,Inheritance,考虑以下几点 class Base; class A { int x; friend class Base; }; class Base { protected: A a_obj; public: Base(){ a_obj.x; // works } }; class Derived : public Base { public: Derived(){ a_obj.x; // not accessible

考虑以下几点

class Base;

class A {
  int x;

  friend class Base;
};

class Base {
  protected:
    A a_obj;

  public:
    Base(){
      a_obj.x; // works
    }
};

class Derived : public Base {
  public:
    Derived(){
      a_obj.x; // not accessible
    }
};

我可以公开x的getter和setter,或者公开对象,但这不是首选。假设存在一组派生类,在
class a
中添加
friend class-derived
会使代码过于冗长。有没有办法说“A是班里的朋友,还是孩子们的朋友”?< P > >总之,C++规则是友谊不是可继承的。 为了实现您所需要的,您可以在基类中添加静态保护方法作为访问器。 但是,如果您真的需要使它不带访问器或获取器 您可以使用reinterpret_cast制作,但这是一种黑客行为,不推荐使用

有没有一种方式可以说“a是班集体及其所有孩子的朋友”

没有

您可以做的是使该基成为朋友(就像您所做的那样),并在该基中编写一个受保护的访问器,孩子们可以使用该访问器访问私有成员

有没有一种方式可以说“a是班集体及其所有孩子的朋友”

没有

你需要修正你的设计。不应授予类对从基类派生的所有类型的成员的访问权限。根据您的代码,我认为您需要在另一个类的构造函数中修改一个类的私有成员

一种可能的解决方案是使用参数化构造函数。您可以从类
Base
Derived
调用类
A
的构造函数

class Base;

class A {
  int x;

public:
  A(int in): x(in)
  {

  }

};

class Base {
protected:
    A a_obj;

public:
    Base(int in): A(in)
    {

    }
};

class Derived : public Base {
public:
    Derived(): Base(5)
    {

    }
};

不,没有办法写这样的朋友声明。朋友仅适用于所述的类。另一方面,我认为您需要重新考虑您的设计,而不是使用直接名词来分类翻译,而是考虑所需对象的行为。因此,例如,不要试图直接获取
x
的值,而是要求
a_obj
对象执行一个操作并从该操作中获得一个结果。您的设计需要修复。不应授予类对从一个基派生的所有类型的成员的访问权限。这些成员应该是(受保护的)委员会成员base@Someprogrammerdude这就是我要做的。在这个例子中,很明显只是“重新考虑设计”,但这只是我正在研究的一个提炼版本。在我的示例中,按照您的建议制作getter和setter是不明智的。有没有一种非冗长的替代frienship的方法可以做到这一点?不,我不是说简单的getter或setter,这就像使用
friend
或将所有
成员公开一样。相反,我的意思是调用
a_obj
的成员函数来执行一个操作,进行一些计算或其他类似的操作,然后返回结果。不要把类看作是简单的容器或成员分组,而要把它们看作某种行为。例如,一个
类有行为
吠叫
(除其他外),但你无法接触到狗的内部“成员”(比如它有多满)。@Someprogrammerdude在我的项目中,一个更好的比喻是一个满是外科医生(派生类)的房间,他们在治疗一个昏迷病人(基本类)。这真的没有多大意义(为什么它是派生的?)。我现在意识到,最好是将我的类变成一个数据结构。我希望有一个快速的语法修复,而不是一个完整的重组我的程序。哦,好吧,你可以生活和学习,正如我在回答中所说的,你可以在基类中使用静态保护方法来访问基类的私有数据。但是,如果将基类的静态保护方法看作是吸引子,那么在重新解释的技巧旁边就没有办法了。cast@Trad_NotSuitedPC您可以使用公共成员作为替代。或者在中添加公共setter和getterA@Trad_NotSuitedPC无需使用
重新解释演员的“技巧”
“作品”。
reinterpret\u cast
有一些有效的用法,还有一些“技巧”,即编译器允许您做的事情,但这些事情在形式上是毫无意义的。在任何实际代码中都不应使用后者。@Trad_NotSuitedPC那么,对于重新解释强制转换,您需要创建另一个具有对感兴趣的数据成员的公共访问权限的类A1,并且在任何其他意义上与类A相同,然后重新解释指向A1的指向指针的强制转换指针,如果指向A1的指针是非nullptr,则使用数据。但是,再次强调,使用c++@Trad_NotSuitedPC除了完全不可移植之外,这是不推荐的方式,它也是迂回和愚蠢的。请编写好的代码,不需要“技巧”,这不是我要求的。这仍然使_obj在派生类中不可访问。为此,您可以使用setter和getter函数。我明确要求不提供解决方案