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

how to use not yet defined datatypes in a header?

本文关键字:未定义 数据类型 文件      更新时间:2023-10-16

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

例如:

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

首先,您想到的解决方案(原型和指针)是不必要的,并且比不使用指针实现它要慢。

对此的"适当"解决方案是为每种类型创建单独的头,然后将它们包含在其他头中。这样它将永远被定义!您甚至可以使它们相互包含。

但是,如果您曾经打开过g++提供的.h文件,那么您很可能在头文件的开头看到这个:

#ifndef SOMETHING_H
#define SOMETHING_H
// Code
#endif /* SOMETHING_H */

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

如果它们不在那里,并且您多次包含头文件,则类型将被重新定义,并且会抛出错误。这使得类型总是出现,但不会包含两次。

我希望这对你有帮助!

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

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

我不同意这是混乱的-它允许你有一个有组织的结构,你的项目,它允许每个类的操作独立于其他的,而不用担心顺序,这是一个好主意,把每个类放在自己的文件

你可以在另一个类中定义这个类,比如

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

显然这适用于小班…如果你的类是巨大的,你最好使用单独的头文件,就像其他人说的。