C ++循环声明问题

时间:2017-11-01 04:53:18

标签: c++ forward-declaration

我遇到了圆形声明的问题,但到目前为止找到的所有解决方案都没有直接解决问题。

以下是一些代码:

Transformable.h

#pragma once

#include "TransformMatrix.h"

class Transformable {
public:
    TransformMatrix Transform;
    virtual void transform_callback();
};

TransformMatrix.h

#pragma once

#include "Transformable.h"

class Transformable;

class TransformMatrix {

private:

    Transformable *callback_object;

public:

    TransformMatrix();

    TransformMatrix(Transformable *cb_object);

Transforms.h

#pragma once
#include "Transformable.h"
#include "TransformMatrix.h"

A.H

class A: public Transformable {
public:
    A();

    /* We want a callback */
    TransformMatrix Transform = TransformMatrix(this);

我有一个实现基类的类,并使用一个特殊的头,所以我不必每次都包含两个文件。但我得到的错误是:

  

Transformable.h(7):错误C3646:'变换':未知覆盖
  Transformable.h(7):错误C4430:缺少类型说明符 - 假定为int。注意:C ++不支持default-int。

1 个答案:

答案 0 :(得分:0)

假设 TransformMatrix.h 可以将Transformable视为opaque类型,那么您可以简单地使用现有的前向声明,并从 TransformMatrix中删除#include Transformable.h .H 。然后,TransformMatrix的实施文件可能需要添加#include Transformable.h。 (这是从你问题下面的评论中收集的。)

但是,可能需要这种知识。然后,我们认为您的类依赖项存在设计缺陷,我们会尝试纠正它。

我们注意到Transformable有一个虚方法,但也希望包含TransformMatrix。可能,我们可以通过删除此依赖项来纠正您的问题。此时,由于您没有显示足够的代码来完全理解您的预期设计,因此可以进行猜测。

但是,如果我尝试尽可能地保持现有设计,我会将TransformMatrix转换为模板,并将Transformable抽象为模板参数。

#pragma once

template <typename T>
class TransformMatrixTemplate {
private:

    T *callback_object;

public:

    TransformMatrixTemplate();

    TransformMatrixTemplate(T *cb_object);

然后,使用{em> Transforms.h 中的typedef Transformable模板。

#pragma once
#include "Transformable.h"
#include "TransformMatrix.h"

typedef TransformMatrixTemplate<Transformable> TransformMatrix;