2015-11-28 2 views
3

.cpp:C++ Инициализация массива в конструкторе

Person::Person(int _id[9], string name, int age) :_age(age), _name(name){}; 

заголовочных:

private: 
int _id[9]; 
string _name; 
int _age; 

Как intilaze в Ид ", поданную в тот же метод, который я сделал с возрастом и имя?

+0

связанные/дубликата: [? Как передать массив в конструктор] (http://stackoverflow.com/questions/9426932/how-do-i-pass-an -array-to-a-constructor) – NathanOliver

+2

использовать 'std :: vector ' или 'std :: array ' – Casey

ответ

1
class Person 
{ 
    typedef std::array<int, 9> ids_t; 
    Person(ids_t, string name, int age); 

private: 
    ids_t _id; 
    string _name; 
    int _age; 
}; 

Person::Person(ids_t id, string name, int age) : _id(id), _age(age), _name(name){} 
+0

Не могли бы вы объяснить мне, что вы сделали в строке typedef? – XEvans

+1

@XEvans Он создал псевдоним типа: теперь 'ids_t' - это имя типа, которое является тем же типом, что и' std :: array '. – emlai

1

Поскольку вы не можете назначить массивы C-стиля, или даже инициализировать друг с другом, вы могли бы сделать задачу проще с помощью C++ - массив стилей (которые могут быть назначены и копировать-инициализирована):

array<int, 9> _id; 

и

Person::Person(array<int, 9> id, string name, int age) 
: _id(id), _age(age), _name(name) { } 

Или, если вы настаиваете на использовании массива C-стиле, вы можете скопировать массив аргументов в массив членов с std::copy:

Person::Person(int id[9], string name, int age) : _age(age), _name(name) 
{ 
    copy(id, id + 9, _id); 
}; 

Но обратите внимание, что передача массива в стиле C плохо, потому что компилятор рассматривает все аргументы массива C-стиля как просто указатели на первый элемент массива. Таким образом, тип параметра id фактически int* и, следовательно, вызывающий Person конструктор может пройти (с использованием неявное array-to-pointer decay) массив любого размера, указатель на только одногоint, или даже nullptr, поскольку продемонстрировано here. Попытка скопировать 9 элементов из любого из этих недопустимых параметров приведет к неопределенному поведению.

2

Массивы не конструктор копирования и, кроме того параметра _id в этом конструкторе

Person::Person(int _id[9], string name, int age) :_age(age), _name(name){}; 

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

Person::Person(int *_id, string name, int age) :_age(age), _name(name){}; 

и указатель не хранит информацию указывает ли она к одному объекту или к первому объекту массива.

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

Например

Person::Person(int *_id, size_t id_num, string name, int age) 
    :_id {}, _age(age), _name(name) 
{ 
    size_t size = id_num < 9 ? id_num : 9; 
    std::copy(_id, _id + size, this->_id); 
} 
Смежные вопросы