C++ “预定义”和使用名称空间和std::shared\u ptr的正确方法是什么?

C++ “预定义”和使用名称空间和std::shared\u ptr的正确方法是什么?,c++,class,namespaces,shared-ptr,C++,Class,Namespaces,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>

我一直在努力寻找类似于这个问题的东西,所以我将在这里提问

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

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"
类别2.h

namespace myNamespace
{
    class Class2
    {
        /*variables and functions*/
    };
}
如果这听起来有点混乱,我提前道歉。。。
基本上,我想知道是否可以预定义命名空间myNamespace中的类,同时声明共享的\u ptr。如果这是可能的,我将如何做到这一点并在源代码中正确使用它们?

如果您希望类型定义与我建议的类属于同一名称空间,请执行以下操作:

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<Class1> ClassPtr1;
    typedef std::tr1::shared_ptr<Class2> ClassPtr2;
}

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

预先声明类或函数等。。。在命名空间中,可以执行以下操作:

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;
    };
}

但是共享的ptr必须被完全包含并且不能被预先声明,因为共享的ptr现在是成员变量,类需要知道它们的完整大小。

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

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;
    };
}

但是共享的ptr必须被完全包含并且不能被预先声明,因为共享的ptr现在是成员变量,类需要知道它们的完整大小。

不要预先定义任何东西,它只会降低代码的可读性。通过使用名称空间说明符,每个人都可以准确地知道您的类型,而不必费力地阅读其他代码。但这只是我的观点,不要预先定义任何东西,它只会降低代码的可读性。通过使用名称空间说明符,每个人都可以准确地知道您的类型,而不必费力地阅读其他代码。但这只是我的观点,我希望你能迅速而详细地回答!我正在测试这个结果,通过一些快速测试,我能比自己更成功地使用它。非常感谢:D编辑:我也非常喜欢通过define的更有组织的方法。我已经用过了,但我不认为它会那样工作。@Molma:好的,很高兴它有帮助:-谢谢你快速详细的回复!我正在测试这个结果,通过一些快速测试,我能比自己更成功地使用它。非常感谢:D编辑:我也非常喜欢通过define的更有组织的方法。我已经用过了,但我不认为它会那样工作。@Molma:好的,很高兴它有帮助:-