1

我正在使用 g++ 在 linux 上编程,我经常遇到需要在头文件中使用类或数据类型的问题,我稍后会在头文件或另一个头文件中定义。

例如看这个头文件:

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 包含的实际数据类型。它也很混乱。
有什么解决办法吗?

4

3 回答 3

0

You could just define the class inside the other class like

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;
    };
};

Obviously this works for small classes... if your class is ENORMOUS you'll be better using separate header files like the other guys said.

于 2013-12-06T02:54:50.010 回答
0

首先,您想到的解决方案(原型和指针)是不需要的,并且比没有指针的情况下实现它要慢。

对此的“正确”解决方案是为每种类型创建单独的标题,然后将它们包含在其他标题中。这样它总是会被定义!您甚至可以制作它们,使它们相互包含。

但是,如果您曾经打开过.hg++ 提供的文件,您很可能会在标题的开头看到:

#ifndef SOMETHING_H
#define SOMETHING_H

// Code

#endif /* SOMETHING_H */

这是为了解决类型重新定义自己的问题。

如果它们不存在,并且您多次包含头文件,则类型将被重新定义,并且会引发错误。这使得类型始终存在,但从不包含两次。

我希望这会有所帮助!

于 2013-01-12T16:39:09.280 回答
0

将每个类/类型放在它自己的头文件中,然后将相关的头文件包含在您需要的其他头文件中。在每个标头中使用包含保护,例如:

// SomeHeaderFile.h
#ifndef SOME_HEADER_FILE_H
#define SOME_HEADER_FILE_H
// code
#endif

我不同意这很混乱——它允许你的项目有一个有组织的结构,它允许每个类独立于其他类运行,而不用担心顺序,无论如何将每个类放在它自己的文件中是个好主意。

于 2013-01-12T16:35:21.553 回答