【问题标题】:How to access the class member如何访问班级成员
【发布时间】:2017-05-01 07:27:57
【问题描述】:

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

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。有什么方法可以实现吗?

我尝试使用friend,我想知道我没有以正确的方式使用它,因为它使代码非常复杂,像这样:

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;
...
};

而解析器和词法分析器需要访问符号表,这就是提出这个问题的原因。我认为这种设计“在我看来”类似于真正的编译器,但似乎很难实现......任何建议都值得赞赏。

【问题讨论】:

  • main()的内容是伪装成OOP的过程编码。将使用其属性的代码放入每个类中。 C 中的代码应该将一些工作委托给它的 ab 属性,而不是深入研究它们的结构。 main() 的代码应该是这样的:int main() { C c; c.doSomething(); }
  • 是的,这是我想避免的部分...@axiac
  • Echoing @axiac, friend 应该用在 OOP 惨遭失败的场景中,不是,这样类就可以忽略接口并深入研究它们的结构

标签: c++ oop friend


【解决方案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());
}

话虽如此,您可能应该重新考虑您的设计以避免类之间存在如此强的依赖关系并摆脱friends。

【讨论】:

  • 你好,我已经编辑了我的问题,你对设计有什么建议吗,我真的很坚持。谢谢!
【解决方案2】:

您的代码看起来很混乱。我不确定您在第二段代码中要做什么。您可以启用对 B 类成员的访问权限的唯一位置是在 B 类中。您可以通过使这些成员成为公共或受保护的成员、为成员添加访问器函数或通过添加将另一个类设置为 B 类的朋友类来做到这一点B 类中的友元类声明。

我个人会使用访问器函数,因为这意味着您正在减少类到类的依赖关系。任何对 B 类具有内部访问权限的类,通过成为朋友或直接访问成员变量(因为它们是公共的),都依赖于 B 类的结构。

【讨论】:

    猜你喜欢
    • 2011-08-09
    • 2022-01-10
    • 2020-09-11
    • 1970-01-01
    • 2015-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多