1

작은 3D 엔진을 재구성하려고합니다. 매우 작기 때문에 한 파일에만 모든 파일을 배치합니다. 지금, 나는 다른 프로젝트에 다른 모듈을 분산시키고 dll로 빌드 할 수 있도록 인터페이스로 재구성하려고합니다. 프레임 워크 코드의 기본 설계에 많은 어려움을 겪었습니다. 작은 엔진의 'Object Hierarchy'를 디자인하고 싶습니다. 이전 작업에서 실현되었습니다. 예 :C++ 인터페이스 (순수 가상 클래스)/다중 상속/가상 상속에 관한 디자인 qustion

Object 
Component 
SceneComponent 
StaticMeshComponent/SkelMeshComponent 
D3DSkelComponent 
... 

그러나 직접 구현됩니다. 지금, 내가, 내가 (테스트) 기본 인터페이스를 설계해야 인터페이스 (순수 가상 클래스)를 사용하려면 : 내가 그들을 구현하려고 할 때

#include <cstdio> 
#include <iostream> 
#include <string> 
using namespace std; 

class IObject 
{ 
public: 
    virtual std::string GetName() = 0; 
}; 

class IMesh : public IObject 
{ 
public: 
    virtual void Draw() = 0; 
}; 

class IStaticMesh : public IMesh 
{ 
public:  
    virtual void BuildSomeMesh() = 0; 
}; 

class ISkeletalMesh : public IMesh 
{ 
public: 
    virtual void PlayAnim(const std::string& strAnimName) = 0; 
}; 

class ID3DSkeletalMesh : public ISkeletalMesh 
{ 
public: 
    virtual void LoadD3D(const std::string& strD3D) = 0; 
}; 

가 좋아처럼 보이지만, 나는이 사실을 발견했습니다 불가능한 사명이 되어라. 첫째, 내가 IObject의 템플릿 클래스 또는 일반 클래스, 예를 들어 작성할 수 있습니다

template < typename TBase > 
class TObject : public TBase 
{ 
public: 
    virtual std::string GetName() 
    { 
     return m_strTest; 
    } 

    std::string m_strTest; 
}; 

이 TObject의에 기반을, 나는 CMesh을 구현할 수 있습니다

class CMesh : public TObject<IMesh> 
{ 
public: 
    virtual void Draw() 
    { 
     cout<<"draw mesh" <<endl; 
    } 
}; 
    IMesh* pMesh = new CMesh(); // ok 
    IObject* pObj = pMesh;  // ok 

지금까지, 그것은 잘 작동합니다. 그러나 CStaticMesh/CSkeletalMesh/CD3DSkeletalMesh를 구현하는 방법은 무엇입니까? 어쩌면이 같은 을 :

class CStaticMesh : public CMesh, public IStaticMesh 
{ 
public: 

}; 

하지만 난이 개 IObject 기본 클래스, 그래서 내가 "가상 공공 XXX"에, 나쁜 보이는 모든 "공공 XXX"를 변경해야합니다. 또 다른 질문은, CStaticMesh이 IStaticMesh의 모든 가상 멤버 함수를 구현해야합니다입니다은 다음과 같습니다 CStaticMesh의 기본 통화입니다 CMesh에 그리기가

virtual void Draw() = 0; 
virtual void BuildSomeMesh() = 0; 

경우에도 마찬가지입니다. 좋아, 어쩌면 나는 TMesh 필요

template < typename TBase > 
class TMesh : public TObject<TBase> 
{ 
public: 
    virtual void Draw() 
    { 
     cout<<"draw mesh" <<endl; 
    } 
}; 

과 같은 CStaticMesh을 구현 :

이 좋아 보이는
class CStaticMesh : public TMesh<IStaticMesh> 
{ 
public: 
    virtual void BuildSomeMesh() 
    { 
     cout<<"Build Some Mesh!"<<endl; 
    } 
}; 

,하지만 어떻게 CD3DSkeletalMesh을 implment하기 위해? TSkeletalMesh를 만드시겠습니까? ok, 그것은 미쳤다! !!

나는 이것이 생각합니다. 이 디자인의 실수입니까? 이 딜레마를 피하기 위해 디자인 아이디어를 어떻게 바꿀 것인가? 인터페이스의 상속 계층 구조를 유지하고 쉽게 구현할 수있는 아이디어를 알고 계십니까? 가상 상속을 많이 사용하는 경우 성능이 좋지 않습니까?

답변

0

앞서 언급 한 것처럼 가상 상속을 통해이를 해결할 수 있습니다. 이렇게하면 계층에 다중 상속 된 인터페이스 클래스의 인스턴스가 하나만 만들어집니다.

먼저 인터페이스 :

다음
class IObject 
{ 
public: 
    virtual std::string GetName() = 0; 
}; 

class IMesh : virtual public IObject 
{ 
public: 
    virtual void Draw() = 0; 
}; 

class IStaticMesh : virtual public IMesh 
{ 
public:  
    virtual void BuildSomeMesh() = 0; 
}; 

class ISkeletalMesh : virtual public IMesh 
{ 
public: 
    virtual void PlayAnim(const std::string& strAnimName) = 0; 
}; 

class ID3DSkeletalMesh : virtual public ISkeletalMesh 
{ 
public: 
    virtual void LoadD3D(const std::string& strD3D) = 0; 
}; 

구현이의 성능에 미치는 영향에 대한

class CObject : virtual public IObject 
{ 
public: 
    std::string GetName() 
    { 
     return m_strTest; 
    } 

    std::string m_strTest; 
}; 

class CMesh : public CObject, virtual public IMesh 
{ 
public: 
    void Draw() 
    { 
     cout<<"draw mesh" <<endl; 
    } 
}; 

class CStaticMesh : public CMesh, virtual public IStaticMesh 
{ 
public: 
    void BuildSomeMesh() 
    { 
     cout<<"Build Some Mesh!"<<endl; 
    }  
}; 
... 

this question 봐.

관련 문제