如何在标头中使用尚未定义的数据类型?

时间:2013-01-12 16:28:14

标签: c++ typedef header-files

我使用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合并的实际数据类型..它也很混乱。
这有什么解决方案吗?

3 个答案:

答案 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,你会更好地使用其他人说的单独的头文件。