c++ 用namespace实现java的package的功能
以前喜欢这样组织文件:
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;
}
最新文章
- Java中的private protected public和default的区别
- 组件封装:es6转es5
- Sphinx扩展安装安装
- 用js判断页面是否加载完毕
- Window.onload与$(document).ready()的对比
- day2_python的数据类型,sys,os模块,编码解码,列表,字典
- qt之菜单项定制
- flask sqlchemy 多对多的自引用关系定义
- 关于 extern ";C";的说明
- 使用maven搭建springMVC开发环境
- rocketmq安装与基本操作
- Tomcat权威指南-读书摘要系列8
- Kettle命令行使用说明
- 2018牛客网暑期ACM多校训练营(第一场) D - Two Graphs - [无向图同构]
- zabbix系列之八——安装后配置三Triggers
- vlc的应用之七:用vlc做单播,组播及点播服务器【转】
- 【LeetCode】140. Word Break II
- (深搜)Oil Deposits -- hdu -- 1241
- 20155223 2006-2007-2 《Java程序设计》第二周学习总结
- 《Java程序设计》第九周学习总结 20165218 2017-2018-2
热门文章
- 【动态规划】【零一背包】CODEVS 1014 装箱问题 2001年NOIP全国联赛普及组
- Xcode8 不能显示blame,show blame for line 灰色不可点解决办法
- 移植u-boot-2012.4到Tiny6410_1G_Nandflash
- chrome 技巧 记录一些以前不太熟悉的
- 激活office2010出现“Failed to inject memory”错误
- MORMOT数据库连接池
- 【InteillJ IDEA】Git的安装+同步项目到GitHub上
- javascript快速入门12--函数式与面向对象
- windowsclient开发--使用、屏蔽一些快捷键
- onbeforepaste事件用法