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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Наследование перегруженных операторов 
V
    Опции темы
viii
Дата 1.8.2009, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Доброго времени суток.

имеем некоторый класс, для которого определен оператор =
и имеем класс-потомок для объекта которого этот оператор почему-то недоступен

Код

class TPin{
protected:
    volatile uint8_t* pin;
    volatile uint8_t* ddr;
    volatile uint8_t* port;
    uint8_t pin_num;

    TPin(volatile uint8_t* base, uint8_t pin_num);
};

class TOutputPin: public TPin{
public:
    TOutputPin(volatile uint8_t* base, uint8_t pin_num);
    TOutputPin operator = (bool val);
};

class TLed: public TOutputPin{
public:
    TLed(volatile uint8_t* base, uint8_t pin);
};

int main(void){
    TLed led0(&PINB, PB0);
    led0 = true;
    return 0;
}


(реализация методов опущена)

а компилятор ругается на строку "led0 = true"
говорит, что
 
Цитата

../main.cpp: In function 'int main()':
../main.cpp:18: error: no match for 'operator=' in 'led0 = true'
../pins.h:37: note: candidates are: TLed& TLed::operator=(const TLed&)


подскажете?
PM MAIL   Вверх
GoldFinch
Дата 1.8.2009, 11:44 (ссылка)  | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

Репутация: 6
Всего: 26



viii, так у него сигнатура
TOutputPin operator = (TOutputPin&, bool )

а ты хочеш что было
TLed& operator = (TLed&, bool )
PM MAIL ICQ   Вверх
mes
Дата 1.8.2009, 11:57 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Standart 13.5.3/1)

Because a copy assignment operator  operator=  is  implicitly declared for a class if not declared by  the user,
a base class assignment  operator  is  always hidden by the copy assignment operator of the derived class.

добавьте в  TLed 
Код

    using TOutputPin::operator =;



Это сообщение отредактировал(а) mes - 1.8.2009, 11:59


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


Новичок



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

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



кажется понял, спасибо.
получается, что мне нужно этот же оператор прописать и в TLed?
ведь мне не важно, над кем выполняется данная операция (над объектом класса TOutputPin или TLed) т.к. в реализации оператора я модифицирую членов TPin. Я могу даже не возвращать ничего:

Код

class TOutputPin: public TPin{
public:
    TOutputPin(volatile uint8_t* base, uint8_t pin);
    void operator = (bool val);
protected:
    void Set(void);
    void Clear(void);
};

void TOutputPin::operator = (bool val){
    if(val)
        Set();
    else
        Clear();
}
void TOutputPin::Set(void){
    *port |= pin_num;
}
void TOutputPin::Clear(void){
    *port &= ~pin_num;
}


есть способ унаследовать метод? или придется реализовывать и в потомке?
PM MAIL   Вверх
mes
Дата 1.8.2009, 12:08 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(viii @  1.8.2009,  11:05 Найти цитируемый пост)
есть способ унаследовать метод?  

смотрите предыдущий пост.


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


Новичок



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

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



Цитата

смотрите предыдущий пост. 

да-да, спасибо. просто, пока писал ответ, Вы написали. Решил проверить, прежде, чем отписываться.

работает, вот в это варианте пока оставлю:
Код

class TOutputPin: public TPin{
public:
    TOutputPin(volatile uint8_t* base, uint8_t pin_num);
    bool operator = (bool val);
protected:
    void Set(void);
    void Clear(void);
};

class TLed: public TOutputPin{
public:
    TLed(volatile uint8_t* base, uint8_t pin_num);
    using TOutputPin::operator =;
    void On(void);
    void Off(void);
};


спасибо еще раз

Это сообщение отредактировал(а) viii - 1.8.2009, 12:28
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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