2013-02-28 51 views
1

我一直有一个很难试图找到类似这样的问题,任何事情,所以不是我会问这里。什么是“预定义”,并使用名称空间和std :: shared_ptr的正确方法是什么?

我有十几源/头文件的项目。我遇到的主要问题是预定义了我在名称空间中创建的类。代码如下:

“GlobalIncludes.h”

/*include dependencies and library headers...*/ 

/*[Note 1]How would I predefine the classes inside namespaces?*/ 

typedef std::tr1::shared_ptr<Class1> ClassPtr1;//[Note 2] 
typedef std::tr1::shared_ptr<Class2> ClassPtr2;//[Note 2] 

/*[Note 2]What is the correct way to predefine the shared_ptr's?*/ 

#include "Class1.h" 
#include "Class2.h" 

“Class1.h”

namespace myNamespace 
{ 
    class Class1 
    { 
     /*variables and functions*/ 
     void doSomething(...); 
     Class2 exampleObject; 
    }; 
} 

“Class2.h”

namespace myNamespace 
{ 
    class Class2 
    { 
     /*variables and functions*/ 
    }; 
} 

我提前道歉如果这听起来有点混乱...... 基本上我想知道是否可以预先定义是在类namespace myNamespace,并在同一时间宣布shared_ptr的。如果这是可能的,我将如何做到这一点,并在源中正确使用它们?

+0

不要预先定义任何东西,它只会让你的代码变得不可读。通过使用名称空间说明符,每个人都可以确切地知道你的类型是什么,而不需要通过其他代码涉水。 (但这只是我的意见) – inf 2013-02-28 18:08:00

回答

6

如果你想要的类型的定义是相同的命名空间中的类(我认为)的一部分:

namespace my_namespace 
{ 
    class Class1; 
    class Class2; 

    typedef std::tr1::shared_ptr<Class1> ClassPtr1; 
    typedef std::tr1::shared_ptr<Class2> ClassPtr2; 
} 

#include "Class1.h" 
#include "Class2.h"  

否则,如果你希望你的指针类型的定义是全局命名空间

的一部分
namespace my_namespace 
{ 
    class Class1; 
    class Class2; 
} 

typedef std::tr1::shared_ptr<my_namespace::Class1> ClassPtr1; 
typedef std::tr1::shared_ptr<my_namespace::Class2> ClassPtr2; 

#include "Class1.h" 
#include "Class2.h"  

可能的话,你可以做的事情有一个宏(同一个命名空间)更为紧凑:

#define DECLARE_PTR_ALIAS(N, C, P) \ 
    namespace N { class C; 
    typedef std::tr1::shared_ptr<C> P; } \ 

或(不同的命名空间):

#define DECLARE_PTR_ALIAS(N, C, P) \ 
    namespace N { class C; } \ 
    typedef std::tr1::shared_ptr<N::C> P; 

这更简单地定义指针别名几类:

DECLARE_PTR_ALIAS(my_namespace, Class1, ClassPtr1) 
DECLARE_PTR_ALIAS(my_namespace, Class2, ClassPtr2) 
... 
+0

感谢您的快速和详细的答复!我正在进行测试以查看结果。 – Molma 2013-02-28 19:08:51

+0

@Molma:不客气,让我知道它是否有帮助! – 2013-02-28 19:12:51

+0

通过一些快速测试,我可以比自己更成功地使用它。非常感谢:D编辑:我也很喜欢通过'#define'更有组织的方法。我已经使用它了,但我认为它不会那样工作。 – Molma 2013-02-28 19:27:27

0

预先声明类(或功能,或等...)在命名空间中,你这样做:

namespace myNamespace 
{ 
    class myClassA; 
    class myClassB; 
} 

如果我只是预先声明一个类,我喜欢把它放在一个行:(只是个人喜好)

namespace myNamespace { class myClassA; } 

在你的榜样,但是,1类是已经在一个命名空间,所以你不妨做这样的:

namespace myNamespace 
{ 
    class Class2; 

    class Class1 
    { 
     /*variables and functions*/ 
     void doSomething(...); 
     Class2 exampleObject; 
    }; 
} 

唯一的问题是Class1的有Class2中为成员变量。您不能使用预先声明的对象作为成员,因为编译器需要知道将对象的大小嵌入到类中的大小。您只能使用预先声明的对象作为引用或指针,因为它们具有固定大小。

如果进行class2的智能指针,那么你可以这样做:

namespace myNamespace 
{ 
    class Class2; 

    typedef std::shared_ptr<Class2> Class2ptr; 

    class Class1 
    { 
     /*variables and functions*/ 
     void doSomething(...); 
     Class2ptr exampleObject; 
    }; 
} 

但shared_ptr的具有完全包括在内,不能预先宣布的,因为shared_ptrs现在的成员变量和该班级需要知道他们的全尺寸。

相关问题