"预定义"和使用命名空间和std :: shared_ptr的正确方法是什么?

Mol*_*lma 1 c++ namespaces class 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"
Run Code Online (Sandbox Code Playgroud)

"Class1.h"

namespace myNamespace
{
    class Class1
    {
        /*variables and functions*/
        void doSomething(...);
        Class2 exampleObject;
    };
}
Run Code Online (Sandbox Code Playgroud)

"Class2.h"

namespace myNamespace
{
    class Class2
    {
        /*variables and functions*/
    };
}
Run Code Online (Sandbox Code Playgroud)

如果这听起来有点令人困惑,我提前道歉......基本上我想知道是否有可能预定义namespace myNamespace同时声明shared_ptr的类.如果可以,我该如何做,并在源中正确使用它们?

And*_*owl 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"    
Run Code Online (Sandbox Code Playgroud)

否则,如果您希望指针类型定义成为全局命名空间的一部分

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"    
Run Code Online (Sandbox Code Playgroud)

可能,您可以使用宏(相同的命名空间)使事情变得更紧凑:

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

或(不同的命名空间):

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

这样可以更简单地为几个类定义指针别名:

DECLARE_PTR_ALIAS(my_namespace, Class1, ClassPtr1)
DECLARE_PTR_ALIAS(my_namespace, Class2, ClassPtr2)
...
Run Code Online (Sandbox Code Playgroud)