C ++ - 构建顺序和依赖问题

时间:2011-09-09 01:26:47

标签: c++

我似乎误解了与C ++中构建顺序依赖关系相关的东西。所以我有这个代码,它定义了一个我用作函数的类(其目的是替换传递函数指针的对象):

#include "Imports.h"

class X: public Y
{
public:

    X (T* t) { this->t= t; }
    virtual ~X(){}

    virtual void draw()
    {
        if (t->booleanReturningFunction())
        {
                t->someField.draw();
        }
    }

    T* t;
};

我收到一个编译错误,抱怨我在使用T的行号中使用了“未定义类型T”。但是,Imports.h看起来像:

//The goal of this file is to have all the typcally needed imports in one place.

#if !defined(IMPORTS_H)
#define IMPORTS_H

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <iostream>
#include <assert.h>
#include <cmath>
#include <fstream>

class T;
class X;
class Y;

#include "Y.h"
#include "X.h"
#include "T.h"

#endif // if !defined(IMPORTS_H)

每个“.h”文件包含该类的定义。现在T实际上确实有一个X对象(不是指针,而是X对象)。但是,据我所知,构建顺序中没有循环依赖,因为X只有一个指向T的指针,对吧?有什么我想念你只能从这段代码中看到的吗?非常感谢帮助!

编辑:我解决了我的问题。问题是我在头文件中执行上述代码。编译器可以理解为无法基于前向引用编译t-&gt; booleanReturningFunction()(需要查看类声明以了解绑定函数调用的地址)。

2 个答案:

答案 0 :(得分:1)

  

现在T实际上有一个X对象(不是指针,而是X对象)。

鉴于此顺序 -

class T;
class X;
class Y;

#include "Y.h"
#include "T.h"   // 1
#include "X.h"
如上所述,

T.hX个对象。在此之前(1)编译器不知道类X的定义。对于实例化编译器的对象,应该看到完整的类定义,而不是X的前向声明。但是编译器抱怨未定义的类型T似乎很奇怪。

答案 1 :(得分:0)

我解决了我的问题。问题是我在头文件中执行上述代码。编译器可以理解为无法基于前向引用编译t-&gt; booleanReturningFunction()(需要查看类声明以了解绑定函数调用的地址)。