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;
}
c++ 用namespace实现java的package的功能的更多相关文章
- Java的Package和Classpath
Package 在Java中,Package是用来包含一系相关实例的集合.这些相关联的实例包括:类.接口.异常.错误以及枚举. Package主要有一些的几点作用: Package可以处理名字冲突,在 ...
- Java 包(package)详解
为了更好地组织类,Java提供了包机制,用于区别类名的命名空间. 包的作用 1 把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用. 2 如同文件夹一样,包也采用了树形目录的存储方式.同一 ...
- Java - 25 Java 包(package)
Java 包(package) 为了更好地组织类,Java提供了包机制,用于区别类名的命名空间. 包的作用 1 把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用. 2 如同文件夹一样,包 ...
- Java 包(package)
为了更好地组织类,Java 提供了包机制,用于区别类名的命名空间. 1.包的作用 1.把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用. 2.如同文件夹一样,包也采用了树形目录的存储方式 ...
- Java学习笔记三十一:Java 包(package)
Java 包(package) 一:包的作用: 如果我们在使用eclipse等工具创建Java工程的时候,经常会创建包,那么,这个包是什么呢. 为了更好地组织类,Java 提供了包机制,用于区别类名的 ...
- java带package的编译
ProcessBuilder pb = new ProcessBuilder("cmd", "/c", "java -cp d:\\TEST com/ ...
- 集成自动化的条形码功能到internet应用程序,网站或自定义Java应用程序的条码控件Java Barcode Package
Java Barcode Package控件是一款条码生成控件,包含所有的JavaBean,Applets,Servlets和类库可以使用于装有Java虚拟机的任何平台,包括Windows®, Lin ...
- java包(package)
为了更好地组织类,java提供了包机制,用于区别类名的命名空间. 这样在不同的命名空间就可以有相同命名的类. 1 把功能相似或相关的类或接口阻止在同一个包中,方便类的查找和使用. 2 如同文件夹一样, ...
- Java实现Package编译和访问
Java实现Package编译和访问 说明 所有文件都是使用UTF-8编码来写的,请不要用Windows记事本随便打开 Test.java文件中注释的方法说明了该类是不能访问其方法的 文件目录树 bi ...
随机推荐
- python3-开发面试题(python)6.22基础篇(1)
1.为什么学习Python? 1.语言排行榜 2.语言本身简洁,优美,功能超级强大的 3.跨平台 4.非常火爆的社区 5.用的公司的多 2.通过什么途径学习的Python? 某宝2.8就搞定了,跟着视 ...
- Problem I: 零起点学算法30——输出四位完全平方数
#include<stdio.h> int main() { int a,b,c,d,s,i; ;i<;i++){ s=i*i; a=s/; b=s%/; c=s%/; d=s%; ...
- Problem G: 零起点学算法27——等级分制度
#include<stdio.h> int main() { int a,b; while(scanf("%d %d",&a,&b)!=EOF) +a* ...
- 导出pem证书给服务端Push Notification使用
1. 钥匙串创建Push证书的证书签名请求文件(CSR文件). 如下图所示: 2.创建App ID,创建Provisioning Profile,下载安装到XCode. 苹果开发者后台页面,创建Pus ...
- Ubuntu 16.04通过APT源安装QUEM虚拟机调试Linux内核
安装: sudo apt-add-repository main sudo apt-get update sudo apt-get install qemu-kvm qemu virt-manager ...
- Java使用纯真IP库获取IP对应省份和城市
原文:http://blog.csdn.net/chwshuang/article/details/78027873?locationNum=10&fps=1 Java使用纯真IP库获取IP对 ...
- Oracle API Gateway连接WebService服务,攻击保护
1.启动和连接OAG OAG连接的时候除了不选择analysis,其他都选上,然后启动Gateway实例以及Nodemanager. 命令如下: /$OAG_HOME/apigateway/posix ...
- android开发游记:SpringView 下拉刷新的高效解决方式,定制你自己风格的拖拽页面
关于下拉刷新/上拉载入很多其它的解决方式网上已经有非常多了,浏览了眼下主流的下拉控件比方PullToRefresh库等.第一:大多数实现库都难以进行动画和样式的自己定义. 第二:不能非常好的兼容多种滚 ...
- Windows数据备份软件Deltacopy-数据备份与还原
官方网站:http://www.aboutmyip.com/AboutMyXApp/DeltaCopy.jsp System Requirements XP, 2000, 2003, 2008, Vi ...
- vulkan
https://gfxbench.com/device.jsp?benchmark=gfx40&os=Android&api=gl&D=Asus+ZenFone+4+%28Ad ...