从C#到C++的一些容易出现的困惑


最近在学习用c++写一下3D引擎(废话一下,叫做WuguiEngine,首先Wugui是我的外号,也是代表这个引擎很粗糙,速度很慢,呵呵.之后等引擎成熟一点我再写写相关的一些文章).这几天写起来感觉c++好多地方和c#区别很大,这里大概写写这两天碰到的一些问题,也许是从c#转c++的时候的一些通病,对c++ OO新手也有一定的帮助.

另外在本文中,多数是将类拆分为.h文件和.cpp文件这样对于工程来说更好管理.

另外阅读本文需要一定的c++基础,本文主要是一些杂碎的心得,而不是完整的教学

1.头文件

头文件是c#没有的内容,所以用好头文件是学习c++首先需要解决的一个内容.头文件在正常的时候应该是只放上定义,实现代码应该写在同名的cpp文件里面

1) 重复包含:头文件A.H被B.H与C.H同时包含,则在编译的时候,A.H里面定义的代码将被定义两次,造成"Symbol already defined",在这种时候应该在.H文件头尾处加上下列的代码就可以解决这个问题:

1: #ifndef _NAME_H

2: #define _NAME_H

3:

4: //add defination

5:

6: #endif

其实#ifndef与#define的内容只要对于每个.h文件是唯一的就好了.

2)嵌套包含:在A.H(class A)中使用了class B,又在B.H(class B)中使用了class A,这个时候需要在类的前面加入前置定义,下面的代码:

1: #ifndef _A_H

2: #define _A_H

3:

4: #include "B.H"

5:

6: //前置声明

7: class B;

8:

9: class A

10: {

11:     //add defination

12: }

13:

14: #endif

这点说明,头文件并不能代替前置声明,对于有namespace的情况,前置声明更加复杂,下一小节将谈谈这点内容.

3)一些经验:(来自网上)

头文件包含其实是一想很烦琐的工作,不但我们看着累,编译器编译的时候也很累,再加上头文件中常常出现的宏定义。感觉各种宏定义的展开是非常耗时间的,远不如自定义函数来得速度。我仅就不同头文件、源文件间的句则结构问题提出两点原则,仅供参考:

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

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

第三个原则是(我自己觉得的):尽量对引用的其他的类都加上前置声明.这样不仅使得程序的结构更加清楚,而且使得可以少出一些编译错误。

  • 1
  • 2
  • 3
  • 下一页

相关内容