2017-09-13 16 views
-1

이 클래스 템플릿을 사용한다고 가정 해 봅시다. 그리드를 변경할 수 없으며, 더 어려운 개체를 나타냅니다. 변경하고 싶지 않습니다.하나의 클래스 멤버 배열에 임의의 수의 다른 클래스를 저장하는 C++

이제 my_grids 배열을 소유 한 새 클래스 템플릿 (multi_grid)을 사용하겠습니다. 나는 my_grids에 다른 그리드와 같은 (의사 코드)를 저장하려면 :

my_grids[0]=grid<x*1,y*1>, 
my_grids[1]=grid<x*2,y*2> 
my_grids[n]=grid<(x<<n),(y<<n)> 

내 생각은 my_grids에 대한 * 무효 사용하고 생성자를 통해 그것을 설정하는 것입니다. 내 문제는 생성자에서 시작합니다

  1. 이 가능한 아이디어의 개념 :

    template<int x, int y, int degree> 
    class multi_grid{ 
    public: 
    void* my_grids[degree]; 
    
    ~multi_grid(){}; 
    multi_grid(){ 
        create_grid<degree-1>(); 
        } 
    
    template<int grid_number> 
    void create_grid(void){ 
        my_grid[grid_number]=new grid<(x<<grid_number), (y<<grid_number)>; 
        create_grid<grid_number-1>(); 
        } 
    
    }; 
    
    template<int x, int y, int degree> 
    template<int grid_number> 
    void multi_grid<x, y, degree>::create_grid<-1>(){} 
    

    나는이 개 질문이?

  2. 첫 번째 대답이 사실이라면 어떻게해야합니까? 간단한 for_loop로 시작 했으므로 문제가됩니다. ++는 고정되어 있지 않기 때문입니다. 그래서 템플릿 재귀를 시도해 보았습니다. "shadows template parm"또는 "function template partial specialization 'create_grid < -1>'허용되지 않습니다 '와 같은 문제가 발생했습니다.

나는 그것을 풀기 위해 전체를 시도했지만 알아낼 수 없었다. 미리 감사드립니다.

+3

_ "내 생각은 void *"_ 아주 나쁜 생각입니다. – user0042

+0

@ user0042 알아, 더 좋은 생각이야? – Markus

+2

'Boost.TypeErasure'와'dyno'와 같은 라이브러리가 있습니다.이 라이브러리는 전통적인 기본 클래스와 잘 어울립니다. – chris

답변

1

크기는 유형의 일부입니다. void *에 의지함으로써 너는 어느 정도까지 그것을 핵으로 만들 수있다.

대안으로 벡터를 사용하는 것입니다. 여전히 컨테이너에서 다른 크기의 격자를 가져 와서 데이터를 가져 오거나 설정할 수 있습니다.

#include <vector> 

class grid 
{ 
public: 
    grid(int x, int y) 
    { 
     data.resize(x); 
     //and each y 
    } 
//private: //maybe - up to you 
    std::vector<std::vector<double>>data; 
}; 

int main() 
{ 
    std::vector<grid> my_grids; 
    my_grids.emplace_back(1, 3); 
} 
+0

당신의 대답은 쓰기입니다, 제 질문은 틀렸어. 그래서 저는 그것을 편집합니다 : (그리드를 변경할 수없고, 더 어려운 오브젝트를 나타내며, 변경하고 싶지 않습니다.) – Markus

+0

다른 질문을 시작하고 가지고있는 그리드 클래스에 대해 더 자세히 설명하는 것이 좋습니다. – doctorlove