나는 클래스가 서로에 따라 교차하는 매우 복잡한 클래스 계층 구조를 가지고있다 : C와 A의 인스턴스를 각각 반환하는 메서드를 포함하는 두 개의 추상 클래스 A와 C가있다. 상속 된 클래스에서 나는 상속 관계 선을 앞으로 선언하는 방법을 모르기 때문에이 경우에는 문제가되는 공동 변형 유형을 사용하려고합니다.C++ : 캐스팅하지 않고 상속 된 클래스에서 "잘못된 공변 반환 유형"을 방지하려면 어떻게해야합니까?
컴파일러가 D가 C의 하위 클래스라는 것을 알지 못하므로 'test.cpp : 22 : error :'virtual D * B :: outC() ' "오류에 대한 공변 반환 유형이 잘못되었습니다.
class C;
class A {
public:
virtual C* outC() = 0;
};
class C {
public:
virtual A* outA() = 0;
};
class D;
class B : public A {
public:
D* outC();
};
class D : public C {
public:
B* outA();
};
D* B::outC() {
return new D();
}
B* D::outA() {
return new B();
}
B :: outC()의 반환 유형을 C *로 변경하면 예제가 컴파일됩니다. 상속 된 클래스에서 B * 및 D *를 반환 유형으로 유지할 수있는 방법이 있습니까? (방법이 있다는 것이 내게 직관적일까요?)
정말 그 유형이 얽히고 필요합니까? (커플 링이라고하는 것은 조금 짧을 수도 있습니다.) –
때로는 언어의 문제가 아니기 때문에 우리가 사용하려고 시도하는 방식에 문제가 있습니다. 두 계층 구조가 너무 깊숙이 결합되어 있다면, 어쨌든 서로 없이는 일할 수없는 것처럼 보일 수 있으므로 하나의 계층 구조 (A와 C, B와 D)를 결합하는 것이 더 나을 것입니다. . –
글쎄, 나는 두 종류의 클래스가있다 : 태스크에 대한 스펙과 실제로 태스크를 실행하는 executor (여러 개의 스레드를 시작 함). 스펙 자체는 태스크의 팩토리이어야하며 모든 실행 프로그램은 스펙에 액세스해야합니다. 그리고 그들의 작업에 다양한 사양이 있습니다. 따라서 집행자는 사양을 래핑하므로 커플 링은 한 방향으로 만 강하고 다른 방향으로는 단지 공장 방법입니다. – Searles