2017-11-21 3 views
0

저는 현재 vertex 데이터를 렌더링하고 구성하기위한 많은 함수와 클래스를 작성하고 있습니다. 또한이 함수와 클래스를 .lib으로 제공하려고합니다.
이 함수와 클래스는 .lib의 생성시 (std::vector<Vertex>을 사용하기 때문에) struct vertex이 어떻게 보이는지 (즉, 그 정의가 무엇인지) 알아야합니다.
그러나 vertex의 속성은 그릴 모델에 따라 달라질 수 있으므로 라이브러리 기능과 클래스를 다른 vertex 정의에 사용하고 싶습니다..lib에 정의되지 않은 클래스/구조체 사용

vertex 구조를 결정하지 않고 .lib을 빌드하는 방법이 있습니까?

+0

''Vertex''를 가능한 모든 데이터의 합집합으로 만들지 않는 한, 각 정점 조직마다 고유 한 구조체가 필요하므로''std :: vector <>''의 고유 한 인스턴스가 필요합니다. 유연한 레이아웃 (즉, 정점 버퍼)과 함께 '일반 바이너리 블롭'을 사용하고 입력 레이아웃 설명과 함께''std :: vector ''으로 전달할 수 있습니다. 몇 가지 예를 보려면 [DirectXMesh] (https://github.com/Microsoft/DirectXMesh)와 [DirectXTK] (https://github.com/Microsoft/DirectXTK)를 참조하십시오. –

답변

0

내 원래 대답은 당신이 사용하지 않는 템플릿이라고 가정합니다. 참고 사항 : 유형이 Vertex 인 템플릿을 사용하면 라이브러리가 헤더 전용 라이브러리가되어야합니다. 이 옵션을 진지하게 고려해야합니다.

이 작업을 원하지 않으면 인터페이스 접근 방식이 효과적 일 수 있습니다 (성능상의 불이익에 만족한다면). 예를 들어, Vertex에 대한 : 아마도 그런

class Vertex 
{ 
public: 
    virtual double getX() = 0; 
    virtual double getY() = 0; 
    ... 
}; 

을 만들기위한 공장 : 당신의 라이브러리가 일부 같은 코드 가질 수

class VertexFactory 
{ 
public: 
    virtual Vertex* createVertex(double x, double y) = 0; 
}; 

:

void doStuff(VertexFactory* fac) 
{ 
    std::vector<Vertex*> vertices; 

    for(int i = 0, i < 100; ++i) 
     vertices.push_back(fac->createVertex(i, i)); 

    //then do some other stuff 
} 

그리고 당신의 클라이언트 코드를 수 다음과 같이 사용하십시오 :

class MyVertex : public Vertex 
{ 
public: 
    double getX() override { return 1.0; } 
    double getY() override { return 2.0; } 
}; 

class MyVertexFactory : public VertexFectory 
{ 
public: 
    MyVertex* createVertex(double x, double y) override 
    { 
     return new MyVertex; 
    } 
}; 

int main(int argc, const char** argv) 
{ 
    MyVertexFactory fac; 
    doStuff(&fac); 
} 
+0

내 정점은 단순한 구조체입니다. 지금 템플릿이 사용되지 않습니다 – XoR

0

포인터의 벡터로 만들 수 있습니다 (또는 스마트 포인터이지만 인터페이스를 게시해야 함). 또 다른 옵션은 라이브러리에서 가져온 객체가 실제 객체에 대한 스텁이라는 것입니다. 대체 라이브러리는 "핌플 (pimpl)"내에서 작동해야합니다. 그러나 많은 함수가 객체 지향적이지는 않습니다. 인터페이스에 대한 스마트 포인터 벡터를 가질 수 있도록 인터페이스 클래스 게시를 고려할 수 있습니다.

+0

그래서 std :: vector 을 사방에 사용해야합니다. 그래야 정점을 선언 할 수 있으며 따라서 클래스는 .lib를 만들 때 꼭지점 정의를 알 필요가 없습니까? – XoR

+0

예. 그게 효과가있다. 자신 만의 새로운 방법과 파괴 방법을 제공해야합니다. 이것은 오래된 skool C 라이브러리입니다. –

관련 문제