C++ Project 积累(3)

1. map<string, vector<PcapPacket>> & traffic

强行将涉及文件操作都放在 my_file_system.h/.cpp , 导致出现了需要头文件相互引用的局面, 具体来说

有两个头文件和源文件, 分别是 h1.h, h1.cpp, h2.h, h2.cpp. h2.h include "h1.h" 并定义了 class C2. 同时, h1 中需要使用 C2 的实例, 最后发现 C2 h1 中是不完整的类型, 不能直接调用其函数和类内变量. 即便是使用前置声明, 无法调用实例的变量和函数也使其用处有限.

搜了下, exception c++ 中有所阐述:

第一个原则应该是,如果可以不包含头文件,那就不要包含了。这时候前置声明可以解决问题。如果使用的仅仅是一个类的指针,没有使用这个类的具体对象(非指针),也没有访问到类的具体成员,那么前置声明就可以了。因为指针这一数据类型的大小是特定的,编译器可以获知。

第二个原则应该是,尽量在CPP文件中包含头文件,而非在头文件中。假设类A的一个成员是是一个指向类B的指针,在类A的头文件中使用了类B的前置声明并便宜成功,那么在A的实现中我们需要访问B的具体成员,因此需要包含头文件,那么我们应该在类A的实现部分(CPP文件)包含类B的头文件而非声明部分(H文件)

在这里, 有一些解释 http://patmusing.blog.163.com/blog/static/135834960201038113714199/

但是, 这种方法有其局限性, 我实验了一下 class A class B 放到不同的头文件中, 发现调用 b->somefunc() 时仍然会报错, 说是不完整类型.

所以, 以后设计类的时候需要仔细考虑, 不能发生头文件重复引用的问题.

 

 2. int main(int argc, char* argv[]) 用法

1
2
3
4
5
6
7
8
9
10
int main(int argc, char* argv[])  {
 
    cout << "input is: " << endl;
 
    for(int i = 1; i < argc; i++)  {
        printf("%s ", argv[i]);
    }
    cout << endl;
    return 0;
}

在 windows 下, 输入 test from to 输出为 from to.

argc 是参数个数, 这里为 3 个. argv[] 分别是 test from to

 

C++ Project 积累(3),布布扣,bubuko.com

C++ Project 积累(3)

上一篇:Hbase0.96与Java的交互访问


下一篇:用JavaScript往DIV动态添加内容