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改为

 1 #include "../../include/module2/ClsA.h"
 2
 3 #include <iostream>
 4
 5 using namespace ossoztelib::module2;
 6
 7 void ClsA::dosomething()
 8 {
 9     std::cout << "ossoztelib.module2.ClsA.dosomething" << std::endl;
10 }
11
12 ClsA::ClsA()
13 {
14     std::cout << "ossoztelib.module2.ClsA created" << std::endl;
15 }
16
17 ClsA::~ClsA()
18 {
19     std::cout << "ossoztelib.module2.ClsA destroyed" << std::endl;
20 }

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

总结:

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

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

代码:

main.cpp

 1 #include "include/module2/ClsA.h"
 2 #include "include/module1/ClsA.h"
 3
 4 int main()
 5 {
 6     ossoztelib::module1::ClsA a;
 7     ossoztelib::module2::ClsA b;
 8     a.dosomething();
 9     b.dosomething();
10     return 0;
11 }

module1.ClsA.h

 1 #ifndef OSSOZTELIB_MODULE1_CLSA_H
 2 #define OSSOZTELIB_MODULE1_CLSA_H
 3
 4 namespace ossoztelib {
 5
 6     namespace module1 {
 7
 8         class ClsA
 9         {
10             public:
11                 ClsA();
12                 ~ClsA();
13                 void dosomething();
14         };
15
16     }
17
18 }
19 #endif // OSSOZTELIB_MODULE1_CLSA_H

module1.ClsA.cpp

 1 #include "../../include/module1/ClsA.h"
 2
 3 #include <iostream>
 4
 5 using namespace std;
 6
 7 void ossoztelib::module1::ClsA::dosomething()
 8 {
 9     cout << "ossoztelib::module1::ClsA::dosomething()" << endl;
10 }
11
12 ossoztelib::module1::ClsA::ClsA()
13 {
14     cout << "ossoztelib::module1::ClsA::ClsA()" << endl;
15 }
16
17 ossoztelib::module1::ClsA::~ClsA()
18 {
19     cout << "ossoztelib::module1::ClsA::~ClsA()" << endl;
20 }

module2.ClsA.h

 1 #ifndef OSSOZTELIB_MODULE2_CLSA_H
 2 #define OSSOZTELIB_MODULE2_CLSA_H
 3
 4 namespace ossoztelib {
 5
 6     namespace module2 {
 7
 8         class ClsA
 9         {
10             public:
11                 ClsA();
12                 ~ClsA();
13                 void dosomething();
14         };
15
16     }
17 }
18
19 #endif // OSSOZTELIB_MODULE2_CLSA_H

module2.ClsA.cpp

 1 #include "../../include/module2/ClsA.h"
 2
 3 #include <iostream>
 4
 5 using namespace std;
 6
 7 void ossoztelib::module2::ClsA::dosomething()
 8 {
 9     cout << "ossoztelib.module2.ClsA.dosomething" << endl;
10 }
11
12 ossoztelib::module2::ClsA::ClsA()
13 {
14     cout << "ossoztelib.module2.ClsA created" << endl;
15 }
16
17 ossoztelib::module2::ClsA::~ClsA()
18 {
19     cout << "ossoztelib.module2.ClsA destroyed" << endl;
20 }
时间: 2024-11-10 00:02:10

c++ 用namespace实现java的package的功能的相关文章

Java 包(package)

为了更好地组织类,Java 提供了包机制,用于区别类名的命名空间. 包的作用 1.把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用. 2.如同文件夹一样,包也采用了树形目录的存储方式.同一个包中的类名字是不同的,不同的包中的类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别.因此,包可以避免名字冲突. 3.包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类. Java 使用包(package)这种机制是为了防止命名冲突,访问控制,提供搜索和定位

Java 包(package)详解

为了更好地组织类,Java提供了包机制,用于区别类名的命名空间. 包的作用 1 把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用. 2 如同文件夹一样,包也采用了树形目录的存储方式.同一个包中的类名字是不同的,不同的包中的类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别.因此,包可以避免名字冲突. 3 包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类. Java使用包(package)这种机制是为了防止命名冲突,访问控制,提供搜索和定位类(

Java - 25 Java 包(package)

Java 包(package) 为了更好地组织类,Java提供了包机制,用于区别类名的命名空间. 包的作用 1 把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用. 2 如同文件夹一样,包也采用了树形目录的存储方式.同一个包中的类名字是不同的,不同的包中的类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别.因此,包可以避免名字冲突. 3 包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类. Java使用包(package)这种机制是为了防止命名冲

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

Java Barcode Package控件是一款条码生成控件,包含所有的JavaBean,Applets,Servlets和类库可以使用于装有Java虚拟机的任何平台,包括Windows?, Linux, MacOS, Unix, Solaris, HP/UX, AS/400 和OS/390,用于集成自动化的条形码功能到internet应用程序,网站或自定义Java应用程序. 具体功能: 可在任何装有Java虚拟机的操作系统上生成条形码. 此产品的开发者授权是永久的且免收版权费用的. 支持ID

Java的package和import机制

一些人用了一阵子的Java,可是对于 Java 的 package 跟 import 还是不太了解.很多人以为原始码 .java 文件中的 import 会让编译器把所 import 的程序通通写到编译好的 .class 档案中,或是认为 import 跟 C/C++ 的 #include 相似,实际上,这是错误的观念. 让我们先了解一下,Java 的 package 到底有何用处. 其实,package 名称就像是我们的姓,而 class 名称就像是我们的名字.package 名称有很多 .

Java包(Package)的详细用法(转)

Java包(Package)的详细用法 http://wenwen.soso.com/z/q229375145.htm 当一个大型程序交由数个不同的程序人员开发时,用到相同的类名是很有可能的,那么如果发生了这样的事件我们该怎么办那?,在我们java程序开发中为了避免上述事件,提供了一个包的概念(package),那么既然有了这样一种方法能避免上述事件,那么我们怎样使用package那?,使用方法很简单我们只需要在我们写的程序第一行使用package关键字来声明一个包就行了,例如我们来声明一个名为

启动weblogic报错:string value &#39;2.4&#39; is not a valid enumeration value for web-app-versionType in namespace http://java.sun.com/xml/ns/javaee

启动报错: 原因:有人改动了web.xml的头 解决方法: 在web.xml中修改抬头为: <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance&

[工作积累] NDK通过Java获取package name 和version

////////////////////////////////////////////////////////////////////////// //Java code snippet //get APK's versionCode in AndroidManifest.xml public int getVersionCode() { int versionCode = 1; try{ PackageInfo packageInfo = this.getPackageManager().g

java读取package中的properties文件java.util.MissingResourceException

文件结构: /build/classes/d914/Hello.class /build/classes/d914/mess.properties /build/classes/d914/mess_zh_CN.properties /build/classes/d914/mess_en_US.properties 在eclipse中运行如下代码: package d914; import java.util.ResourceBundle; import java.util.Locale; pub