我不是C ++的新手,但我也绝对不是专家......)
我试图理解继承是如何工作的。我有一个派生自基类的类:
class Base {}
和
#include "Base.h"
class Derived : public Base {}
在我的基类中,我正在尝试创建一个返回指向Derived类对象的指针的静态方法:
#include "Derived.h"
class Base {
static Derived* getDerived();
}
现在我想,因为这是一个静态成员,我可能能够逃脱它,但我得到编译时问题抱怨Derived类不知道Base对象是什么,即使我包括Base 。Der在派生类中。我也知道循环依赖,但是因为我试图返回指向对象的指针,我认为编译器不需要#include“Derived.h”,但它似乎确实如此。
任何关于为什么这不是要走的路,我能做什么的方向将非常感谢!
(我目前在Java中这样做)
答案 0 :(得分:3)
是的,对于您的情况(只返回指向对象的指针),编译器不需要#include "Derived.h"
,只需要forward declaration:
class Derived;
class Base {
static Derived* getDerived();
};
答案 1 :(得分:2)
以下代码回答了您的问题,但我根本不知道您为什么要这样做。
在我看来, base 类的重点是提供足以满足您需求的界面,因此可以在不了解派生类型的情况下工作。< / p>
#ifndef BASE_H
#define BASE_H
class Derived; // Forward declaration to avoid including 'Derived.h'
class Base
{
public:
virtual ~Base() {}
// Non-static function so that it has access to 'this'
Derived* getDerived();
};
#endif
#include "Base.h"
#include "Derived.h"
Derived* Base::getDerived()
{
return dynamic_cast<Derived*>(this);
}
#ifndef DERIVED_H
#define DERIVED_H
#include "Base.h"
class Derived : public Base
{
public:
virtual ~Derived() override {}
};
#endif
#include "Derived.h"
#include <iostream>
int main()
{
Derived d;
Base* b = &d;
std::cout << &d << " : " << b->getDerived() << "\n";
return 0;
}
答案 2 :(得分:0)
这是循环参考。
要使用Class-Base,您需要知道Class-Derived,因为它包含具有Class-Derived返回类型的静态函数。
要使用Class-Derived,您需要知道Class-Base,因为它是从Class-Base派生的