Я пытаюсь создать класс, который никогда не дублируется, поскольку в его полях содержится МНОГО данных. Для этого я определил класс следующим образом:
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();
- возникшая здесь ошибка компилятора не имеет ничего общего с конструктором копирования - он не определяет объект Foo
, а объявляет функцию.
В этом примере у Foo
вообще нет конструкторов. Объявление конструктора даже для его удаления предотвращает создание конструктора по умолчанию. Вам нужно будет объявить конструктор по умолчанию.
Обновил вопрос с конструктором и небольшими правками. Надеюсь, для вас это не так псевдокодей.
А как насчет compiler error
, который вы получите?
@ J.Doe, к сожалению, вы не можете использовать array = new Foo[10000];
, если у вас нет конструктора по умолчанию.
Попался. Обновленный вопрос снова. Я не чувствовал необходимости включать больше необходимого кода для Foo, но я вижу путаницу, которую это вызывает, поэтому добавил конструктор по умолчанию. Вы не поверите, но класс, который я пишу, не называется Foo.
Пришло время изучить основы конструкторов, включая определение и время их вызова.
Прежде всего,
Foo a();
не создает объект типа Foo
. Он объявляет функцию, которая не принимает аргументов и возвращает Foo
.
Предполагая, что у вас есть объект типа Foo
,
Foo b = a;
вызывает конструктор копирования для инициализации b
. Однако, когда вы используете
array[1] = a;
он не использует конструктор копирования. Это операция присваивания. delete
в конструкторе копирования не выполняет delete
в качестве оператора присваивания копии. Следовательно, последняя строка не является ошибкой.
По-прежнему существует проблема, заключающаяся в том, что Foo
не может быть сконструирован по умолчанию.
Итак, назначение не приводит к использованию новой памяти? Простые два местоположения, указывающие на один и тот же объект?
@ J.Doe, это два разных объекта. Значение одного объекта присваивается другому объекту.
В этом есть смысл!
@ J.Doe Назначение не будет включать конструктор копирования, а скорее перегрузку оператора присваивания.
Тем не менее, один из простейших способов реализации оператора присваивания использует конструктор копирования. См. Идиомы копирования и обмена. Обратите внимание, что хотя это просто и надежно, копирование и обмен могут быть дорогостоящими.
Foo a();
- это объявление функции.