9

假设我有一个std::vectorof std::strings。

// Foo.h
class Foo {
    std::vector< std::string > mVectorOfFiles;
}

然后我typedef把它变成了一个StringVector类型。

// Foo.h
typedef std::vector< std::string > StringVector;

class Foo {
    StringVector mVectorOfFiles;
}

如果我有另一个需要一个StringVector对象的类......

// Bar.h
class Bar {
    Bar( const StringVector & pVectorOfFiles ); // I assume this produces a compile error (?) since Bar has no idea what a StringVector is
}

...我必须typedef在头文件中再次使用Bar吗?

// Bar.h
typedef std::string< std::vector > StringVector;
class Bar {
    Bar( StringVector pListOfFiles );
}

是否可以将其typedef std::vector< std::string > StringVector放在一个文件中并让其他所有类都知道该类型StringVector

4

3 回答 3

20

#include "Foo.h"您获得的所有文件typedef. 所以不,您不必在每个文件复制它(只要它包含Foo.h. 如果适合您的需要,您可以将其放置typedef在专用文件中。在您的情况下,这将是有意义的并且将是一个改进,因为Bar.h不应依赖于Foo.h具有typedef和必要的包含的事实。

我会保持简单并将其限制为一种类型,以包含在使用该类型的所有文件中:

// StringVector.h
#ifndef STRINGVECTOR_H_
#define STRINGVECTOR_H_

#include <vector>
#include <string>

typedef std::vector< std::string > StringVector;

#endif
于 2013-01-18T07:57:56.260 回答
0

当然不是,您不必在所有头文件中都键入定义,只需在其余源文件包含的任何头文件中进行。

于 2013-01-18T07:58:04.420 回答
0

而是创建一个类。

class Files {
};

然后你可以在需要的地方使用前向声明;

class Files;

您将封装适合文件的行为。

于 2013-01-18T09:06:52.747 回答