Конструктор копирования не удален в классе c++

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

class Foo {
public:
   Foo(int i);
   Foo();
   Foo(const Foo&) = delete;
}

Это вызывает ошибку компилятора, если я пытался сделать что-то вроде:

Foo a(2);
Foo b = a;

Однако по какой-то причине это не распространяется на этот сценарий, когда данные копируются.

Foo* array;
array = new Foo[10000];
Foo a(2);
array[1] = a;

Почему это?

Foo a(); - это объявление функции.
Jesper Juhl 13.09.2018 19:46
Foo a(); - возникшая здесь ошибка компилятора не имеет ничего общего с конструктором копирования - он не определяет объект Foo, а объявляет функцию.
user2100815 13.09.2018 19:47

В этом примере у Foo вообще нет конструкторов. Объявление конструктора даже для его удаления предотвращает создание конструктора по умолчанию. Вам нужно будет объявить конструктор по умолчанию.

François Andrieux 13.09.2018 19:48
−1 Особенно последний пример явно не настоящий код. Также проголосовали за закрытие, так как отсутствует воспроизводимый пример.
Cheers and hth. - Alf 13.09.2018 19:49

Обновил вопрос с конструктором и небольшими правками. Надеюсь, для вас это не так псевдокодей.

J.Doe 13.09.2018 19:51

А как насчет compiler error, который вы получите?

Dalton Cézane 13.09.2018 19:52

@ J.Doe, к сожалению, вы не можете использовать array = new Foo[10000];, если у вас нет конструктора по умолчанию.

R Sahu 13.09.2018 19:52

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

J.Doe 13.09.2018 19:53

Пришло время изучить основы конструкторов, включая определение и время их вызова.

philipxy 13.09.2018 20:10
4
9
62
1

Ответы 1

Прежде всего,

Foo a();

не создает объект типа Foo. Он объявляет функцию, которая не принимает аргументов и возвращает Foo.

Предполагая, что у вас есть объект типа Foo,

Foo b = a;

вызывает конструктор копирования для инициализации b. Однако, когда вы используете

array[1] = a;

он не использует конструктор копирования. Это операция присваивания. delete в конструкторе копирования не выполняет delete в качестве оператора присваивания копии. Следовательно, последняя строка не является ошибкой.

По-прежнему существует проблема, заключающаяся в том, что Foo не может быть сконструирован по умолчанию.

François Andrieux 13.09.2018 19:49

Итак, назначение не приводит к использованию новой памяти? Простые два местоположения, указывающие на один и тот же объект?

J.Doe 13.09.2018 19:52

@ J.Doe, это два разных объекта. Значение одного объекта присваивается другому объекту.

R Sahu 13.09.2018 19:53

В этом есть смысл!

J.Doe 13.09.2018 19:54

@ J.Doe Назначение не будет включать конструктор копирования, а скорее перегрузку оператора присваивания.

πάντα ῥεῖ 13.09.2018 19:54

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

user4581301 13.09.2018 20:08

Другие вопросы по теме