Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Оператор присваивания наследуется? 
:(
    Опции темы
Dims
Дата 22.12.2009, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: нет
Всего: 11



Почему не наследуется оператор присваивания в данном примере?

Код

template <class T> 
class Reference {

    T* p;


public:

    Reference();
    Reference &operator=(const Reference &ano);
    Reference &operator=(T* p);

};

typedef Reference<int> R2;

class R3 : public Reference<int> {
};


int _tmain(int argc, _TCHAR* argv[])
{

    Reference<int> r1;
    R2 r2;
    R3 r3;

    int *p;

    r1=p;
    r2=p;
    r3=p; // ошибка: Error    1    error C2679: binary '=' : no operator found which takes a right-hand operand of type 'int *' (or there is no acceptable conversion)



    return 0;
}


PM MAIL   Вверх
mes
Дата 22.12.2009, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250





--------------------
PM MAIL WWW   Вверх
Dims
Дата 22.12.2009, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: нет
Всего: 11



Спасибо! Так я не понял, using в такой функции уже сделали что ли?
PM MAIL   Вверх
mes
Дата 22.12.2009, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Dims @  22.12.2009,  18:48 Найти цитируемый пост)
Так я не понял, using в такой функции уже сделали что ли? 

если в наследнике хотите использовать оператор присваивания предка, то поможет using, иначе его не будет видно, по причине указанной в цитате по ссылке.
smile

P.S. причина в том, что обсуждаемый оператор специальный и на него распространяются некоторые обязательства, в частности то, что этот оператор для каждого класса будет неявно сгенерирован компилятором, если пользователь не опишет его явно. 

Это сообщение отредактировал(а) mes - 22.12.2009, 19:55


--------------------
PM MAIL WWW   Вверх
Dims
Дата 24.12.2009, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: нет
Всего: 11



Ха! Вроде бы using помогает не полностью! Вопрос снова открыт!

Вот пример

Код

// Test002.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

template <class T> 
class Reference {

    T* p;


public:

    Reference();
    Reference &operator=(const Reference &ano);
    Reference &operator=(T* p);

};

typedef Reference<int> R2;

class R3 : public Reference<int> {
public:
    using Reference<int>::operator=;
};


int _tmain(int argc, _TCHAR* argv[])
{

    Reference<int> r1;
    R2 r2;
    R3 r3;

    int *p;

    r1=p;
    r2=p;
    r3=p;

    Reference<int>(r1=p);
    R2(r2=p);
    R3(r3=p); // Error    1    error C2440: '<function-style-cast>' : cannot convert from 'Reference<T>' to 'R3'    

    return 0;
}



PM MAIL   Вверх
mes
Дата 25.12.2009, 00:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Dims @  24.12.2009,  21:29 Найти цитируемый пост)
Ха! Вроде бы using помогает не полностью! Вопрос снова открыт!

ну тут проблема уже не с оператором присваивания, а с конструктором.. они в текущем стандарте не наследуются..

Можно узнать зачем такое извращение ? думаю должен быть способ достичь цели более естественным путем.
smile


--------------------
PM MAIL WWW   Вверх
Dims
Дата 27.12.2009, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: нет
Всего: 11



Какой именно конструктор тут не отнаследовался?

Цитата(mes @  25.12.2009,  00:40 Найти цитируемый пост)
Можно узнать зачем такое извращение ? 

Не извращение, а нормальное для ООП желание использовать наследование...

Я хочу завернуть интерфейсы DirectShow в свои классы так, чтобы было проще ими пользоваться...

PM MAIL   Вверх
mes
Дата 27.12.2009, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Dims @  27.12.2009,  09:49 Найти цитируемый пост)
Какой именно конструктор тут не отнаследовался?

нет конструктора  R3 (Reference<int> const& );

Цитата(Dims @  27.12.2009,  09:49 Найти цитируемый пост)
Не извращение, а нормальное для ООП желание использовать наследование...

имхо Вам стоит еще раз осмотреться, правильное ли направление Вы выбрали..  smile 









--------------------
PM MAIL WWW   Вверх
Dims
Дата 29.12.2009, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: нет
Всего: 11



Цитата(mes @  27.12.2009,  13:30 Найти цитируемый пост)
нет конструктора  R3 (Reference<int> const& );

Разве компилятор не генерит его автоматически?
PM MAIL   Вверх
bsa
Дата 30.12.2009, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(Dims @  29.12.2009,  23:00 Найти цитируемый пост)
Разве компилятор не генерит его автоматически? 

А с какого это бодуна он должен генерировать подобное? Автоматически генерятся R3::R3(const R3 &) и R3& R3::operator=(const R3&), если не объявлены явно.
PM   Вверх
mes
Дата 30.12.2009, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Dims @  29.12.2009,  22:00 Найти цитируемый пост)
Разве компилятор не генерит его автоматически? 

добавлю к bsa, что в общем случае это невозможно - построить наследника на основе базового класса, так как наследник может обладать доп. данными.
ну а частные случаи, когда наследники, просто "оборачивают" базовый класс, не являются достаточным основанием для (исключительной из  общего правила) генерации.



 


--------------------
PM MAIL WWW   Вверх
Dims
Дата 30.12.2009, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: нет
Всего: 11



В общем, если суммировать, то следует просто сказать, что оператор присваивания не наследуется и using делу не поможет.
PM MAIL   Вверх
mes
Дата 30.12.2009, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Dims @  30.12.2009,  21:03 Найти цитируемый пост)
В общем, если суммировать, то следует просто сказать, что оператор присваивания не наследуется и using делу не поможет. 

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

в теме мало информации о Ваших задаче и целях, но попробую предположить, что для решения Вашей может подойти CRTP :
http://insidecpp.ru/patterns/curiously_rec...mplate_pattern/





Это сообщение отредактировал(а) mes - 30.12.2009, 23:25


--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0917 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.