错误:转发声明,如何访问指针

时间:2013-10-29 12:25:38

标签: c++ pointers forward-declaration

我正在做一个小程序,只是为了上课。 我已经完成了两个课程,a和b。

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

#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_ */

我希望能够访问指针而不仅仅是存储指针。 我怎么能这样做?

3 个答案:

答案 0 :(得分:1)

问题是你在类bClass中使用 a指针,因为你需要定义类b。在这种情况下,只需在b.hh中加入a.hh即可解决此问题。这个简单的解决方案将起作用,因为您只在类a中声明b指针(但不访问它)。前向声明是不够的,因为它实际上并没有告诉编译器,只有类b存在。

哦,您需要将bClass->bString中的a::getBString更改为bClass->getString(),因为b::bString是私有的。当然,创建b的实际实例并将其分配给bClass

答案 1 :(得分:0)

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

  1. 访问元素(类,方法,...)必须具有对引用成员的访问权限
  2. 必须提供struct / class的定义。
  3. 要克服1.您可以将成员公开,或将访问类或方法声明为friend,或者更好地使用getter方法。 要克服2.,您需要包含引用类的标题。

答案 2 :(得分: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_ */

这将删除循环依赖

相关问题