2015-03-29 3 views
-2

Код:класса Указатель Указатель

Block** blockArray = new Block*[numBlocks]; 
for (int i=0; i<numBlocks; i++) 
{ 

     fin >> a >> b; 
     blockArray[i]->setPosX(a); 
     blockArray[i]->setPosY(b);   

} 

Издание:

Когда blockArray Кодекса Hit в [я] -> setPosX (а); выдает необработанное исключение. В частности:

Unhandled exception at 0x00BF45FB in Nglarsen.Hmwk.3.Assignment.exe: 0xC0000005: Access violation writing location 0xBAADF00D. 

Единственный способ, которым я был в состоянии обойти это:

Block** blockArray = new Block*[numBlocks]; 
for (int i=0; i<numBlocks; i++) 
{ 
    blockArray[i]=new Block[1]; 
    for(int j=0;j<1;j++) 
    { 
     fin >> a >> b; 
     blockArray[i][j].setPosX(a); 
     blockArray[i][j].setPosY(b);    

    } 
} 

Но я знаю, что есть лучший способ, которым я просто забыть что-то здесь. Заранее спасибо

+0

Вы разыскиваете неинициализированные указатели в первом случае: 'blockArray [i] -> setPosX (a);'. Почему вы используете 'new' вообще? Я бы предпочел использовать 'std :: vector'. –

ответ

3

Вы выделяете массив указателей, но эти указатели не указывают на ничего, вам нужно снова перебирать их и выделять на них реальные объекты.

Block** blockArray = new Block*[numBlocks]; 

for (int i=0; i<numBlocks; i++) 
{ 
     blockArray[i] = new Block(); 
     fin >> a >> b; 
     blockArray[i]->setPosX(a); 
     blockArray[i]->setPosY(b);   

} 

если вы хотите 2-dimenssional массив:

Block** blockArray = new Block*[numBlocks]; 

for (int i=0; i<numBlocks; i++) 
{ 
     blockArray[i] = new Block[SIZE]; 
     for (int j =0 ;j<SIZE;j++){ 
      blockArray[i][j] = new Block(); 
      fin >> a >> b; 
      blockArray[i][j]->setPosX(a); 
      blockArray[i][j]->setPosY(b); 
     }   
} 
+0

Я не вижу необходимости использовать 'new' для этого случая. –

+0

, так как именно объект должен быть создан? из ниоткуда? –

+0

Вы видите другие ответы? –

3

Предполагая, что Block соответствует требованиям к вектору, я бы сделал это.

std::vector<Block> blocks(numBlocks) 
for (auto& block : blocks) 
{ 
    fin >> a >> b; 
    block.setPosX(a); 
    block.setPosY(b); 
} 

Обратите внимание на изящное отсутствие утечек памяти.

+0

Я буду смотреть в векторы, мне еще предстоит их изучить. Спасибо за помощь. – Skathix

+0

@Skathix Добро пожаловать. Векторы хорошо стоят усилий. –

+0

На стороне записки, почему это сбилось так сильно? Это был просто глупый вопрос? – Skathix

1

Очевидный "лучший путь" будет использовать std::vector вместо этого. Поскольку вы делаете ввод своих объектов Block, обычно рекомендуется поддерживать это напрямую, перегружая operator>>, а не требовать, чтобы весь код знал о его внутренних деталях.

std::istream &operator>>(std::istream &is, Block &block) { 
    int a, b; 
    is >> a >> b; 
    block.setPosX(a); 
    block.setPosY(b); 
    return is; 
} 

std::vector<Block> blocks; 
blocks.reserve(numBlocks); 
std::copy_n(std::istream_iterator<Block>(fin), numBlocks,std::back_inserter(blocks)); 
Смежные вопросы