我一直很难找到类似这个问题的东西,所以我会问这里。
我有一个包含十几个源/头文件的项目。我遇到的主要问题是预定义我在命名空间中创建的类。代码如下:
“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 :(得分: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)
...
答案 1 :(得分: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_ptrs现在是成员变量,类需要知道他们的完整大小。