【问题标题】:i can't get a friend member function to actually be able to access private members [closed]我无法获得朋友成员功能来实际访问私人成员[关闭]
【发布时间】:2019-08-19 17:40:38
【问题描述】:

我正在阅读关于 c++ 中的友谊(我以为我真的理解它),但是当我去源代码在某些课程中尝试它时,我就是无法让它继续下去。我希望能够理解为什么它不起作用。

我已经在这个网站和其他一些网站上进行了一些研究,实际上我发现了一些有效的代码,但我真的看不出我试图实现的逻辑与它有何不同:@987654321 @

struct B;

struct A{
    A(int _a): a(_a){}
    friend void B::showA(A&);
    private:
    int a;
};

struct B{
    void showA(A&);
};

void B::showA(A& _param){
    cout << _param.a;
}

我希望函数 void B::showA(A&) 能够访问 A 类的私有成员“a”,但是当我尝试编译我的代码时会产生以下错误:

friendshipninheritance.cpp(10):错误 C2027:使用未定义类型“B”

friendshipninheritance.cpp(5):注意:参见“B”的声明

friendshipninheritance.cpp(21): 错误 C2248: 'A::a': 无法访问私有 在“A”类中声明的成员

friendshipninheritance.cpp(12): 注意:见 'A::a' 的声明

friendshipninheritance.cpp(7):注意:参见“A”的声明

【问题讨论】:

  • "error C2027: use of undefined type 'B'" B。它需要在之前定义 A.
  • 考虑阅读good C++ book,而不是尝试通过访问随机网站来学习 C++,后者是学习像 C++ 这样复杂的语言的一种非常低效和低效的方式。
  • 这个问题的标题相当具有误导性。您的问题只是您在声明 那是什么 之前使用了某些东西 (B::showA)

标签: c++ class definition friend


【解决方案1】:

只需重新排序声明。

struct A;

struct B{
    void showA(A&);
};


struct A{
    A(int _a): a(_a){}
    friend void B::showA(A&);
    private:
    int a;
};

void B::showA(A& _param){
    cout << _param.a;
}

结构 A 必须知道结构 B 的成员的名称。也就是说,B 的定义必须在 A 的定义之前,以便知道名称 showA

【讨论】:

    【解决方案2】:

    根据经验,您应该从头开始解决编译器错误。通常,一个错误会产生更多错误,在这种情况下也没有什么不同。

    您的friend 声明被忽略,因为编译器还不知道B 是什么以及它是否有任何名为showA 的函数。这会导致所有进一步的错误。

    您可以更改声明的顺序以使其生效:

    struct A;
    
    struct B{
        void showA(A&);
    };
    
    struct A{
        A(int _a): a(_a){}
        friend void B::showA(A&);
        private:
        int a;
    };
    
    void B::showA(A& _param){
        cout << _param.a;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-05
      • 1970-01-01
      • 2014-08-21
      • 2015-08-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多