我似乎误解了与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()(需要查看类声明以了解绑定函数调用的地址)。
答案 0 :(得分:1)
现在T实际上有一个X对象(不是指针,而是X对象)。
鉴于此顺序 -
class T;
class X;
class Y;
#include "Y.h"
#include "T.h" // 1
#include "X.h"
如上所述, T.h
有X
个对象。在此之前(1
)编译器不知道类X
的定义。对于实例化编译器的对象,应该看到完整的类定义,而不是X
的前向声明。但是编译器抱怨未定义的类型T
似乎很奇怪。
答案 1 :(得分:0)
我解决了我的问题。问题是我在头文件中执行上述代码。编译器可以理解为无法基于前向引用编译t-&gt; booleanReturningFunction()(需要查看类声明以了解绑定函数调用的地址)。