C ++继承和包含

时间:2015-04-02 01:47:53

标签: c++ oop inheritance circular-dependency

我不是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中这样做)

3 个答案:

答案 0 :(得分:3)

是的,对于您的情况(只返回指向对象的指针),编译器不需要#include "Derived.h",只需要forward declaration

class Derived;
class Base {
     static Derived* getDerived();
};

DEMO:http://ideone.com/ONUHGc

答案 1 :(得分:2)

以下代码回答了您的问题,但我根本不知道您为什么要这样做

在我看来, base 类的重点是提供足以满足您需求的界面,因此可以在不了解派生类型的情况下工作。< / p>

Base.h

#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

Base.cpp

#include "Base.h"

#include "Derived.h"

Derived* Base::getDerived()
{
    return dynamic_cast<Derived*>(this);
}

Derived.h

#ifndef DERIVED_H
#define DERIVED_H

#include "Base.h"

class Derived : public Base
{
public:
    virtual ~Derived() override {}
};

#endif

的main.cpp

#include "Derived.h"

#include <iostream>

int main()
{
    Derived d;
    Base* b = &d;

    std::cout << &d << " : " << b->getDerived() << "\n";

    return 0;
}

答案 2 :(得分:0)

这是循环参考。

  1. 要使用Class-Base,您需要知道Class-Derived,因为它包含具有Class-Derived返回类型的静态函数。

  2. 要使用Class-Derived,您需要知道Class-Base,因为它是从Class-Base派生的