以前喜欢这样组织文件:

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的功能的更多相关文章

  1. Java的Package和Classpath

    Package 在Java中,Package是用来包含一系相关实例的集合.这些相关联的实例包括:类.接口.异常.错误以及枚举. Package主要有一些的几点作用: Package可以处理名字冲突,在 ...

  2. Java 包(package)详解

    为了更好地组织类,Java提供了包机制,用于区别类名的命名空间. 包的作用 1 把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用. 2 如同文件夹一样,包也采用了树形目录的存储方式.同一 ...

  3. Java - 25 Java 包(package)

    Java 包(package) 为了更好地组织类,Java提供了包机制,用于区别类名的命名空间. 包的作用 1 把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用. 2 如同文件夹一样,包 ...

  4. Java 包(package)

    为了更好地组织类,Java 提供了包机制,用于区别类名的命名空间. 1.包的作用 1.把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用. 2.如同文件夹一样,包也采用了树形目录的存储方式 ...

  5. Java学习笔记三十一:Java 包(package)

    Java 包(package) 一:包的作用: 如果我们在使用eclipse等工具创建Java工程的时候,经常会创建包,那么,这个包是什么呢. 为了更好地组织类,Java 提供了包机制,用于区别类名的 ...

  6. java带package的编译

    ProcessBuilder pb = new ProcessBuilder("cmd", "/c", "java -cp d:\\TEST com/ ...

  7. 集成自动化的条形码功能到internet应用程序,网站或自定义Java应用程序的条码控件Java Barcode Package

    Java Barcode Package控件是一款条码生成控件,包含所有的JavaBean,Applets,Servlets和类库可以使用于装有Java虚拟机的任何平台,包括Windows®, Lin ...

  8. java包(package)

    为了更好地组织类,java提供了包机制,用于区别类名的命名空间. 这样在不同的命名空间就可以有相同命名的类. 1 把功能相似或相关的类或接口阻止在同一个包中,方便类的查找和使用. 2 如同文件夹一样, ...

  9. Java实现Package编译和访问

    Java实现Package编译和访问 说明 所有文件都是使用UTF-8编码来写的,请不要用Windows记事本随便打开 Test.java文件中注释的方法说明了该类是不能访问其方法的 文件目录树 bi ...

随机推荐

  1. 【高斯消元】【异或方程组】【bitset】bzoj1923 [Sdoi2010]外星千足虫

    Xor方程组解的个数判定: ——莫涛<高斯消元解Xor方程组> 使用方程个数判定:消去第i个未知数时,都会记录距第i个方程最近的第i位系数不为0の方程是谁,这个的max就是使用方程个数. ...

  2. Problem B: 调用函数,求1!+2!+3!+......+10!

    #include<stdio.h> double fact(int i); int main() { int i; ; ;i<=;i++) sum=sum+fact(i); prin ...

  3. AppCompatActivity与toolbar的结合

    原文:http://www.51itong.net/android-activity-appcompatactivity-toolbar-15750.html 另外一个博客:Android 5.x T ...

  4. Jackson错误:Can not deserialize instance of java.lang.String out of START_OBJECT token

    org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Can not des ...

  5. gitk图形界面中文乱码情况

    当打开gitk图形界面时,文件中的中文部分乱码了,这大部分是因为编码格式的问题,为了跟上时代的脚步,本人建议都是用utf-8编码. 为了方便,我将全局配置为utf-8编码: git config -- ...

  6. CSS部分属性的深入学习

    先上个张鑫旭大神的政治课,来个一棒打醒(手动滑稽): 说说CSS学习中的瓶颈: 虽然自己水平不高,但是对于重构这方面工作一直不怎么喜欢,可能觉得比较没有新意,但是看了大神文章突然有点一棍打醒的感觉,突 ...

  7. 直接拿来用!最火的Android开源项目(二)

    在<直接拿来用!最火的Android开源项目(一)>中,我们详细地介绍了GitHub上最受欢迎的TOP20 Android开源项目,引起了许多读者的热议,作为开发者,你最常用的是哪些开源项 ...

  8. codeforces round #264(div2)

    A题   我仅仅想说题意非常坑,一不小心就会wa,哎,不机智的我居然在最后判题的过程中错了,少加一个推断语句. 错的值了,你说呢? #include<map> #include<cm ...

  9. DICOM中几个判断图像方向的tag

    在DICOM标准里,有三个TAG与成像的方向相关. 参考来源:Kitware关于DICOM方向的说明 http://public.kitware.com/IGSTKWIKI/index.php/DIC ...

  10. [原创]用逻辑嗅探破解接触式IC卡口令

    最近两周对接触型IC卡很感兴趣,就动手实践了一下,最终实现的效果是通过破解IC卡口令实现对数据修改,然后就可以随意洗衣服喽~IC卡从数据传递方式上划分为接触型和非接触型两种.接触型的卡片表面有金属贴片 ...