如何访问班级成员

How to access the class member

本文关键字:成员 访问 何访问      更新时间:2023-10-16

对不起,对于不良标题...我认为解决方案可能存在于此站点上,但我找不到。

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());
}

话虽如此,您可能应该重新考虑您的设计,以避免班级之间如此强烈的依赖,并摆脱friends。

您的代码看起来真的很困惑。我不确定您在第二件代码中要做什么。您唯一可以启用B类访问B类的地方是B类。您可以通过公开或受保护来做到这一点B类中的朋友类声明。

我个人会使用访问器功能,因为这意味着您将课程减少到班级依赖项。任何具有内部访问B类的类,是通过成为朋友或可以直接访问成员变量,因为它们是公开的,都取决于B类B的结构。