如何访问类成员

时间:2017-05-01 07:27:57

标签: c++ oop friend

对不好的标题抱歉...我认为该网站上可能存在解决方案,但我找不到它。

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,这就是提出这个问题的原因。我认为这个设计类似于“在我看来”的真实编译器,但它似乎很难实现......任何建议都表示赞赏。

2 个答案:

答案 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类的结构。