2016-10-14 3 views
1

Я создаю простую программу, в которой хранятся дети, которые посещают определенную классную комнату, каждый ребенок имеет массив, который определяет их друзей.Неверная пользовательская ошибка преобразования

Я испытываю

error: invalid user-defined conversion from 'Kids*' to 'Kids&&' [-fpermissive]|

ошибку. Я использую этот код

struct Kids{ 
    int *friends; 
    Kids(){}; 
    Kids(int n){ 
     friends = new int[n]; 
    } 
}; 
class Classroom{ 
    Classroom(){ 
     cin >> size; 
     kids = new Kids[ size ]; 
     for(int i = 0; i < size ; i++){ 
      kids[i] = new Kids(i); 
     } 
    } 
private: 
    int size; 
    Kids *kids; 
}; 

Почему эта линия

kids[i] = new Kids[i]; 

рассматривает компилятор как попытку преобразовать Kids * для детей & & в то время как я создаю новый экземпляр узел, например, динамически выделяющий его таким образом передавая его как Дети *?

Спасибо за помощь!

+1

'kids [i]' типа 'Kids'. 'new Kids [i]' имеет тип 'Kids *' (массив 'Kids'). Я думаю, вы имеете в виду 'new Kids (i)', и в этом случае результат будет иметь тип 'Kids'. – Qix

+0

@Qix 'new' всегда возвращает тип указателя (или бросает). – krzaq

+2

'std :: vector kids;' и 'std :: vector friends;' - это избавляется от члена 'size' и не требует управления ручным управлением памятью. – PaulMcKenzie

ответ

4

new Kids(i) создает объект Kids, инициализированный i и возвращает указатель на него.

kids[i] является объектом Kids (lvalue), а не указателем.

Эти типы просто несовместимы.

массив kids уже выделен первой инструкцией (kids = new Kids[ size ];), нет необходимости повторять это снова.

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

kids[i] = Kids(i); 

Но вы, кажется, преодолев rule of three/fize/zero, так YMMV.

Кстати, вместо того, чтобы выполнять всю тяжелую работу, вы должны позволить библиотеке сделать это за вас и использовать указатель коллекции/умения вместо управления ресурсами вручную. Используйте std::vector<Kids> или std::unique_ptr<Kids[]>, в зависимости от ваших потребностей.

+0

Ух, я заметил опечатку, это должны были быть дети [i] = new Kids (i) –

+1

@ J.dd, которые не имеют никакого значения, вы все равно получаете * указатель * на объект 'Kids' вместо сам объект. Есть ли у вас опыт с другим языком, который не использует указатели? –

+0

@MarkRansom yep, я опытный с js/php, пытаясь сделать шаг вверх и учиться C++ –

Смежные вопросы