CFile проблемы
-
- Уже с Приветом
- Posts: 9402
- Joined: 18 Mar 2004 15:11
- Location: New York -> FL
CFile проблемы
Есть такая конструкция
class A
{
public:
A ();
private:
CFile file;
}
при компиляции выскакивает ошибка "класс А не имеет конструктора копирования". Как только убираю CFile из переменных классса А, то все нормально. Даже если явно добавлю констуктор копирования, то все равно вылетает ошибка.
class A
{
public:
A ();
private:
CFile file;
}
при компиляции выскакивает ошибка "класс А не имеет конструктора копирования". Как только убираю CFile из переменных классса А, то все нормально. Даже если явно добавлю констуктор копирования, то все равно вылетает ошибка.
-
- Уже с Приветом
- Posts: 11475
- Joined: 20 Nov 2000 10:01
- Location: Escondido, CA
Re: CFile проблемы
shadow7256 wrote: Даже если явно добавлю констуктор копирования, то все равно вылетает ошибка.
Ошибка в чем-то другом, приведите весь код.
-
- Уже с Приветом
- Posts: 9402
- Joined: 18 Mar 2004 15:11
- Location: New York -> FL
-
- Уже с Приветом
- Posts: 5347
- Joined: 03 Feb 1999 10:01
- Location: NJ, USA
shadow7256 wrote:как только я заменил объект клааса CFile на указатель на объект класса CFile то все стало нормально
А почему это вас удивляет? Обьект и указатель это настолько разные вещи ...
У вас там нигде нет чего-нибудь типа:
Code: Select all
A var1;
A var2;
var2 = var1;
-
- Уже с Приветом
- Posts: 3003
- Joined: 14 Apr 2004 01:11
- Location: SFBA (было: Минск, Беларусь)
shadow7256 wrote:как только я заменил объект клааса CFile на указатель на объект класса CFile то все стало нормально
Класс 'CFile' не имеет доступного конструктора копирования. По этой причине компилятор не имеет возможности сгенерировать конструктор копирования и для класса 'A'. А ты его где-то пытаешься использовать. Это и приводит к ошибке.
1) Либо прекрати использовать конструктор копирования класса 'A'
2) Либо определи конструктор копирования для класса 'A' руками.
3) Либо сделай так, чтобы компилятор мог сгенерировать осмысленный конструктор копирования для класса 'A'.
Замена на указатель - это шаг в направлении третьего решения. Насколько это осмысленный шаг - зависит от конкретной задачи. Деталей ты тут не даешь, поэтому ничего конкретного сказать нельзя.
Best regards,
Андрей
Андрей
-
- Уже с Приветом
- Posts: 3003
- Joined: 14 Apr 2004 01:11
- Location: SFBA (было: Минск, Беларусь)
KVA wrote:У вас там нигде нет чего-нибудь типа:Code: Select all
A var1;
A var2;
var2 = var1;
К конструкторам копирования такой код никакого отношения не имеет. Скорее тогда
Code: Select all
A var1;
A var2 = var1;
Best regards,
Андрей
Андрей
-
- Уже с Приветом
- Posts: 12072
- Joined: 17 Nov 2002 03:41
- Location: английская колония
AndreyT wrote:KVA wrote:У вас там нигде нет чего-нибудь типа:Code: Select all
A var1;
A var2;
var2 = var1;
К конструкторам копирования такой код никакого отношения не имеет. Скорее тогдаCode: Select all
A var1;
A var2 = var1;
Имеет, имеет. Где можна, везде компилятор всунет копи-констрактор вместо присваивания.
Верить нельзя никому - даже себе. Мне - можно!
-
- Уже с Приветом
- Posts: 5347
- Joined: 03 Feb 1999 10:01
- Location: NJ, USA
-
- Уже с Приветом
- Posts: 3003
- Joined: 14 Apr 2004 01:11
- Location: SFBA (было: Минск, Беларусь)
A. Fig Lee wrote:AndreyT wrote:KVA wrote:У вас там нигде нет чего-нибудь типа:Code: Select all
A var1;
A var2;
var2 = var1;
К конструкторам копирования такой код никакого отношения не имеет. Скорее тогдаCode: Select all
A var1;
A var2 = var1;
Имеет, имеет. Где можна, везде компилятор всунет копи-констрактор вместо присваивания.
Ни в коем случае. Присваивание в такой ситуации выполняется только оператором присваивания. Инициализация - только конструктором. Деление совершенно четкое и однозначное.
Best regards,
Андрей
Андрей
-
- Уже с Приветом
- Posts: 9402
- Joined: 18 Mar 2004 15:11
- Location: New York -> FL
AndreyT wrote:Класс 'CFile' не имеет доступного конструктора копирования. По этой причине компилятор не имеет возможности сгенерировать конструктор копирования и для класса 'A'.
Андрей, я не совсем понимаю здесь связь. Если член класса А ,который в свое очередь сам является каким то другим классом (CFile в моем случае), не имеет конструктора копирования, то каким образом это связано с конструктором коппирования самого класса А?
2) Либо определи конструктор копирования для класса 'A' руками.
определял, не помогло.
Замена на указатель - это шаг в направлении третьего решения. Насколько это осмысленный шаг - зависит от конкретной задачи. Деталей ты тут не даешь, поэтому ничего конкретного сказать нельзя.
Указатель в моем случае нормально.
-
- Уже с Приветом
- Posts: 3003
- Joined: 14 Apr 2004 01:11
- Location: SFBA (было: Минск, Беларусь)
shadow7256 wrote:AndreyT wrote:Класс 'CFile' не имеет доступного конструктора копирования. По этой причине компилятор не имеет возможности сгенерировать конструктор копирования и для класса 'A'.
Андрей, я не совсем понимаю здесь связь. Если член класса А ,который в свое очередь сам является каким то другим классом (CFile в моем случае), не имеет конструктора копирования, то каким образом это связано с конструктором коппирования самого класса А?
Когда у класса нет явно объявленного конструктора копирования, компилятор объявляет его сам, неявно, как public член. Более того, если этот конструктор копирования используется в программе, то компилятор еще и неявно определяет этот конструктор. Встает вопрос: как он его определяет? А определяет он его очень просто - просто выполняет почленное копирование всех подобъектов данного класса, вызвая по очереди их конструкторы копирования.
Именно это происходит в твоем случае. Пытаясь сгенерировать конструктор копирования для 'A', компилятор хочет вызвать конструктор копирования 'CFile'. Но у класса 'CFile' нет доступного конструктора копирования, поэтому компилятор не может выполнить такого неявного определения. Возникает ошибка.
2) Либо определи конструктор копирования для класса 'A' руками.
определял, не помогло.
Значит ты что-то неправильно определял. Покажи, как ты это делал.
Замена на указатель - это шаг в направлении третьего решения. Насколько это осмысленный шаг - зависит от конкретной задачи. Деталей ты тут не даешь, поэтому ничего конкретного сказать нельзя.
Указатель в моем случае нормально.
Надеюсь, нормально. Ибо при использовании указателя сразу возникает вопрос времени жизни указуемого объекта. Кому принадлежит указуемый 'CFile' и кто управляет его временим жизни?
Best regards,
Андрей
Андрей
-
- Уже с Приветом
- Posts: 9402
- Joined: 18 Mar 2004 15:11
- Location: New York -> FL
-
- Уже с Приветом
- Posts: 3003
- Joined: 14 Apr 2004 01:11
- Location: SFBA (было: Минск, Беларусь)
shadow7256 wrote:Да действительно, нашел место, где неявно (! ) вызывается конструктор копирования класса А. Ну и закопали...
Ты всегда можешь явно объявить private конструктор копирования для класса 'A' (определять не надо), и компилятор тебе радостно выложит все места, где этот конструктор вызвается, независимо от глубины закопки
Best regards,
Андрей
Андрей
-
- Уже с Приветом
- Posts: 12072
- Joined: 17 Nov 2002 03:41
- Location: английская колония
-
- Уже с Приветом
- Posts: 9275
- Joined: 14 Dec 2001 10:01
- Location: Российская Федерация
A. Fig Lee wrote:AndreyT wrote:Ни в коем случае. Присваивание в такой ситуации выполняется только оператором присваивания. Инициализация - только конструктором. Деление совершенно четкое и однозначное.
неверно.
Покажите пункт стандарта, где сказанно про возможность замены. Или приведите пример и компилятор.