문제

부품 목록이 있으며 일부는 엔진에 대한 포인터가 필요합니다. 엔진 파트라고 부릅니다. 내가 원하는 것은 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 포인터와 같은 구현 세부 사항을 포함하여 파생 클래스가 스스로 복사 할 수 있도록 허용해야하므로 클론 메소드가 여전히 필요합니다. (하나의 컴파일러/구현을 고수하는 경우,이를 기반으로 바로 가기를 가져 와서 다른 컴파일러를 사용하거나 컴파일러를 업그레이드하려고 할 때마다 재평가 할 수 있습니다.)

그것은 당신이 나열한 모든 기준을 없애기 때문에 선택 방법을 모르고 돌아 왔습니다. 그러나 그것은 쉽습니다. 가장 간단한 것을 선택하십시오. (즉,이 구성 예를 바탕으로 말할 수는 없지만 첫 번째라고 생각합니다.)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top