【问题标题】:Friend class keyword not working properly in C++Friend 类关键字在 C++ 中无法正常工作
【发布时间】:2021-05-10 13:03:50
【问题描述】:
class base_A {
public:
    int a = 10;
    int b = 1;
    int sum();
    friend class base_B;
};
class base_B {
public:
    int mul();
};
class derive :public base_A,public base_B{
public:
    void sum_d();
};
int base_A::sum() {
    int s = a + b;
    return s;
}
int base_B::mul() {
    int m = a * b;
    return m;
}
void derive::sum_d() {
    cout << "Sum " << base_A::sum() << "\n";
};
int main()
{
    derive dobj;
    dobj.sum_d();
    dobj.mul();
}

尽管我提到了 base_B 类作为 base_A 的朋友类。它无法访问类 base_A 中的变量。 我越来越 错误 C2065 'a':未声明的标识符公共继承 任何人都可以帮助我,因为我是 C++ 新手

【问题讨论】:

  • "无法访问类 base_A 中的变量" 但是在base_B::mul 中,您没有尝试访问属于base_A 的变量。您尝试访问不存在的变量 ab
  • public 数据不需要friend。您需要完全指定从何处获取数据。组合会更合适。
  • 不要混淆类和对象。让班级成为朋友可以让您访问实例成员,但没有实例,您将无法访问任何成员
  • @AlgirdasPreidžius :那么我应该怎么做才能访问另一个类中的对象??
  • @user01 正如在其他 cmets 中已经解释的那样:您将实例(对象(与类)混淆。除非您在谈论 static 变量 - 您不是在谈论“类变量”的访问",而是关于访问实例变量。为此,您需要一个类实例。即便如此,在您使用 a * b 时,ab 都没有限定符,说明他们应该来自与base_B不同的范围。

标签: c++ c++11


【解决方案1】:

这个函数定义

int base_B::mul() {
    int m = a * b;
    return m;
}

无效,因为类 base_b 没有数据成员 a 和 b。

你的意思好像是这样的

#include <iostream>

class base_A {
private:
    int a = 10;
    int b = 1;
public:    
    int sum() const;
    friend class base_B;
};

class base_B {
public:
    int mul( const base_A & ) const;
};

class derive :public base_A,public base_B{
public:
    void sum_d() const;
};

int base_A::sum() const {
    int s = a + b;
    return s;
}

int base_B::mul( const base_A &a ) const {
    int m = a.a * a.b;
    return m;
}
void derive::sum_d() const {
    std::cout << "Sum " << base_A::sum() << "\n";
};

int main()
{
    derive dobj;
    dobj.sum_d();
    std::cout << "Mul " << dobj.mul( static_cast<const base_A &>( dobj ) ) << '\n';
}

程序输出是

Sum 11
Mul 10

【讨论】:

  • :但是使用friend关键字的目的是为了访问他们对吗?/
  • @user01 是的,但base_B 没有可使用的base_A 对象。它应该如何知道您要使用哪个base_A 实例?如果它是int base_B::mul(const base_A&amp; a) { return a.a * a.b; }base_B 继承base_A。它会起作用的。
  • @user01 您需要将 base_A 类型的对象提供给 base_B 类的成员可以访问的数据成员。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-17
  • 1970-01-01
  • 1970-01-01
  • 2013-08-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多