C ++ не соответствует ‘operator =’ в моем массиве пользовательских объектов

У меня есть класс с именем KernelLock, и я создаю массив KernelLocks с именем myLockArray. Я заявляю это так: KernelLock myLockArray[150];

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

myLockArray[initializedLocksCounter] = new KernelLock(myAddrSpace, newLock);

и вот точная ошибка:

error: no match for 'operator=' in 'myLockArray[initializedLocksCounter] = (((KernelLock*)operator new(8u)), (<anonymous>->KernelLock::KernelLock(myAddrSpace, newLock), <anonymous>))

В случае, если это помогает, я компилирую с gcc через Nachos.

0

Решение

KernelLock myLockArray[150];

Это массив, который содержит 150 блокировок ядра.

Когда я пытаюсь добавить новый KernelLock в myLockArray

Вы не можете добавлять объекты в массив. Размер массива всегда постоянен. В нем всегда 150 замков.

myLockArray[initializedLocksCounter] = new KernelLock(myAddrSpace, newLock);

Это не верно. new возвращает адрес динамически размещенного объекта. Вы пытаетесь присвоить этот адрес существующему KernelLock объект по индексу initializedLocksCounter, Вы не можете назначить адрес объекту без указателя (если у объекта нет соответствующего (не явного) конструктора).

Если вы хотите растущий массив, используйте std::vector<KernelLock>

2

Другие решения

KernelLock myLockArray[150];

Создает массив из 150 KernelLocks. Затем вы затем пытаетесь назначить KernelLock * к этому. Если вы хотите указатели, то вам нужно изменить ваш массив на:

KernelLock* myLockArray[150];

Если вы не хотите указатели, вам просто нужно изменить свое назначение на

myLockArray[initializedLocksCounter] = KernelLock(myAddrSpace, newLock);
3

Вы в корне не понимаете, что такое объект в C ++. Это не как в Java.

Ваш 150 KernelLock объектов 150 KernelLock объекты. Не указатели, а не ссылки. И их 150 Вы не можете динамически «расширять» массив, когда пожелаете, и делать это с new динамическое распределение, которое требует управления указателями (KernelLock*).

Судя по звукам, вы на самом деле хотите std::vector<KernelLock>,

Вот некоторые ресурсы для изучения основ C ++.

2

вы не можете использовать значение типа KernelLock* как элемент массива KernelLock«S. Вы просто делаете:

myLockArray[i] = KernelLock(myAddrSpace, newLock);

где i является действительным индексом.

Однако обратите внимание, что тем самым вы заплатите цену инициализации по умолчанию. 150 KernelLockНеважно, что (и это может быть дорого). Было бы лучше использовать стандартную библиотеку:

std::vector<KernelLock> kernel_locks;
kernel_locks.reserve(some_size); // better to reserve if you have some sensible upper bound
kernel_locks.emplace_back(myAddrSpace, newLock);
1
По вопросам рекламы [email protected]