以前喜欢这样组织文件:

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. 【博弈论】【SG函数】bzoj3404 [Usaco2009 Open]Cow Digit Game又见数字游戏

    #include<cstring> #include<cstdio> #include<algorithm> #include<set> using n ...

  2. 【Trie】bzoj1212 [HNOI2004]L语言

    枚举每个文章里已经在Trie中被标记为可能是分割处的字符,然后再从此处跑Trie,继续向后标记.由于单词数很少,因此复杂度可以接受,O(n*m*Len). #include<cstdio> ...

  3. 1.10(java学习笔记)super关键字

    supe主要是调用父类中被重写的方法及属性. 用下列代码那说明: package cn.hcf.TestSuper; public class TestSuper { public static vo ...

  4. INLINE-BLOCK和FLOAT(二)(转)

    一.一抹前言 没有爱的日子,时间如指尖细沙,不知不觉就流逝了.写“CSS float浮动的深入研究.详解及拓展(一)”和“CSS float浮动的深入研究.详解及拓展(二)”似乎就在不久前,然而相隔差 ...

  5. FL2440 ubifs文件系统烧录遇到的问题——内核分区的重要性

    之前用的文件系统是initramfs的,这种文件系统是编译进内核里的,而开机之后内核是写在内存中的,所以每次掉电之后写进文件系统中的东西都会丢失.所以决定换成ubifs的文件系统.这种文件系统是跟内核 ...

  6. 最简单的PHP socket

    服务端 <?phperror_reporting(E_ALL);set_time_limit(0); $ip = "127.0.0.1";$port = 1935; func ...

  7. Druid对比Hadoop

    Druid对比Hadoop Hadoop 向世界证明, 花费很少的钱实现典型的解决方案, 将数据保存在一般的商用机器的数据仓库里是可行的. 当人们将自己的数据保存在Hadoop, 他们发现两个问题   ...

  8. 【angularJS】前后台分离,angularJS使用Token认证

    参考资料: [AngularJS系列(4)] 那伤不起的provider们啊~ (Provider, Value, Constant, Service, Factory, Decorator):htt ...

  9. selenium以手机模拟器方式打开Google浏览器

    使用chrome driver和chrome浏览器并进入chrome的 toggle device mode 模式,就可以很好的模拟手机端,下面直接上代码 public class runtest { ...

  10. BIN文件如何打开

    有些BIN文件用DAEMON Tools也无法打开 但是UltraISO可以打开,我们看到有Setup.exe,但是如果直接双击无法运行.我们可以先把所有东西都提取出来.   这样之后再点击Setup ...