我使用g ++在linux上编程,我经常遇到一个问题,我需要在头文件中使用类或数据类型,我稍后会在头文件或另一个头文件中定义。< / p>
例如,查看此头文件:
class example
{
mydatatype blabla;
};
struct mydatatype
{
int blablainteger;
char blablachar;
};
这会产生错误,因为mydatatype在其定义之前使用 所以我通常会改变它:
struct mydatatype; // <-- class prototype
class example
{
mydatatype *blabla; // <-- now a pointer to the data type
// I will allocate the data during runtime with the new operator
};
struct mydatatype
{
int blablainteger;
char blablachar;
};
现在它有效。我可以经常把上面的定义放在上面,或者包含所需的标题,但是我不想在标题中包含标题或者用定义顺序包含它,它总是会变得混乱。
我展示的解决方案通常有效,但现在我遇到了一个新现象。这次数据类型不是类而是typedef,我不能使用typedef的原型,我不想使用typedef合并的实际数据类型..它也很混乱。
这有什么解决方案吗?
答案 0 :(得分:0)
将每个类/类型放在它自己的头文件中,然后将相关的头文件包含在您需要的其他头文件中。在每个标题中使用包含保护,例如:
// SomeHeaderFile.h
#ifndef SOME_HEADER_FILE_H
#define SOME_HEADER_FILE_H
// code
#endif
我不同意这是混乱的 - 它允许你有一个有组织的结构项目,它允许每个类独立于其他人操作而不用担心顺序,并且最好将每个类放在它自己的文件中
答案 1 :(得分:0)
首先,你想到的解决方案(原型和指针)是不必要的,并且比没有指针的情况下实现它要慢。
对此的“正确”解决方案是为每种类型创建单独的标题,然后将它们包含在您的其他标题中。这样它将永远被定义!你甚至可以制作它们以便它们包括在一起。
但是,如果你曾经打开过g ++提供的.h
文件,你很可能会在标题的开头看到这个:
#ifndef SOMETHING_H
#define SOMETHING_H
// Code
#endif /* SOMETHING_H */
这是为了解决重新定义自己的类型问题。
如果它们不存在,并且您多次包含头文件,则将重新定义类型,并且将引发错误。这使得类型始终存在,但从不包含两次。
我希望有所帮助!
答案 2 :(得分:0)
您可以在其他类中定义类,如
template<class T>
class vertex {
private:
class edge {
public:
vertex<T> *to;
double weight;
edge() {
weight = INFINITY;
to = NULL;
};
} *paths;
T data;
unsigned nof_paths;
public:
vertex(T val) {
data = val;
paths = NULL;
nof_paths = 0;
}
void addPathTo(vertex<T>*&);
edge* getAllPaths() {
return paths;
};
};
显然这适用于小班级...如果你的班级是ENORMOUS,你会更好地使用其他人说的单独的头文件。