C++ “预定义”和使用名称空间和std::shared\u ptr的正确方法是什么?
我一直在努力寻找类似于这个问题的东西,所以我将在这里提问 我有一个项目,有十几个源/头文件。我面临的主要问题是预定义我在名称空间中创建的类。代码如下: GlobalIncludes.hC++ “预定义”和使用名称空间和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>
/*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:好的,很高兴它有帮助:-