Klasa abstrakcyjna,referencja+wyw.funkcji

0

Witam,
Tworzę projekt z C++ "wyspa wilków". Stworzyłem klasę abstrakcyjną Zwierze oraz klasy pochodne Krolik oraz Wilk. W programie mam również klasy Lista i Wyspa. W klasie listy mam taki fragment kodu:

void Lista::DodajNaKoniec(const Zwierze &z)
{
	Zwierze * aktualne = ostatnie;
	Zwierze * nowe = z.nowe_kopia();

Problem polega na tym że w momencie wywołania funkcji nowe_kopia() kompilator wyrzuca mi błąd o treści:

error C2662: 'Zwierze::nowe' : cannot convert 'this' pointer from 'const Zwierze' to 'Zwierze &'
1>        Conversion loses qualifiers

Jak tego typu rozwiązać najlepiej... do referencji tej mógłbyc przypisany obiekt typu Krolik lub Wilk zachodzi wiec konwersja standardowa... czy w tym miejscu mam zrobić jakąś konwersje jawną?

Z góry dziękuje za jakiekolwiek sugestie i pomoc!

0

zamiast linii

Zwierze * nowe = z.nowe_kopia();

spróguj napisać

Zwierze * nowe = const_cast<Zwierze*>(z.nowe_kopia());

choć wydaje mi się, że w metodzie Zwierze::nowe_kopia() jest błąd (prawdopodobnie metoda zwraca inny typ niż Zwierze*)

0

Nie nie ma błędu... ale już tak samo zrobiłem tylko zapomniałem napisać że problem rozwiązany;) Ale fajnie że napisałeś to się utwierdziłem w swoich poczynaniach:)

0

wojtekkk, lepiej powiedz, dlaczego funkcja nowe_kopia zwraca const wskaźnik, zamiast wskaźnik. rozumiem, że to wskaźnik do wykonanej przez nią kopii? Dlaczego funkcja kopiująca tworzy nienaruszalny obiekt? Przecież kopiuje, nawet kopiowanie const obiektu daje jako wynik nowy obiekt, już nieconstowy - w ogólnym przypadku oczywiście.

Nie likwiduj objawów, tylko przyczynę, zmień deklarację funkcji kopiującej, żeby zwykły pointer zwracała.

0
Zwierze * Wilk::nowe_kopia(void)
{
	return new Wilk(*this);
}

To jest kod funkcji tak samo jest robione to w Symfonii w rozdziale o funkcjach wirtualnych. Jednak Pan Grębosz nowe obiekty tworzy w ciele głównego kodu programu a ja w funkcji składowej, której jako argument podaję referencję do obiektu typu Zwierze, zachodzi konwersja standardowa i wszystko powinno być ok. Nie wiem czy problem taki może stwarzać to że klasa Zwierze jest klasą abstrakcyjną i posiada funkcje czysto wirtualne. nowe_kopia() jest oczywiście również funkcją wirtualną...

0

klasę abstrakcyjną pokaż, na razie tutaj w każdym razie, dobre reguły mówią, że się pisze:

Zwierze * Wilk::nowe_kopia(void) const
{
        return new Wilk(*this);
}

bo twoja funkcja nie rusza obiektu, więc niech to oświadcza, że metoda jest constowa (zwróć uwagę, że konstruktor kopiujący pobiera const& Wilk).

W abstrakcyjnej też wypada dać:

virtual Abstrakcyjna * nowe_kopia(void) const = 0;

takich zamian może być trochę sporo (bo constowe metody mogą wołać tylko constowe). W Symfoni kwestia constów przy metodach jest chyba pobieżnie opisana, z tego co kojarzę, bo dopiero na studiach mi położyli mocno nacisk na constowość, do tego stopnia, żeby tego pilnować.

0

Hehe wiesz co... masz u mnie piwo ;P Zapomniałem o dodawaniu constów :) Dodawałem je tylko w argumentach... wszystko przez to że nauczyłem się tego właśnie nie dawno kiedy byłem zmuszony poczytać Grębosza przed wejściówką, no ale wcześniej tego nie robiłem i pisząc ten projekt zupełnie o tym zapomniałem... Dzięki wielkie za pomoc;) Gdybyś się wybierał gdzieś na Rzeszów to daj znać;P Bo jak obiecałem jest [browar]

1 użytkowników online, w tym zalogowanych: 0, gości: 1