Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Наследование перегруженных операторов


Автор: viii 1.8.2009, 11:18
Доброго времени суток.

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

Код

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&)


подскажете?

Автор: GoldFinch 1.8.2009, 11:44
viii, так у него сигнатура
TOutputPin operator = (TOutputPin&, bool )

а ты хочеш что было
TLed& operator = (TLed&, bool )

Автор: mes 1.8.2009, 11:57
Цитата(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 =;


Автор: viii 1.8.2009, 12:05
кажется понял, спасибо.
получается, что мне нужно этот же оператор прописать и в 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;
}


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

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

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

Автор: viii 1.8.2009, 12:21
Цитата

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

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

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

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);
};


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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)