2014-02-15 11 views
1

Я намеревался инициализировать указатель на массив объектов класса 'Port.h'. Для этого сначала инициализируется указатель типа «Порт», затем конструктор этого класса вызывается для каждого элемента массива.Инициализация указателя на массив объектов

int main(){ 
    Port *ports; 

    for (int m = 0; m < M; m++){ 
     // Initialize 
     ports[m] = Port(***PARAMETERS***); 
     // ... 
    } 
    // ... 
} 

Я получаю следующее сообщение об ошибке при выполнении кода:

ошибка C4700: неинициализированные локальные переменные «порты» используется

ответ

2

Перед тем, как могли бы начать загрузку указателей в массиве, вам нужно инициализировать массив себя:

Port *ports = new Port[M]; 

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

Port **ports = new Port*[M]; 

Когда вы кладете данные в массив указателей, вам нужно использовать оператор new:

ports[m] = new Port(***PARAMETERS***); 
//   ^^^ 

Поскольку ports держит указатели Теперь, вам нужно использовать синтаксис указателя для доступа пользователей Port «s:

ports[m]->memberFunction(param1, param2); // Note the use of '->' in place of a dot '.' 

После того, как вы закончите работать с массивом, вы должныотдельные Port объекты, а затем delete[]ports массив, чтобы избежать утечек памяти:

for (int m = 0 ; m != M ; m++) { 
    delete ports[m]; 
} 
delete[] ports; 

Примечание: в настоящее время большая часть кода посвящена управлению памятью. Чтобы избежать необходимости писать этот код, используйте стандартные коллекции и интеллектуальные указатели.

1

По крайней мере, вы должны выделить зону для этого указателя:

#define M 15 /* or whatever you want */ 
Port *ports = new Port[M]; 

Не забывайте, что delete массив позже, возможно, заканчивая ваши main с

delete[] ports; 

Но я верю, что вы не должны использовать указатель на зону массива, но вектор, например,

std::vector<Port> ports; 

Подробнее о std::vector. Вероятно, вы хотите вызвать его resize или его методы push_back или emplace_back (при условии, что C++11). Так что, если вы можете построить некоторые Port(12,"abc"); бы вы назвали:

ports.emplace_back(12,"abc"); 

построить и добавить такой порт в конце вашего ports вектора.

+0

Спасибо за ваш ответ, я рассмотрю использование векторов. –

1

Сообщение об ошибке достаточно ясна: переменная порты не была инициализирована

Port *ports; 

Так что имеет какое-либо произвольное значение.

Вам необходимо выделить память для массива, который вы собираетесь использовать. Например,

Port *ports = new Port[M]; 

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

std::vector<Port> ports(M, Port(***PARAMETERS***)); 
Смежные вопросы