1

我一直很难找到与这个问题类似的东西,所以我会在这里问。

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

“全球包括.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"

“类 1.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's. 如果这是可能的,我将如何做到这一点并在源代码中正确使用它们?

4

2 回答 2

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)
...
于 2013-02-28T18:07:55.767 回答
0

要在命名空间中预先声明类(或函数等),请执行以下操作:

namespace myNamespace
{
    class myClassA;
    class myClassB;
}

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

namespace myNamespace { class myClassA; }

但是,在您的示例中, Class1 已经在命名空间中,因此您不妨这样做:

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_ptr 现在是成员变量并且类需要知道它们的完整大小。

于 2013-02-28T18:36:11.320 回答