• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

C++ - Problem z metodą w klasie

Object Storage Arubacloud
0 głosów
296 wizyt
pytanie zadane 8 kwietnia 2017 w C i C++ przez Knayder Nałogowiec (37,640 p.)

Witam, chciałem napisać bibliotekę a'la SFML, tylko że wyświetlającą wszystko w konsoli.

Problem pojawił się w metodzie draw, w klasie Console. Metoda ta, przyjmuje jako argument referencje na stały obiekt klasy abstrakcyjnej Drawable. W ciele tej metody, wywoływana jest metoda wirtualna draw klasy Drawable.

Github: https://github.com/Knayder/Console/tree/master/Console

Errory:
 

Error	C2228	left of '.draw' must have class/struct/union	Console	c:\users\knayder\desktop\c++\c++\console\console\console.h	82	
Error	C4430	missing type specifier - int assumed. Note: C++ does not support default-int	Console	c:\users\knayder\desktop\c++\c++\console\console\console.h	81	
Error	C2065	'drawable': undeclared identifier	Console	c:\users\knayder\desktop\c++\c++\console\console\console.h	82	
Error	C2143	syntax error: missing ',' before '&'	Console	c:\users\knayder\desktop\c++\c++\console\console\console.h	81	

Także w formie zdjęcia:
http://i.imgur.com/u6VYsrH.jpg

Pozdrawiam.

PS. Main ma kilka linijek, reszta to komentarz.

komentarz 8 kwietnia 2017 przez bartolinciu Dyskutant (7,580 p.)
Po co przekazujesz do funkcji draw cały obiekt prościej chyba będzie przekazać wskaźnik.
komentarz 8 kwietnia 2017 przez Knayder Nałogowiec (37,640 p.)
Co znaczy "prościej" według ciebie?

1 odpowiedź

+1 głos
odpowiedź 8 kwietnia 2017 przez criss Mędrzec (172,590 p.)
wybrane 8 kwietnia 2017 przez Knayder
 
Najlepsza
Console.h i Drawable.h includują się nawzajem. Rozwiązaniem jest jedynie deklaracja klasy Console w Drawable.h - nie potrzebujesz całej definicji, bo Drawable i tak jest tylko interfejsem.
komentarz 8 kwietnia 2017 przez Knayder Nałogowiec (37,640 p.)

http://i.imgur.com/99Uk9b7.jpg
Dostaję takie errory:

A drawable.h wygląda tak:
 

#pragma once

#include "Console.h"

class Console;

class Drawable
{
public:
	virtual ~Drawable() {}
protected:
	friend class Console;
	virtual void draw(Console &target) const = 0;
};

 

komentarz 8 kwietnia 2017 przez criss Mędrzec (172,590 p.)

#include "Console.h" nadal tam jest.

komentarz 8 kwietnia 2017 przez Knayder Nałogowiec (37,640 p.)
O_o
Działa w taki sposób, aczkolwiek nie do końca rozumiem dlaczego.
Skąd kompilator wie że klasa Console w Drawable.h to ta sama co w Console.h?

Pod jakim hasłem w google mogę szukać odpowiedzi?
komentarz 8 kwietnia 2017 przez Knayder Nałogowiec (37,640 p.)
Naprawdę zależy mi na odpowiedzi. Chociaż jakie hasło szukać w googlach :\
komentarz 8 kwietnia 2017 przez criss Mędrzec (172,590 p.)
Sorry, afk byłem :D

Wie stąd, że sie tak samo nazywa. Przecież nie mogą istnieć dwie klasy o tej samej nazwie (w tym samym namespejsie).

Bardzo często w c++ przecież deklaruje się coś, a definiuje w innym miejscu (chociażby metody - zadeklarowane są z reguły w pliku *.h w definicji klasy a zdefiniowane w *.cpp).

Szukaj pod "forward declaration"
komentarz 8 kwietnia 2017 przez Knayder Nałogowiec (37,640 p.)
No tak. Wiedziałem o tym forward declaration, aczkolwiek myślałem, że można tak robić tylko w obrębie jednego pliku. A jeżeli już robimy to w różnych, to musimy je połączyć includem.

Jest to możliwe tylko dlatego, że Drawable jest metodą abstrakcyjną i kompilator nie musi wiedzieć co to za klasa Console(Bo nie wykonuje na niej żadnych operacji)? Potrzebuje tego dopiero w klasie Rectangle, ale tam już mamy zaincludowany plik z definicją klasy Console?

Czy jest tak jak mówię?

Aha no i przepraszam za niecierpliwość, ale myślałem, że może jakoś pominąłeś, lub nie pojawiło ci się powiadomienie :P
1
komentarz 9 kwietnia 2017 przez criss Mędrzec (172,590 p.)
edycja 9 kwietnia 2017 przez criss
Spoko, spoko :D

Nie, Drawable mogłoby być jakąkolwiek klasą. Sama deklaracja wystarcza kiedy tworzysz tylko wskaźnik (lub referencje) na dany typ (i ofc nigdzie w tym pliku nie robisz dereferencji), bo wskaźnik jest zawsze wskaźnikiem na cokolwiek by nie wskazywał. No i to dobra praktyka, bo przyśpiesza kompilacje - nie includować tam gdzie nie jest to konieczne (tzn. forward declaration w headerze i #include w *.cpp).

Podobne pytania

0 głosów
2 odpowiedzi 122 wizyt
pytanie zadane 18 kwietnia 2016 w C i C++ przez alien1983 Początkujący (280 p.)
+1 głos
1 odpowiedź 80 wizyt
pytanie zadane 25 października 2023 w JavaScript przez Martita Bywalec (2,470 p.)
0 głosów
1 odpowiedź 214 wizyt
pytanie zadane 1 września 2022 w Sieci komputerowe, internet przez wanderer Gaduła (3,710 p.)

92,573 zapytań

141,423 odpowiedzi

319,648 komentarzy

61,959 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...