2010-09-14 4 views
0

У меня есть массив в классе, который должен содержать некоторые экземпляры других объектов. Заголовочный файл выглядит следующим образом:C++ Array объектов

class Document { 
private: 
    long arraysize; 
    long count; 
    Row* rows; 
public: 
    Document(); 
    ~Document(); 
} 

Затем в конструкторе я инициализировать массив так:

this->rows = new Row[arraysize]; 

Но по какой-то причине это просто устанавливает rows к экземпляру Row, а не массив строк. Как инициализировать массив объектов Row?

ответ

4

Если arraySize содержит разумное значение в этой точке, вы фактически получаете массив. Думаю, вы доверяете своему отладчику, и отладчик показывает только 0-й элемент (так отладчики обрабатывают указатели), поэтому вы думаете, что за этим указателем есть только один объект.

1

Для i в [0;arraysize[, *(this->rows+i) должен быть экземпляром строки.

5

Ответы SharpTooth и Wok верны.

Я бы добавил, что если вы уже боретесь на этом уровне, вам может быть лучше использовать std::vector вместо встроенного массива в этом случае. Вектор будет обрабатывать прозрачность и прозрачность.

+0

+1 для std :: vector. И используйте интеллектуальные указатели или функцию 'delete_vector', если вам действительно нужны указатели (из-за полиморфизма). – rubenvb

5

Это должно сработать. Одна возможная «ошибка» будет неправильным значением для arraySize.

Однако вам следует использовать std::vector из стандартной библиотеки для этой цели.

#include <vector> 
class Document { 
    // ... 
    std::vector<Row> rows; 
    // ... 
}; 

и в конструкторе:

Document::Document() : rows(arraySize) { // ... } 

или

Document::Document() { rows.assign(arraySize, Row()); } 
+0

+1 для std :: vector –

1

Что именно заставляет вас думать, что rows только один элемент? Убедитесь, что вы arraysize не 1. Если это так, вы получите массив из 1 элемента. Имейте в виду, что вы все равно должны позвонить delete [] с массивом размера 1.

Кроме того, почему arraysize отличается от count? Используя эту терминологию, вы должны сделать массив из count элементов, а arraysize должен быть равен sizeof(Row) * count.

Также вы спрашиваете: «Как инициализировать массив объектов Row?». Вы имеете в виду выделение? Если так, вот как вы это сделаете. Если вы имеете в виду инициализацию, конструктор по умолчанию будет вызываться для каждого элемента массива при распределении массива.