我们通过前置类型声明来解决这个问题,即不引入对应类型的头文件,只做前置声明,在Event中只使用对应类型的指针,如下所示: class A2; // ... class Event { // 业务A, B, C ... shared_ptr<A1> a1; shared_ptr<A2> a2; // ... shared_ptr<B1> b1; shared_ptr<B2> b2; // ... }; 只有在...
也就是说,枚举类型如果没定义完,编译期是不知道它的长度的,因此就没法前置声明。 C++中允许指定枚举的基础类型,制定后可以前置声明: 但如果你是在调别人写的库的时候,人家的枚举没有指定基础类型的话,那你也没辙了,就是不能前置声明。 2. 无法确认枚举值的范围 也就是说,我没有办法判断某个值是不是合法的...
11、文件流<functional> STL函数对象<iomanip> 参数化输入/输出<ios>基本输入/输出支持<iosfwd> 输入/输出前置声明<iostream> 数据流输入/输出 基本输入流<iterator> 遍历序列的类<limits> 各种数据类型最值常量<list>STL线性列表容器<locale> 国际化支持 STL映射容器<memory> 专用内存分配器<new> 基本内存分配和释...
强类型枚举值具有传统枚举的功能——命名枚举值,同时又具有类的特点——具有类域的成员和无法进行默认的类型转换。所以也称之为枚举类——enmu class 枚举类的底层数据必须是有符号或无符号整型,比如char unsigned int unsigned long,默认为int。 3.前置声明应用 enmu class Clolor:char; //前置声明枚举类 void ...
{ val *= 131; val += ch; } return val; } }; template<class K, class T, class Hash, class KeyOfT> class HashTable; // 前置声明 template<class K, class T, class Hash, class KeyOfT> class __HashIterator { public: typedef HashNode<T> Node; typedef HashTable<K, T, Hash, Key...
〈deque>STL双端队列容器<exception〉异常处理类〈fstream>文件流 〈functional>STL函数对象<iomanip〉参数化输入/输出<ios〉基本输入/输出支持 〈iosfwd〉输入/输出前置声明〈iostream〉数据流输入/输出〈istream>基本输入流 〈iterator〉遍历序列的类<limits>各种数据类型最值常量〈list>STL线性列表容器 ...
模板类型参数 类型参数可以看做类型说明符,像内置类型或类类型说明符一样使用,单仅限于定义模板的函数返回类型、参数类型、函数体内变量声明、类型转换。 类型参数前必须使用关键字typename或class,两者等价,可互换。(仅限于模板参数列表中) template <typename T> T foo(T *p) { ...
需要访问File 的声明,则头文件中只需前置声明class File;无需#include 'file/base/file.h'。 在头文件如何做到使用类Foo 而无需访问类的定义? 1) 将数据成员类型声明为Foo *或Foo &; 2) 参数、返回值类型为Foo 的函数只是声明(但不定义实现);
模板的声明定义一般是写在头文件中,否则在.CPP文件中则会出现链接错误。因为,通常的编译只是编译.CPP文件,如果.CPP文件中的函数或者类能在头文件中找到声明,那么就不会报错。但是到了链接部分就不一样了,因为在链接时候需要实例化模板,这时候就需要模板的具体实现了。如果在main函数中调用了模板函数,这时候就需要去...
因此,必须通过前置声明预先说明函数的返回类型。 如果把函数定义置于main()的文件顶部,就可以省略前置声明,因为编译器在执行到main()之前已经知道函数的所有信息。 函数方括号中声明的变量是局部变量,该变量只属于该函数。可以在程序中的其他地方(包括main()中)使用同名变量而不会引起名称冲突,是同名的不同变量。