Wpis z mikrobloga

#cpp #programowanie

Mam problem z przeładowaniem operatora ! (operator overload). Zdaję sobie sprawę, że mój przykład zaburza semantykę języka i można to zrobić bardziej czytelnie, ale jako że uczę się c++ to próbuję różnych rzeczy. Otóż mam klasę Card
która opisuje kartę do gry. Na samym dole zaimplementowany jest operator !.
Tutaj pojawiają się pytania, otóż
1. Dlaczego tam występuje const (zakładam, że gwarantuje on że parametr podany przez referencje się nie zmieni?)
2. W jaki sposób mogę użyć tego operatora w metodzie klasy Card? Na przykład w print? !this niestety nie działa i powoduje exception badalloc.
Wszystko jest w porządku jeśli nie użyję operatora !, ale zapiszę normalny warunek (color == -1 || figure == -1)
Card::Card(){
figure = -1;
color = -1;
}
Card::Card(short a, short b) {
figure = a;
color = b;
hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
}
void Card::setVisible() {
visible ^= true;
}
std::string Card::print(bool force){
if (!this) return "HH"; //to nie działa
if (!visible && !force)return "##";
short k;
(color%2)?k=12:k=15;
SetConsoleTextAttribute(hConsole, k);
return figures[figure] + colors[color];
}
//tutaj przeładowanie operatora
bool Card::operator !() const {
return !(color == -1 || figure == -1);
}
  • 5
  • Odpowiedz
@sokytsinolop:
1. const umożliwia wywołanie metody( tutaj przeładowanego operatora) na obiekcie zadeklarowanym jako const, this będzie wtedy typu const Card*.
2. !this zawsze powinno zwrócić true (wskaźnik nigdy nie będzie nullptr) chyba że robisz jakieś UB. A jeżeli chcesz wywołać przeładowany operator w klasie to wywołaj go na referencji czyli !*this.
Dodatkowo nie powiano się robić takich metod jak print wewnątrz klasy, które używają czegoś poza klasy.
Kolejna rzecz
  • Odpowiedz