기본 클래스를 통한 종속성 공급
-
19-09-2019 - |
문제
부품 목록이 있으며 일부는 엔진에 대한 포인터가 필요합니다. 엔진 파트라고 부릅니다. 내가 원하는 것은 RTTI를 사용 하여이 엔진 파트를 찾아 엔진을 제공하는 것입니다.
문제는 엔진 파트를 설계하는 방법입니다. 아래에 설명 된 두 가지 옵션이 있으며 어느 옵션을 선택할지 모르겠습니다. 옵션 1은 가상 기능이 없기 때문에 더 빠릅니다. 데이터가 없으면 복제 () 함수가 필요하지 않기 때문에 옵션 2가 더 쉽습니다 () 객체 () 객체를 복제하려면 () 객체를 복제하려면 옵션 2가 더 쉽습니다.
이견있는 사람? 세 번째 옵션이 있습니까?
옵션 1:
class Part;
class EnginePart : public Part {
protected: Engine *engine
public: void SetEngine(Engine *e) {engine = e}
};
class Clutch : public EnginePart {
// code that uses this->engine
}
Option 2:
class Part;
class EnginePart : public Part {
public: virtual void SetEngine(Engine *e)=0;
};
class Clutch : public EnginePart {
private: Engine *engine;
public: void SetEngine(Engine *e) { engine = e; }
// code that uses this->engine
}
(실제 상황은 조금 더 관련되어 있습니다. EngineParts의 별도 목록을 만드는 것과 같은 간단한 솔루션을 사용할 수 없습니다).
감사
해결책 2
'부품이 엔진을 잡을 수 없다'는 답변이 실제로 솔루션이기 때문에 삭제됩니다.
완전한 엔진이 필요하지 않기 때문에 세 번째 방법을 찾았습니다.
class Part;
class EngineSettings {
private:
Engine *engine
friend class Engine;
void SetEngine(Engine *e) {engine = e}
public:
Value* GetSomeValue(params) { return engine->GetSomeValue(params); }
};
class Clutch : public Part, public EngineSettings {
// code that uses GetSomeValue(params) instead of engine->GetSomeValue(params)
}
getSomeValue ()는 엔진을 알 수없는 몇 가지 매개 변수가 필요하기 때문에 엔진 포인터가 옵션 1과 2에 주입 된 것처럼이 값을 "주입"할 수있는 방법은 없습니다 (well .. 가상 getParams ()도 제공하지 않는 한). .
이것은 클러치에서 엔진을 숨기고 코딩하는 한 가지 방법 만 제공합니다.
다른 팁
최신 컴파일러의 가상 기능 (지난 10 년 동안)은 특히 데스크탑 머신 대상의 경우 매우 빠르며 속도는 설계에 영향을 미치지 않아야합니다.
포인터/참조 투-베이스에서 복사하려면 VTable 포인터와 같은 구현 세부 사항을 포함하여 파생 클래스가 스스로 복사 할 수 있도록 허용해야하므로 클론 메소드가 여전히 필요합니다. (하나의 컴파일러/구현을 고수하는 경우,이를 기반으로 바로 가기를 가져 와서 다른 컴파일러를 사용하거나 컴파일러를 업그레이드하려고 할 때마다 재평가 할 수 있습니다.)
그것은 당신이 나열한 모든 기준을 없애기 때문에 선택 방법을 모르고 돌아 왔습니다. 그러나 그것은 쉽습니다. 가장 간단한 것을 선택하십시오. (즉,이 구성 예를 바탕으로 말할 수는 없지만 첫 번째라고 생각합니다.)