У меня есть класс с именем 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.
KernelLock myLockArray[150];
Это массив, который содержит 150 блокировок ядра.
Когда я пытаюсь добавить новый KernelLock в myLockArray
Вы не можете добавлять объекты в массив. Размер массива всегда постоянен. В нем всегда 150 замков.
myLockArray[initializedLocksCounter] = new KernelLock(myAddrSpace, newLock);
Это не верно. new
возвращает адрес динамически размещенного объекта. Вы пытаетесь присвоить этот адрес существующему KernelLock
объект по индексу initializedLocksCounter
, Вы не можете назначить адрес объекту без указателя (если у объекта нет соответствующего (не явного) конструктора).
Если вы хотите растущий массив, используйте std::vector<KernelLock>
KernelLock myLockArray[150];
Создает массив из 150 KernelLock
s. Затем вы затем пытаетесь назначить KernelLock *
к этому. Если вы хотите указатели, то вам нужно изменить ваш массив на:
KernelLock* myLockArray[150];
Если вы не хотите указатели, вам просто нужно изменить свое назначение на
myLockArray[initializedLocksCounter] = KernelLock(myAddrSpace, newLock);
Вы в корне не понимаете, что такое объект в C ++. Это не как в Java.
Ваш 150 KernelLock
объектов 150 KernelLock
объекты. Не указатели, а не ссылки. И их 150 Вы не можете динамически «расширять» массив, когда пожелаете, и делать это с new
динамическое распределение, которое требует управления указателями (KernelLock*
).
Судя по звукам, вы на самом деле хотите std::vector<KernelLock>
,
вы не можете использовать значение типа 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);