簡體   English   中英

C ++通告聲明問題

[英]C++ Circular Declaration Issues

我在使用循環聲明時遇到問題,但是到目前為止,找到的所有解決方案都不能直接解決問題。

這是一些代碼:

可變形的

#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);

轉換

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

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

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

我有一個實現基類的類,並使用特殊的頭,因此我不必每次都包含兩個文件。 但是我得到的錯誤是:

Transformable.h(7):錯誤C3646:“ Transform”:未知覆蓋
Transformable.h(7):錯誤C4430:缺少類型說明符-假定為int。 注意:C ++不支持default-int。

假定TransformMatrix.h可以將Transformable視為不透明類型,則可以簡單地使用現有的前向聲明,並從TransformMatrix.h中刪除#include Transformable.h Transformable.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);

然后,在Transforms.h中使用Transformable typedef模板。

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

typedef TransformMatrixTemplate<Transformable> TransformMatrix;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM