首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++通知声明问题

C++通知声明问题
EN

Stack Overflow用户
提问于 2017-11-01 04:53:18
回答 1查看 147关注 0票数 0

我有一个关于通告声明的问题,但是到目前为止,所有的解决方案都没有直接解决这个问题。

以下是一些代码:

Transformable.h

代码语言:javascript
复制
#pragma once

#include "TransformMatrix.h"

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

TransformMatrix.h

代码语言:javascript
复制
#pragma once

#include "Transformable.h"

class Transformable;

class TransformMatrix {

private:

    Transformable *callback_object;

public:

    TransformMatrix();

    TransformMatrix(Transformable *cb_object);

Transforms.h

代码语言:javascript
复制
#pragma once
#include "Transformable.h"
#include "TransformMatrix.h"

A.h

代码语言:javascript
复制
class A: public Transformable {
public:
    A();

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

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

H(7):错误C3646:'Transform':未知覆盖 H(7):错误C4430:缺少类型说明符- int假设。注意: C++不支持默认-int。

EN

回答 1

Stack Overflow用户

发布于 2017-11-01 05:18:07

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

然而,可能需要这种知识。然后,我们认为类依赖项中存在一个设计缺陷,我们试图纠正它。

我们注意到Transformable有一个虚拟方法,但也希望包含一个TransformMatrix。很可能,我们可以通过删除此依赖项来纠正您的问题。在这一点上,这将是猜测工作,因为您没有显示足够的代码来完全理解您的预期设计。

但是,如果我试图尽可能地维护您现有的设计,我会将TransformMatrix转换为模板,并将Transformable抽象为模板参数。

代码语言:javascript
复制
#pragma once

template <typename T>
class TransformMatrixTemplate {
private:

    T *callback_object;

public:

    TransformMatrixTemplate();

    TransformMatrixTemplate(T *cb_object);

然后,使用Transforms.h中的typedef使用Transformable实现模板。

代码语言:javascript
复制
#pragma once
#include "Transformable.h"
#include "TransformMatrix.h"

typedef TransformMatrixTemplate<Transformable> TransformMatrix;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47048454

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档