我有一个名为Utils.h的文件。我在里面放了一些课。这些类的名称是:Point
,Edge
,Cone
和mathTools
。我还有两个名为RedBlackTree.h
和RedBlackTree.cpp
的文件类RedBlackTree
的声明和实现。我的main()函数在source.cpp
中。我可以同时包含Utils.h
和RedBlackTree.h
,但没有问题。但是当我将Utils.h
包含在RedBlackTree.h'我面临错误C2079。我听说它是因为标题中的循环依赖,但我不能在这里。
另一个奇怪的错误是:error C2370: 'max_input_size' : redefinition; different storage class
如果我在"Utils.h"
中不包含RedBlackTree.h
,则会再次出现此错误。
修改
如果我写mathTools *myMath;
而不是mathTools myMath;
而对其他课程这样做我就不会有这个问题。
My Utils.h看起来像这样:
#include <cstdlib>
#include <algorithm>
#include <string>
#include <map>
#define PI 3.14159265358979323
#define and &&
#define or ||
#define TETA 30.0f
#define OMEGA 0.15f
const int max_input_size = 50;
//const unsigned long long INF = 2147483647;
#define INF 2147483647
class Point{
public:
/*
Some Functions
*/
private:
/*
. . .
*/
};
class Edge{
public:
// . . .
private:
// . . .
};
class Cone{
public:
// . . .
};
class mathTools{
public:// . . .
private:// . . .
};
RedBlackTree.h
#include "Utils.h" //if I comment this line, there wont be error C2097
#pragma once
// class prototype
template <class Comparable>
class RedBlackTree;
template <class Comparable>
class RBTreeNode{
/*
.
.
.
*/
friend class RedBlackTree<Comparable>;
};
template <class Comparable>
class RedBlackTree
{
public:
//...
private:
//...
};
source.cpp
#include "Utils.h"
#include "RedBlackTree.cpp"
//____________________GLOBAL VARIABLES
mathTools myMath; //error C2079: 'myMath' uses undefined class 'mathTools'
// and there are lots of errors after it
std::vector<Cone>cones;
std::vector<Point>input;
std::vector<Edge> outLawEdges;
bool E[max_input_size][max_input_size] = { false };
double t_sp[max_input_size][max_input_size] = { (double)INF };
double FW[max_input_size][max_input_size] = { (double)INF };
double dist[max_input_size][max_input_size] = { (double)INF };
int main(){
// . . .
}
答案 0 :(得分:3)
在C和C ++编程语言中,#include保护,有时称为宏保护,是一种特殊的构造,用于避免在处理include伪指令时出现双重包含问题。将#include guards添加到头文件是使该文件具有幂等性的一种方法。(Wikipedia)。像这样更改您的Utils.h
和RedBlackTree.h
:
#ifndef UTILS_H
#define UTILS_H
//Utils.h codes
#endif
和
#ifndef RED_BLACK_TREE_H
#define RED_BLACK_TREE_H
//RedBlackTree.h codes
#endif