我想基本上做以下几点:
class Base{
void dosomestuff(Derived instanceOfDerived)
{
//Something
}
};
class Derived : public Base{
//Something
};
Base需要包含Derived,但要声明Derived它需要首先声明Base。前向声明不起作用,因为我不想使用指针。
现在我的问题是:如何在没有指针的情况下实现这一目标?这甚至可能吗?或者是使instanceOfDerived成为指针的唯一可能性吗?
答案 0 :(得分:3)
你最好做点什么:
class Derived;
class Base{
void dosomestuff(Derived& instanceOfDerived)
{
//Something
}
};
class Derived : public Base{
//Something
};
我甚至会将方法dosomestuff
的主体移动到源cpp代码,您可以在其中包含derived.h和base.h
base.h看起来像:
#ifndef BASE_H_
#define BASE_H_
class Derived;
class Base{
void dosomestuff(const Derived& instanceOfDerived);
};
#endif
derived.h:
#ifndef DERIVED_H_
#define DERIVED_H_
#include "base.h"
class Derived : public Base{
//Something
};
#endif
base.cpp:
#include "base.h"
#include "derived.h"
void Base::dosomestuff(const Derived &instanceOfDerived) {
//Something
}
答案 1 :(得分:2)
该问题的原始版本询问是否Base
暂停Derived
作为数据成员。这显然是不可能的。它是同样的无限递归问题(Derived
包含一个Base
子对象,因此Base
会递归地包含它自己,并且它将一直是乌龟。)
修订后的问题询问Base
的成员函数是否采用类型Derived
的按值参数。这完全有可能。您需要Derived
的前向声明,并推迟成员函数的定义,直到实际定义Derived
之后:
class Derived;
class Base{
void dosomestuff(Derived instanceOfDerived); // declaration only
};
class Derived : public Base{
//Something
};
// out-of-class definition, so making it explicitly inline
// to match the in-class definition semantics
inline void Base::dosomestuff(Derived instanceOfDerived) {
//Something
}
答案 2 :(得分:0)
这意味着如果你真的想这样做,你的继承模型是没有意义的。记住"确保公共继承模型是一个。' " http://debian.fmi.uni-sofia.bg/~mrpaff/Effective%20C++/EC/EI35_FR.HTM 如果你使它们具有继承关系,那意味着Derived是一个Base,而不是" Derived是Base"的一部分。 您可以创建2个类来执行此操作,而不是使它们具有继承关系。