如何访问班级成员
How to access the class member
对不起,对于不良标题...我认为解决方案可能存在于此站点上,但我找不到。
class A {
};
class B {
private:
int _b;
};
class C {
private:
A a; // a: I want to access _b in b
B b;
};
假设我有3个类,例如上面的代码,现在C
类中的对象a
希望访问对象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样式实现编译器。我认为编译器是由Lexer,Parser和Sumpls Table和其他内容制成的。所以我认为这种关系是:
class compiler {
private:
lexer l;
parser p;
symbol_table st;
...
};
和解析器和lexer需要访问符号_table,这就是为什么提出这个问题的原因。我认为这种设计类似于"我认为"的真正编译器,但似乎很难实施...任何建议都受到赞赏。
在您的示例中,A
必须是B
的朋友,而不是C
的朋友,才能让IT访问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
s。
您的代码看起来真的很困惑。我不确定您在第二件代码中要做什么。您唯一可以启用B类访问B类的地方是B类。您可以通过公开或受保护来做到这一点B类中的朋友类声明。
我个人会使用访问器功能,因为这意味着您将课程减少到班级依赖项。任何具有内部访问B类的类,是通过成为朋友或可以直接访问成员变量,因为它们是公开的,都取决于B类B的结构。
相关文章:
- 这是关于成员访问规则的正确摘要吗
- 为什么我在空指针错误(链表)中获取成员访问权限
- 成员访问是否在空指针上定义C++?
- C++ IDE 不会推断/自动完成对模板类中的 std::array 下标表达式的成员访问
- 为什么类成员数据必须是静态的才能被模板化类的模板化结构成员访问
- 为什么c++允许成员函数定义中实例的私有成员访问
- C/C++ 包含点的宏参数(成员访问运算符)
- 访问说明符(私有/公共/受保护)如何在内部工作(限制成员访问)?
- 如何将超类的受保护成员访问到其派生类. 如果已在派生类中声明了具有相同名称的函数?
- 内部类私有成员访问和封闭的友好性
- 通过 C++ 中的另一个结构成员访问结构
- 具体化 PRVALUES 成员访问的 decltype 行为不正确
- 常量表达式中的静态成员访问
- XVALUE来自类成员访问表达式
- 未经授权的私有类成员访问会产生编译时错误而不是运行时错误?
- 在 c++ 中,为什么 -> 被称为二进制中缀指针成员访问运算符?
- 如何访问模板参数的成员?“成员访问不完整的类型”
- 不明确的可变参数类成员访问
- C 受保护的成员访问
- 将typeID转换为静态成员访问(C )的命名空间