2016-04-24 1 views
-2

Привет всем, я пытаюсь создать класс, который в основном представляет собой трехмерную матрицу из них и нулей. К сожалению, когда я пытаюсь динамически выделять 3D-матрицу в конструкторе, консоль меня бросает: «размер массива в новом выражении должен быть постоянным», я не понимаю, почему это происходит, компилятор, похоже, считает, что это статический массив.размер массива в новом выражении должен быть постоянным (динамический массив)

вот код

#include <stdlib.h> 
#include <iostream> 
class map 
{ 
public: 
map(int, int, int,std::string); 
~map(); 
private: 

int dx,dy,dz; 
std::string generatorName; 
bool* matrix3D; 
}; 
map::map(int x=0,int y=0,int z=0,std::string gen="EMPTY") 
{ 
    matrix3D=new bool[x][y][z]; 
    generatorName=gen; 
} 
map::~map() 
{ 
    delete matrix3D; 
} 
+1

C++ не позволяет выделять многомерные массивы переменных размеров. Вам нужно будет либо выделить один, длинный, одномерный массив и использовать свои собственные трюки для индексации для имитации 3D-массива, или вам нужно будет разбить распределение на несколько меньших шагов. – templatetypedef

+0

Вы не можете выделить многомерные массивы, подобные этому, и вам не хватает '[]' в вашем вызове 'delete', и вы должны использовать 3D' vector' 'bool' вместо вашего' bool * '. – Holt

+0

Во-первых, я бы не назвал свой класс 'map', так как в C++ уже есть класс' std :: map'. Во-вторых, контейнеры, такие как 'std :: vector', заботятся об этом для вас. В-третьих, ваш «класс карты» будет страдать от ошибок, как только вы попытаетесь скопировать/назначить с ним из-за отсутствия «правила 3». – PaulMcKenzie

ответ

0

сделать функцию шаблонного и передать размер, что путь вместо этого.

template <size_t N, etc> 
... 

Array [N] 
0

Если вы хотите, чтобы ваша программа для работы как есть, в том числе с использованием [ ] для доступа каждого измерения, вы можете сделать это с помощью std::vector

#include <vector> 
//... 
typedef std::vector<bool> boolArray; 
typedef std::vector<boolArray> boolArray2D; 
typedef std::vector<boolArray2D> boolArray3D; 

class mymap 
{ 
    public: 
     mymap(int, int, int,std::string); 

    private: 
     int dx,dy,dz; 
     std::string generatorName; 
     boolArray3D matrix3D; 
}; 

mymap::mymap(int x=0,int y=0,int z=0,std::string gen="EMPTY") : 
     matrix3D(x, boolArray2D(y, boolArray(z))), generatorName(gen) 
{} 

Вам не нужно иметь деструктор, и ваш существующий код, который использует [ ], должен работать.

Обратите внимание, что это не так эффективно, как использование одномерного массива и с помощью индексации, чтобы перейти к определенному компоненту x/y/z. Но для этого требуется, чтобы вы изменили часть своего существующего кода (используя один из [ ] вместо [ ][ ][ ] для доступа к вашим элементам).

0

Итак, я предполагаю, что цель вектора состоит в том, чтобы сделать массив более простым в использовании, но я считаю, что «грамматика» шаблона чрезмерно сложна и неинтуитивна ... Поэтому вместо этого я попытался сделать указатель на массив указателей на другие массивы указатели. Вот мой окончательный результат, единственное, что меня беспокоит, это деструктор, я действительно освобождаю всю память, которую я выделил?

#include <iostream> 

class airMap 
{ 
public: 
    airMap(int, int, int,std::string); 
    ~airMap(); 

private: 

    int dx,dy,dz; 
    std::string generatorName; 
    bool*** matrix3D; 


}; 

//Constructeurs et destructeurs 
airMap::airMap(int x=0,int y=0,int z=0,std::string gen="EMPTY") 
{ 
    matrix3D=new bool**[x]; 
    for (int i=0;i<x;i++) 
    { 
     matrix3D[i]=new bool*[y]; 
     for (int j=0;j<y;j++) 
     { 
      matrix3D[i][j]=new bool[z]; 
     } 
    } 
    dx=x; 
    dy=y; 
    dz=z; 
    generatorName=gen; 
} 
airMap::~airMap() 
{ 

    for(int i=0;i<dx;i++) 
    { 
     for(int j=0;j<dy;j++) 
     { 
      delete[] matrix3D[i][j]; 
     } 
     delete[] matrix3D[i]; 
    } 
    delete[] matrix3D; 
} 
+0

Я могу сломать ваш класс только двумя строками кода: '{airMap a1 (1,1,1," abc "); airMap a2 = a1;} 'Я только что создал двойную ошибку. Если вам нужно убедить, запустите эту программу и посмотрите, как искры летают на последней фигурной скобке. В вашей реализации отсутствует пользовательский конструктор копирования и оператор присваивания. Если вы хотите «непринужденность», пошлите эти две функции, чтобы исправить ошибки. Или просто используйте 'std :: vector', и не беспокойтесь обо всем этом. – PaulMcKenzie

+0

* Я нахожу шаблон грамматики чрезмерно сложным и неинтуитивным * - Возможно, C++ не является вашим языком, так как шаблоны теперь являются основным продуктом. Кроме того, многие не согласятся с вами, и вам будет легко. – PaulMcKenzie

+0

Вот что я имею в виду: http://ideone.com/9Q9vO3 См. Ошибку времени выполнения? – PaulMcKenzie

Смежные вопросы