对于错误的问题表达表示抱歉,找不到更好的方法来简要描述我的问题:
我有一个带有纯虚方法的A类,它返回一个B类型的对象。 B类有一个成员变量,它是指向A类对象的指针。 有没有办法实现这个目标?
示例:
class A {
public:
B mymethod() const = 0;
}
struct B {
std::shared_ptr<A> mypointer;
}
如果我将文件包含在彼此中,编译器会告诉我在此范围内未声明文件。我怎么能避免这个?
答案 0 :(得分:5)
std::shared_ptr
旨在替换原始指针 - 因此,为了提供兼容的语义,它也可以在没有完整类型定义的情况下使用。
实施说明
在典型的实现中,
std::shared_ptr
只包含两个指针:
- 存储的指针(由
get()
返回的指针)- 指向控制块的指针
所以,前向声明就足够了:
<强> A.H 强>:
#include "B.h"
class A
{
public:
B mymethod() const = 0; //returns by value, so full definition of B is required (*)
};
<强> B.h 强>:
class A; //Forward declare A
struct B
{
std::shared_ptr<A> mypointer;
};
(*)事实上,在您的情况下,可能不需要此类包含,因为它只是返回B
的函数的声明。只要您将声明(.h
)和实际正文(.cpp
)或简单地 forward-declare 函数原型分开,特定类型的标题应仅包含在源文件中,使用它们。