对不好的标题抱歉...我认为该网站上可能存在解决方案,但我找不到它。
class A {
};
class B {
private:
int _b;
};
class C {
private:
A a; // a: I want to access _b in b
B b;
};
假设我有3个类,如上面的代码,现在类a
中的对象C
想要访问对象_b
中的成员b
。有没有办法实现它?
我尝试使用朋友,我想知道我是否以正确的方式使用它,因为它使代码非常复杂,如下所示:
class B {
private:
int _b;
public:
B() : _b(5) {}
int get_b() {
return _b;
}
};
class A {
public:
int get_a(B& b) {
cout << b.get_b();
}
};
class C {
private:
friend class A;
A a;
B b;
public:
A& get_A() {
return a;
}
B& get_B() {
return b;
}
};
int main() {
C c;
c.get_A().get_a(c.get_B());
}
提前谢谢。
修改
对于上面令人困惑的代码感到抱歉,实际上我想使用OO样式实现编译器。我认为编译器是由词法分析器,解析器和符号表等组成的。所以我认为这种关系是:
class compiler {
private:
lexer l;
parser p;
symbol_table st;
...
};
解析器和词法分析器需要访问symbol_table,这就是提出这个问题的原因。我认为这个设计类似于“在我看来”的真实编译器,但它似乎很难实现......任何建议都表示赞赏。
答案 0 :(得分:1)
在您的示例中,A
必须是B
的朋友而不是C
的朋友才能让其访问B
的成员:
class A;
class B {
friend class A;
//...
};
// ....
换句话说,它应该是这样的:
#include<iostream>
using namespace std;
class A;
class B {
friend class A;
private:
int _b;
public:
B() : _b(5) {}
};
class A {
public:
int get_a(B& b) {
cout << b._b;
}
};
class C {
private:
A a;
B b;
public:
A& get_A() {
return a;
}
B& get_B() {
return b;
}
};
int main() {
C c;
c.get_A().get_a(c.get_B());
}
话虽这么说,你应该重新考虑你的设计,以避免你的课程之间如此强烈的依赖,并摆脱friend
。
答案 1 :(得分:0)
您的代码看起来很混乱。我不确定你在第二段代码中想要做什么。您可以启用对B类成员的访问权限的唯一地方是B类。您可以通过将这些成员设为公共或受保护,为成员添加访问者函数或通过添加将另一个类设置为B类的朋友类来实现此目的。 B类中的朋友类声明。
就个人而言,我会使用访问器函数,因为这意味着您正在减少类到类的依赖关系。任何具有B类内部访问权限的类,通过成为朋友或直接访问成员变量因为它们是公共的,都依赖于B类的结构。