0

我正在做一个小程序,只是为了玩类。我做了两个类,a和b。

我希望能够在 b 中访问 a,反之亦然。这是我到目前为止得到的:

#ifndef A_HH_
#define A_HH_

#include <string>

class b;

class a
{
private:
    string aString;
    b* bClass;
public:
    a(){aString = "A";}
    string getString(){return aString;}
    string getBString(){return bClass->bString;}
};


#endif /* A_HH_ */

和 b:

#ifndef B_HH_
#define B_HH_

#include <string>

class a;

class b
{
private:
    string bString;
    a* aClass;
public:
    b(){bString = "B";}
    string getString(){return bString;}
};


#endif /* B_HH_ */

我希望能够访问指针而不仅仅是存储它。我怎样才能做到这一点?

4

3 回答 3

1

问题是您在 class 中使用bClass指针a,为此您需要 class 的定义b。在这种情况下,这可以通过简单地包含b.hhin来解决a.hh。这个简单的解决方案将起作用,因为您只a在 class 中声明了一个指针(但不访问它)b。前向声明是不够的,因为它实际上并没有告诉编译器除了类b存在之外的任何内容。

哦,您需要将bClass->bStringin更改a::getBStringbClass->getString(),就像b::bString私有一样。当然,创建一个实际实例b并将其分配给bClass.

于 2013-10-29T12:28:29.340 回答
0

简而言之,要访问结构或类的成员,需要满足两个条件:

  1. 访问元素(类、方法……)必须对被引用成员具有访问“权限”
  2. 结构/类的定义必须可用。

要克服 1. 您可以将成员设为 public,或者将访问类或方法声明为friend,或者更好地使用 getter 方法。要克服 2.,您需要包含引用类的标头。

于 2013-10-29T12:36:37.957 回答
0

您可能会使用模板:

为一个:

#ifndef A_HH_
#define A_HH_

#include <string>
#include "b.h"


class a
{
private:
    string aString;
    b* bClass;
public:
    a()
    {
        aString = "A";
        bClass = new b<a>;
    }
    string getString(){return aString;}
    string getBString(){return bClass->getString();}
};


#endif /* A_HH_ */

对于 b:

#ifndef B_HH_
#define B_HH_

#include <string>

template <typename T>
class b
{
private:
    string bString;
    T* aClass;
public:
    b()
    {
        bString = "B";
        aClass = new T;
    }
    string getString(){return bString;}
    string getAString(){return aClass->getString();}
};


#endif /* B_HH_ */

这消除了循环依赖

于 2013-10-29T13:39:07.230 回答