C++ 怎么组织头文件和实现文件

C++ 如何组织头文件和实现文件?
本帖最后由 Benjaminzhou93 于 2015-02-15 19:47:18 编辑
类的结构大致如下,当前的物理和逻辑依赖成线型 :

C1.cpp依赖C1.h
C2.h依赖C1.h
C2.cpp依赖C2.h
C3.h依赖C2.h
C3.cpp依赖C3.h


main.cpp (在 Qt IDE, clang编译器上)
#include <C1.cpp>
#include <C2.cpp>
#include <C3.cpp>
// 第一个问题 为什么不能是  .h
//以前VS只要加入了工作路径就可以了,Qt编译器不知道该怎么加路径



C2.h (在 Qt IDE, clang编译器上)
template<typename T>
class C2 {
protected :
    //第二个问题 模板类友元函数的实现只能在类声明里吗
    friend void func(int i, const C2& c2) {
        return;
    }

    class C2_1 {
        // 声明 50 行, 实现 300 行在 C2.cpp
    };
    // 声明 60行, 实现 300 行在 C2.cpp
    T data;
};

// 第三个问题 现在想将 C2 和 C2_1 的实现文件分开(独立出 C2_1)该怎么组织



------解决思路----------------------
1.怎么会不能#include头文件呢?
2.
template<typename T>
class C2 {
protected:
template<typename S>
friend void func(int i, const C2<S>& c2) {   //声明必须放在类内
return;
}

class C2_1 {
};
T data;
};

template<typename T>   
void func(int i, const C2<S>& c2){   //定义可以放在类外
return;
}

3. 第三个问题看楼下
------解决思路----------------------
第三个问题,既然你要分开,就不用内部类来写。可以在C2中写一个C2_1的实例,然后直接调用即可。
#include<C2_1.h>   //比如你把类声明写在这里了
template<typename T>
class C2 {
protected:
template<typename S>
friend void func(int i, const C2<S>& c2);
C2_1 c2_1;
T data;
};

------解决思路----------------------
首先,你这个是模板编程
模板编程通用做法,模板声明和实现都可以在一个头文件里完成,这是做法一
如果要把实现和声明分开,建议在头文件中#include cpp文件,或者可以使用预处理兼顾两中做法,对此有疑问,建议看看
《C++模板编程》
以上是第一种解决问题的思路

下面说第二种,出发点在与头文件自满足,楼主可百度之

第三种,减少编译以来,使用PImpl模式,使用指针就可以声明二不需要头文件包含

点到为止,楼主仔细研究。三种都深入学习一下,就会成长不少