以前喜欢这样组织文件:

myproject/src/moduleA放moduleA的所有cpp文件

myproject/include/moduleA放moduleA的所有h文件

对moduleB.C.D...类似的处理,但是仍然容易有name clashes

最近发现在使用上述文件组织方式的情况下,用namespace给各个module命名,结合nested namespace的特性(参见c++ primer 4th edition section 17.2.2),可以实现类似java的package的特性

福啊

我做了个实验,确实是可以的,可惜的的缺憾是我用的CodeBlocks还不是很支持这样的代码组织方式(比如说代码提示啊、头文件路径提示啊之类的都会出现问题,不过GCC编译器倒是完美支持这样的文件组织方式)

我的项目组织结构:

文件结构:

http://pan.baidu.com/s/1c07xXAS

问题:

1、include指令啰嗦,必须包含完整的相对路径,例如“#include "../../include/module2/ClsA.h"”

2、header guard啰嗦,必须指明某个类所属的模块,例如“#ifndef OSSOZTELIB_MODULE1_CLSA_H”

3、cpp中的实现代码啰嗦(当然可以通过using namespace project::module指令来解决),例如把module2.ClsA.cpp改为

 #include "../../include/module2/ClsA.h"

 #include <iostream>

 using namespace ossoztelib::module2;

 void ClsA::dosomething()
{
std::cout << "ossoztelib.module2.ClsA.dosomething" << std::endl;
} ClsA::ClsA()
{
std::cout << "ossoztelib.module2.ClsA created" << std::endl;
} ClsA::~ClsA()
{
std::cout << "ossoztelib.module2.ClsA destroyed" << std::endl;
}

4、调用代码啰嗦(包括include指令,以及namespace的specifier(但是在没有命名冲突的情况下不会存在这个问题))

总结:

尽管有诸多问题,不过还是很好的解决了命名冲突,虽然不如java的package机制那么方便易用。

顺便提一下,header里面是绝对不能出现using指令的

代码:

main.cpp

 #include "include/module2/ClsA.h"
#include "include/module1/ClsA.h" int main()
{
ossoztelib::module1::ClsA a;
ossoztelib::module2::ClsA b;
a.dosomething();
b.dosomething();
return ;
}

module1.ClsA.h

 #ifndef OSSOZTELIB_MODULE1_CLSA_H
#define OSSOZTELIB_MODULE1_CLSA_H namespace ossoztelib { namespace module1 { class ClsA
{
public:
ClsA();
~ClsA();
void dosomething();
}; } }
#endif // OSSOZTELIB_MODULE1_CLSA_H

module1.ClsA.cpp

 #include "../../include/module1/ClsA.h"

 #include <iostream>

 using namespace std;

 void ossoztelib::module1::ClsA::dosomething()
{
cout << "ossoztelib::module1::ClsA::dosomething()" << endl;
} ossoztelib::module1::ClsA::ClsA()
{
cout << "ossoztelib::module1::ClsA::ClsA()" << endl;
} ossoztelib::module1::ClsA::~ClsA()
{
cout << "ossoztelib::module1::ClsA::~ClsA()" << endl;
}

module2.ClsA.h

 #ifndef OSSOZTELIB_MODULE2_CLSA_H
#define OSSOZTELIB_MODULE2_CLSA_H namespace ossoztelib { namespace module2 { class ClsA
{
public:
ClsA();
~ClsA();
void dosomething();
}; }
} #endif // OSSOZTELIB_MODULE2_CLSA_H

module2.ClsA.cpp

 #include "../../include/module2/ClsA.h"

 #include <iostream>

 using namespace std;

 void ossoztelib::module2::ClsA::dosomething()
{
cout << "ossoztelib.module2.ClsA.dosomething" << endl;
} ossoztelib::module2::ClsA::ClsA()
{
cout << "ossoztelib.module2.ClsA created" << endl;
} ossoztelib::module2::ClsA::~ClsA()
{
cout << "ossoztelib.module2.ClsA destroyed" << endl;
}

最新文章

  1. Java中的private protected public和default的区别
  2. 组件封装:es6转es5
  3. Sphinx扩展安装安装
  4. 用js判断页面是否加载完毕
  5. Window.onload与$(document).ready()的对比
  6. day2_python的数据类型,sys,os模块,编码解码,列表,字典
  7. qt之菜单项定制
  8. flask sqlchemy 多对多的自引用关系定义
  9. 关于 extern &quot;C&quot;的说明
  10. 使用maven搭建springMVC开发环境
  11. rocketmq安装与基本操作
  12. Tomcat权威指南-读书摘要系列8
  13. Kettle命令行使用说明
  14. 2018牛客网暑期ACM多校训练营(第一场) D - Two Graphs - [无向图同构]
  15. zabbix系列之八——安装后配置三Triggers
  16. vlc的应用之七:用vlc做单播,组播及点播服务器【转】
  17. 【LeetCode】140. Word Break II
  18. (深搜)Oil Deposits -- hdu -- 1241
  19. 20155223 2006-2007-2 《Java程序设计》第二周学习总结
  20. 《Java程序设计》第九周学习总结 20165218 2017-2018-2

热门文章

  1. 【动态规划】【零一背包】CODEVS 1014 装箱问题 2001年NOIP全国联赛普及组
  2. Xcode8 不能显示blame,show blame for line 灰色不可点解决办法
  3. 移植u-boot-2012.4到Tiny6410_1G_Nandflash
  4. chrome 技巧 记录一些以前不太熟悉的
  5. 激活office2010出现“Failed to inject memory”错误
  6. MORMOT数据库连接池
  7. 【InteillJ IDEA】Git的安装+同步项目到GitHub上
  8. javascript快速入门12--函数式与面向对象
  9. windowsclient开发--使用、屏蔽一些快捷键
  10. onbeforepaste事件用法