0

我想定义两个类,A 和 B。A 有一个数据成员,它是 B 类对象并且在类内初始化。A 也有一个方法来检索此 B 类型数据成员中的值,并且此方法将被声明为 B 中的友元方法。这是我的代码:

class A{
public:
    int getBValue();
private:
    B b=B(1);
};

class B{
public:
    friend int A::getBValue();
    B(int i):value(i){}
private:
    int value;
};

int A::getBValue(){
    return b.value;
}

不出所料,由于 A 类定义中的未知类型 B,编译失败了。我曾尝试在源代码中交换 A 和 B 的定义,结果更糟。有没有办法解决 A 和 B 之间的交叉引用问题?

4

2 回答 2

3

B如果这是您拥有的完整代码,那么问题是编译器在编译 class 时不知道 a是什么A。解决它的一种方法是创建指向 B 的指针而不是 B 本身:

#ifndef CLASS_A
#define CLASS_A

class B;

class A{
public:
    int getBValue();
private:
    B *b;
};

#endif

溴化氢

#ifndef CLASS_B
#define CLASS_B

#include "A.h"

class B{
public:
    friend int A::getBValue();
    B(int i):value(i){}
private:
    int value;
};

#endif

A.cpp

#include "A.h"
#include "B.h"

int A::getBValue(){
    return b->value;
}
于 2013-12-25T12:17:19.303 回答
0

B用指向 a 的指针(或引用)替换类型的嵌入成员会B改变类的工作方式,并且在复制类的对象时需要格外小心A

反转定义时,不能使 class 的成员函数成为 classA的朋友B,因为声明A时的类型不完整friend。但是你可以让整个班级A成为朋友。

具有类A的嵌入式成员的类的解决方案B可能如下所示:

class A;

class B{
public:
    friend class A;
    B(int i):value(i){}
private:
    int value;
};

class A{
public:
    int getBValue();
private:
    B b=B(1);
};

int A::getBValue(){
    return b.value;
}

所做的更改:

  1. 之前声明BA。使用前向声明A
  2. 使班级 A成为 的朋友B。即使A尚未完全定义,这也有效。

使用 g++ 版本 4.7.2 编译(-std=c++11 需要B b=B(1);

无论如何,让类成员A访问类的私有成员B是可以(并且应该)几乎总是避免的事情(请参阅 Laszlo Papp 对您的帖子的评论)。

于 2013-12-25T20:14:49.720 回答