我遇到了圆形声明的问题,但到目前为止找到的所有解决方案都没有直接解决问题。
以下是一些代码:
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。
答案 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;