2015-02-11 3 views
1

Я пытаюсь написать класс C++ с несколькими указателями на ints в качестве частных членов. я получаю это исключение при попытке присвоить значение указателя адреса:Объявить указатель как член класса C++

Unhandled exception at 0x000B140A in test.exe: 0xC0000005: Access violation  writing location 0x00000000. 

Здесь минимальный объем кода, который будет воспроизвести проблему на моей машине

#include "stdafx.h" 

class Chunker { 
    public: 
    Chunker(int cx, int cy); 

    private: 
    int chunkSizeX, chunkSizeY; 
    int *yOff, *xOff; 
    }; 

Chunker::Chunker(int cx, int cy){ 
    chunkSizeX = cx; 
    chunkSizeY = cy; 
    *xOff = 0; 
    *yOff = 0; 
}; 

int main(int argc, char *argv) 
{ 
    Chunker chunker(12, 12); 
    return 0; 
} 

Я просто не могу выяснить, что здесь не так?

+2

У вас есть хороший ответ ниже, но почему вы используете указатели здесь, в первую очередь? – Quentin

+0

указатели - это потому, что в полном коде есть функция, которая на каждом вызове возвращает следующий «кусок» массива. Указатели xOff и yOff указывают на ints, которые отслеживают, где они находятся в массиве. – jramm

+2

Итак, xOff и yOff являются индексаторами для некоторого массива? Вы можете просто определить их как int и использовать их как 'myXArray [xOffset]' – tofi9

ответ

7

Вы должны объявить память где-то для указателей

Chunker::Chunker(int cx, int cy) 
    : chunkSizeX{cx}, 
    chunkSizeY{cy} 
{ 
    xOff = new int(0); 
    yOff = new int(0); 
} 

В противном случае вы назначаете значение для указателя, который еще не имеет адреса.

Очевидно, что если ваш класс является тот, который выделяет память, вам нужно очистить его слишком

Chunker::~Chunker() 
{ 
    delete xOff; 
    delete yOff; 
} 

Если ваш класс является один выделения памяти, вы также можете рассмотреть возможность членам быть

std::unique_ptr<int> xOff; 
std::unique_ptr<int> yOff; 
+0

Огромное спасибо. Немного отличается от C. – jramm

2

Альтернатива @ ответ Cuber является замена *xOff = 0; на xOff = nullptr; (без *). Но почему указатели?

Chunker::Chunker(int cx, int cy) 
    : chunkSizeX{cx}, 
    chunkSizeY{cy} 
{ 
    xOff = nullptr; 
    yOff = nullptr; 
} 

... 

Chunker::~Chunker() 
{ 
    delete xOff; 
    delete yOff; 
} 
Смежные вопросы