2017-11-01 1 views
0

순환 선언에 문제가 있습니다. 그러나 지금까지 발견 된 모든 해결책으로는 문제가 직접 해결되지 않습니다. 여기 C++ Circular Declaration Issues

일부 코드 :

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를 지원하지 않습니다.

+5

TransformMatrix.h 파일에서 #include "Transformable.h"지시문을 제거해야합니다. –

+0

나는 또한 이것을 얻으려고했다 : '1> TransformMatrix.cpp (141) : 오류 C2027 : 정의되지 않은 유형 'Transformable'의 사용 1> TransformMatrix.h (8) : 참고 : 'Transformable' 1> TransformMatrix.cpp (141) : 오류 C2227 : 왼쪽의 '-> transform_callback'이 클래스/구조체/공용체/제네릭 유형을 가리켜 야합니다. –

+1

TransformMatrix.cpp 파일에 #include "Transformable.h"를 추가해야하는 것처럼 들립니다. –

답변

0

TransformMatrix.h이 불투명 한 유형으로 Transformable 처리 할 수 ​​있습니다 당신은 단순히 앞으로 기존 선언을 사용할 수 있으며, TransformMatrix.h에서 #include 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.hTransformable를 사용 typedef 템플릿.

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

typedef TransformMatrixTemplate<Transformable> TransformMatrix;