类的C ++朋友函数无法访问封装的类

时间:2019-11-27 07:03:25

标签: c++ friend

嗨,我正在尝试访问B类的A类私有成员

下面的代码显示了我发现但出现错误的方式 任何建议都将有助于实现我的目标。 预先感谢

rotting = {(i + di, j + dj) for i, j in rotting for di, dj 
in [(0,1), (1,0), (0, -1), (-1, 0)] if (i + di, j + dj) in fresh}

代码:

> main.cpp: In member function ‘void B::bfun(A*)’:
main.cpp:19:9: error: invalid use of incomplete type ‘class A’
     Aref->x = 1;
         ^~
main.cpp:11:7: note: forward declaration of ‘class A’
 class A;
       ^
main.cpp:20:11: error: ‘x’ was not declared in this scope
     cout<<x;
       ^

2 个答案:

答案 0 :(得分:2)

列出的错误与允许访问朋友无关;这是关于什么是不完整类型的实现,这归因于您如何为类声明和成员实现订购代码。将代码更改为在适当的类B::bfun声明之后A 后的顺序将解决该问题。

#include <iostream>
class A;

class B
{
private:
public:
    void bfun (A* Aref);
};

class A{
private:
    int x;
    B b_obj;
public:
    void afun();
    friend void B::bfun(A*);
};

void B::bfun(A* Aref)
{
    Aref->x = 1;
    std::cout<< Aref->x << '\n' ;
}

void A::afun()
{
    x=0;
    b_obj.bfun(this);
}

int main()
{
    A aobj;
    aobj.afun();
    return 0;
}

输出

1

See it live

答案 1 :(得分:0)

  

由于x不是B的直接成员,但是无论如何您都可以通过x访问它   A,您应该写:

void B::bfun(A* Aref)
{
    Aref->x = 1;
    std::cout<< Aref->x << '\n' ;
}