怎么写好一个C++的类(二)不建议直接include包含cpp文件

  在很多书上都教了#include包含头文件,但是没有教为什么不能包含源文件。。。所以有一些同学试过直接包含源文件(好吧,我承认,我在大学时候也这样做过,而且很幸运没有出问题)。

  那到底应不应该包含源文件呢?

  我想用一个反证法,如果直接包含.cpp文件,那cpp文件中的static变量和接口不是全暴露给外部的.cpp文件了吗,那样要static和接口的在本文件生命周期有效这一个限定有毛用?不直接包含源文件,就可以把程序按照文件进行模块划分。(可能很多同学说,总是说模块化,就知道吹这些名词,都不感觉到它有什么用,呃,还是那句话,是你写的程序太少了)当然这个模块化的好处诱惑不到你的话,那不给你编译,这下你没话说了吧。看下面例子,这样直接包含.cpp文件的做法会很容易造成重复定义的错误。

  还是原来的那个程序作为例子吧。

  person.h文件

 1 #ifndef _Person_H
 2  #define _Person_H
 3
 4 class Person
 5  {
 6 public:
 7      Person();
 8
 9     ~Person();
10
11  private:
12  };
13
14  #endif

  person.cpp文件

 1 #include <iostream>
 2 #include "person.h"
 3
 4 using std::cout;
 5 using std::endl;
 6
 7 Person::Person()
 8 {
 9     cout << "create a person" << endl;
10 }
11
12 Person::~Person()
13 {
14     cout << "release a person" << endl;
15 }

  main.cpp文件

1 #include <iostream>
2 #include "person.h"
3 using namespace std;
4
5 int main()
6 {
7     Person person;
8     return 0;
9 }

  OK!这样是“正常人”的写法,哈哈,是不会出问题的。不过,还是看一下运行结果吧。

  但是如果直接#include包含".cpp"文件呢,会出现什么结果。看下面例子。

  main.cpp文件直接包含person.cpp文件:

 1 #include <iostream>
 2 #include "person.cpp"
 3
 4 using namespace std;
 5
 6 int main()
 7 {
 8     Person person;
 9     return 0;
10 }

  编译运行:

  出现了多重定义导致不能编译。

  综上,不建议直接包含.cpp文件,即使有多不得已的理由,都不应该这样写,比如有人说一个.cpp程序内容太长,用这样方法扩展程序(有这个说法人,你应该重新设计程序划分程序模块了),或者说提高编译效率(扯蛋啊,能不能提高编译效率另说,反正现在的计算机不差这点编译时间,难道用的是七八十年代的机器吗)。

原文地址:https://www.cnblogs.com/qiuquanguan/p/11563820.html

时间: 2024-08-28 23:06:25

怎么写好一个C++的类(二)不建议直接include包含cpp文件的相关文章

JSP中的坑(二):使用include包含jsp文件时contentType中charset的值区分大小写

在JSP中<%@include file="" %>是比较常用的包含其他文件的一种手段,但是在使用时一不小心也会出错,如下代码: index.jsp: <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//D

我写的一个ExcelHelper通用类,可用于读取或生成数据

读取或生成EXCEL数据的方法有很多,一般常见的有: 1.通过OFFICE EXCEL组件,优点:读取与生成EXCEL文件方便,缺点:服务器上必须安装OFFICE软件,且进程无法及时释放 2.通过第三方组件(比如:NPOI),优点:无需安装OFFICE软件,缺点:需要引入第三方组件,当然这个还是比较强的 3.通过把EXCEL当成数据库,连接后运用SQL语句读取,写入的话就自行拼接成HTML表格,优点:无需另外的组件,缺点:需要会SQL及拼接HTML表格较麻烦: 三种方法我都有用过,若开发BS网站

刚写的一个js分页类,未优化

以前也写过,很久以前了,写的很长,并且使用起来也不灵活.这次搞了个灵活版的. /* * SunPage --自定义分页类,仅获取分页的html代码,简单应用 * Sunbt 2015-5-4 * v1.0 * @param current_page int 当前页 * @param totle_page int 总页数 * @param take_num int 当前页左右携带页码数 * @param func_obj obj 分页实现函数 */ var SunPage = function(c

写了一个关于《Delphi二维码、分组、批量》的帖子

Delphi二维码 分组批量打印delphi二维码分组批量打印Delphi二维码中文支持.分组.批量打印经验小结FastReport设计入库单报表实例 Delphi 二维码 分组批量打印 fastreport 控件 背景:一直也没接触到什么复杂的报表,都是一些简单的报表,在DelphI下使用QuickReport一般也就能满足需要了,由于公司现在需求的变化,对条码扫描提出了新的要求,主要是扫码要包含更多地内容,以前的一维码显然不能完全满足,再说二维码也是一种趋势,故而需要解决二维码的问题,网上搜

C#.NET 程序员的福利,自己写的一个XML操作类,可实现像jquery一样方便的xml操作,且不用专门去处理命名空间。

此工具是进入一家新公司之后实现的,主要是工作当中操作 xml 的时间太多,因为公司按任务计“工作量”,领导给我安排的时间远远不够完善此工具[悲哀的制度],虽然我也能直接在cs中直接中规中矩完成,但实在受不了那种重复和低效,所以此工具基础部分绝大部分时间是在家中加班完成,剩下应用于公司项目中之后,在公司改了一些BUG,差不多也用了半年多了,实在是很好用,现在也差不多稳定了,特分享出来,需要的直接拿去用吧,有BUG可以直接发消息给我沟通,不用谢.. 使用方法: x(filepath).Find("/

entity framework 6 我写了一个公用数据类

public class BaseDAL { string strConn = ""; public BaseDAL(string connString) { strConn = connString; } #region 通用增删改查 #region 非原始sql语句方式 /// <summary> /// 新增 /// </summary> /// <param name="entity">实体</param> /

新手写的一个DBCP工具类

1 package com.xx.questionnaire.util.dao; 2 3 import java.io.IOException; 4 import java.sql.Connection; 5 import java.sql.PreparedStatement; 6 import java.sql.ResultSet; 7 import java.sql.SQLException; 8 import java.sql.Statement; 9 import java.util.P

写了一个批处理,可以实现文件备份,自动对比删除冗余文件。

替换的原则是按照文件修改时间,替换掉修改时间教早的. set desdir=D:set filetypes=pdf uvproj bat c h s lib cpp txt rar del /s /q s:\backtempsrc.t>nul del /s /q s:\backtempdes.t>nul del /s /q s:\dellist.t>nul cls @echo off&setlocal enabledelayedexpansion set /p sels=&quo

写了一个ios缓存模块,非常方便好用,欢迎帮忙加星~

写了一个ios磁盘缓存的模块,基于ISDishCache,添加文件校验,相同的文件只会缓存一次,采用了引用计数的方式对文件进行淘汰,之前的按文件访问时间进行淘汰会对经常使用的文件造成误删,使用很方便,一般用到就两个方法cacheObejct和objectForKey,将key和要缓存的文件放进去就可以了,地址https://github.com/abbothzhang/ZHCache,欢迎使用,欢迎帮忙加星~~~