-
1. Data: 2009-07-02 19:25:15
Temat: dziedziczenie c++
Od: "larry2003" <l...@i...pl>
Witam,
Jestem mocno początkującą osobą w c++ a mam mały problem w wykorzystywaniu
dziedziczenia:
Klasa Football wygląda tak:
class Football
{
public:
int ile;
Football(int d);
Football();
void podaj(void);
void strzel(void);
void dosrodkuj(void);
void odb_pilke(void);
void drybluj(void);
void bron(void);
};
klasa Silowy, która ma dziedziczyć po Football tak:
class Silowy : public Football
{
public:
int ile;
Silowy(int d);
Silowy();
void przepychanie_w_polu(void);
void umiejetny_faul(void);
void gra_glowa(void);
};
i przy kompilacji wyrzuca mi błąd:
g++ -c silowy.cpp
In file included from silowy.cpp:1:
silowy.h:2: error: expected class-name before '{' token
make: *** [silowy.o] Error 1
Mógłbym prosić o pomoc w rozwiązaniu tego problemu?
-
2. Data: 2009-07-02 19:39:03
Temat: Re: dziedziczenie c++
Od: Jacek Czerwinski <...@...z.pl>
larry2003 pisze:
> Witam,
>
> Jestem mocno początkującą osobą w c++ a mam mały problem w wykorzystywaniu
> dziedziczenia:
> Klasa Football wygląda tak:
> class Football
>
>
> klasa Silowy, która ma dziedziczyć po Football tak:
> class Silowy : public Football
>
> i przy kompilacji wyrzuca mi błąd:
> g++ -c silowy.cpp
> In file included from silowy.cpp:1:
> silowy.h:2: error: expected class-name before '{' token
> make: *** [silowy.o] Error 1
>
> Mógłbym prosić o pomoc w rozwiązaniu tego problemu?
Domyślam się (nie piszesz o tym, zgaduję) że w silowy.h trzeba
includować footbal.h (nazwy plików przypuszczalne)
-
3. Data: 2009-07-02 20:00:01
Temat: Re: dziedziczenie c++
Od: "larry2003" <l...@i...pl>
Użytkownik "Jacek Czerwinski" <...@...z.pl> napisał w wiadomości
news:h2j2cq$n7a$1@news.onet.pl...
> larry2003 pisze:
>> Witam,
>>
>> Jestem mocno początkującą osobą w c++ a mam mały problem w
>> wykorzystywaniu dziedziczenia:
>> Klasa Football wygląda tak:
>> class Football
>>
>
>> klasa Silowy, która ma dziedziczyć po Football tak:
>> class Silowy : public Football
>
>>
>> i przy kompilacji wyrzuca mi błąd:
>> g++ -c silowy.cpp
>> In file included from silowy.cpp:1:
>> silowy.h:2: error: expected class-name before '{' token
>> make: *** [silowy.o] Error 1
>>
>> Mógłbym prosić o pomoc w rozwiązaniu tego problemu?
>
> Domyślam się (nie piszesz o tym, zgaduję) że w silowy.h trzeba includować
> footbal.h (nazwy plików przypuszczalne)
>
Ok, czyli jak rozumiem silowy.h powinien wyglądać następująco:
#include "football.h"
class Silowy : public Football
{
public:
int ile;
Silowy(int d);
Silowy();
void przepychanie_w_polu(void);
void umiejetny_faul(void);
void gra_glowa(void);
};
z tym że z taką wersją silowy.h kompilator wyrzuca:
g++ -c zaliczenie.cpp
In file included from silowy.h:1,
from zaliczenie.cpp:2:
football.h:1: error: redefinition of 'class Football'
football.h:3: error: previous definition of 'class Football'
make: *** [zaliczenie.o] Error 1
-
4. Data: 2009-07-02 20:25:53
Temat: Re: dziedziczenie c++
Od: Tomasz Bywalec <t...@p...dont.spam.me.o2.pl>
larry2003 pisze:
> Użytkownik "Jacek Czerwinski" <...@...z.pl> napisał w wiadomości
> news:h2j2cq$n7a$1@news.onet.pl...
[...]
>> Domyślam się (nie piszesz o tym, zgaduję) że w silowy.h trzeba includować
>> footbal.h (nazwy plików przypuszczalne)
>>
>
> Ok, czyli jak rozumiem silowy.h powinien wyglądać następująco:
>
> #include "football.h"
> class Silowy : public Football
> {
> public:
> int ile;
> Silowy(int d);
> Silowy();
> void przepychanie_w_polu(void);
> void umiejetny_faul(void);
> void gra_glowa(void);
> };
> z tym że z taką wersją silowy.h kompilator wyrzuca:
>
> g++ -c zaliczenie.cpp
> In file included from silowy.h:1,
> from zaliczenie.cpp:2:
> football.h:1: error: redefinition of 'class Football'
> football.h:3: error: previous definition of 'class Football'
> make: *** [zaliczenie.o] Error 1
>
>
To by mogło oznaczać, że w 'zaliczenie.cpp' już include'ujesz
plik 'football.h' i kompilator dostaje definicję klasy
Football zdublowaną (tylko dlaczego w takim razie wcześniej
pojawiał się błąd przy kompilacji klasy Silowy?).
Ale, tak czy owak, możesz spróbować dodać include-guard'y do
swoich plików nagłówkowych (z tego co widzę brakuje ich w Twoim
programie). To w zasadzie podstawy pisania w C++ więc i tak
Ci się to przyda. Na początku i końcu pliku football.h dodajesz
następujące 3 linijki:
#ifndef FOOTBALL_H_INCLUDED
#define FOOTBALL_H_INCLUDED
// tu zawartość pliku
#endif
a w silowy.h prawie to samo, ale nieco inaczej:
#ifndef SILOWY_H_INCLUDED
#define SILOWY_H_INCLUDED
// tu zawartość pliku
#endif
i podobnie w innych plikach nagłówkowych.
Ta "sztuczka" zapobiega kilkukrotnemu załączeniu jednego pliku
podczas kompilacji.
Symbole FOOTBALL_H_INCLUDED i SILOWY_H_INCLUDED są tylko przykładami -
równie dobrze mogłyby to być np. BLABLA111_X i TDTD_1234. Ważne
jest aby w danym pliku .h w linijce z #ifndef i #define użyty był
ten sam symbol i aby symbole te nie powtarzały się w różnych plikach
nagłówkowych.
Mam nadzieję że to pomoże w rozwiązaniu problemu.
Pozdrawiam,
Tomek Bywalec
-
5. Data: 2009-07-02 20:44:16
Temat: Re: dziedziczenie c++
Od: "larry2003" <l...@i...pl>
Użytkownik "Tomasz Bywalec" <t...@p...dont.spam.me.o2.pl> napisał w
wiadomości news:h2j58o$gbm$1@atlantis.news.neostrada.pl...
> larry2003 pisze:
>> Użytkownik "Jacek Czerwinski" <...@...z.pl> napisał w wiadomości
>> news:h2j2cq$n7a$1@news.onet.pl...
> [...]
>>> Domyślam się (nie piszesz o tym, zgaduję) że w silowy.h trzeba
>>> includować footbal.h (nazwy plików przypuszczalne)
>>>
>>
>> Ok, czyli jak rozumiem silowy.h powinien wyglądać następująco:
>>
>> #include "football.h"
>> class Silowy : public Football
>> {
>> public:
>> int ile;
>> Silowy(int d);
>> Silowy();
>> void przepychanie_w_polu(void);
>> void umiejetny_faul(void);
>> void gra_glowa(void);
>> };
>> z tym że z taką wersją silowy.h kompilator wyrzuca:
>>
>> g++ -c zaliczenie.cpp
>> In file included from silowy.h:1,
>> from zaliczenie.cpp:2:
>> football.h:1: error: redefinition of 'class Football'
>> football.h:3: error: previous definition of 'class Football'
>> make: *** [zaliczenie.o] Error 1
>>
>>
>
> To by mogło oznaczać, że w 'zaliczenie.cpp' już include'ujesz
> plik 'football.h' i kompilator dostaje definicję klasy
> Football zdublowaną (tylko dlaczego w takim razie wcześniej
> pojawiał się błąd przy kompilacji klasy Silowy?).
>
> Ale, tak czy owak, możesz spróbować dodać include-guard'y do
> swoich plików nagłówkowych (z tego co widzę brakuje ich w Twoim
> programie). To w zasadzie podstawy pisania w C++ więc i tak
> Ci się to przyda. Na początku i końcu pliku football.h dodajesz
> następujące 3 linijki:
>
> #ifndef FOOTBALL_H_INCLUDED
> #define FOOTBALL_H_INCLUDED
>
> // tu zawartość pliku
>
> #endif
>
> a w silowy.h prawie to samo, ale nieco inaczej:
>
> #ifndef SILOWY_H_INCLUDED
> #define SILOWY_H_INCLUDED
>
> // tu zawartość pliku
>
> #endif
>
> i podobnie w innych plikach nagłówkowych.
>
> Ta "sztuczka" zapobiega kilkukrotnemu załączeniu jednego pliku
> podczas kompilacji.
> Symbole FOOTBALL_H_INCLUDED i SILOWY_H_INCLUDED są tylko przykładami -
> równie dobrze mogłyby to być np. BLABLA111_X i TDTD_1234. Ważne
> jest aby w danym pliku .h w linijce z #ifndef i #define użyty był
> ten sam symbol i aby symbole te nie powtarzały się w różnych plikach
> nagłówkowych.
>
> Mam nadzieję że to pomoże w rozwiązaniu problemu.
> Pozdrawiam,
> Tomek Bywalec
Dobra to może wkleje jak to teraz wszystko wygląda bo już sie miesza:)
Plik football.h:
#ifndef FOOTBALL_H_INCLUDED
#define FOOTBALL_H_INCLUDED
class Football
{
public:
int ile;
Football(int d);
Football();
void podaj(void);
void strzel(void);
void dosrodkuj(void);
void odb_pilke(void);
void drybluj(void);
void bron(void);
};
#endif
plik silowy.h
#ifndef SILOWY_H_INCLUDED
#define SILOWY_H_INCLUDED
class Silowy : public Football
{
public:
int ile;
Silowy(int d);
Silowy();
void przepychanie_w_polu(void);
void umiejetny_faul(void);
void gra_glowa(void);
};
#endif
plik zaliczenie.cpp
#include "football.h"
#include "silowy.h"
int main()
{
Football *f1;
f1=new Football(1);
f1->podaj();
f1->dosrodkuj();
delete f1;
Silowy *s1;
s1=new Silowy(1);
s1->przepychanie_w_polu();
s1->umiejetny_faul();
delete s1;
return 0;
}
i po dodaniuch tych trzech linijek w każdym *.h wracam do punktu wyjścia :)
g++ -c silowy.cpp
In file included from silowy.cpp:1:
silowy.h:5: error: expected class-name before '{' token
make: *** [silowy.o] Error 1
-
6. Data: 2009-07-03 02:32:32
Temat: Re: dziedziczenie c++
Od: "Mariusz Marszałkowski" <b...@g...SKASUJ-TO.pl>
> g++ -c silowy.cpp
> In file included from silowy.cpp:1:
> silowy.h:5: error: expected class-name before '{' token
> make: *** [silowy.o] Error 1
Na pierwszy rzut oka wygląda poprawnie... W poszukiwaniu błędów
warto "wyrzucić" część kodu, następnie stopniowo dodawać i
sprawdzać po dodaniu którego elementu błąd się znów pojawi. Skompiluj np.
taką wersję:
class Football
{
/*
wyrzucony kod
*/
};
class Silowy : public Football
{
/*
wyrzucony kod
*/
};
void main()
{
/*
wyrzucony kod
*/
}
pozdrawiam
--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
-
7. Data: 2009-07-03 08:19:33
Temat: Re: dziedziczenie c++
Od: Tomasz Bywalec <t...@p...dont.spam.me.o2.pl>
larry2003 pisze:
[...]
> i po dodaniuch tych trzech linijek w każdym *.h wracam do punktu wyjścia :)
>
> g++ -c silowy.cpp
> In file included from silowy.cpp:1:
> silowy.h:5: error: expected class-name before '{' token
> make: *** [silowy.o] Error 1
>
Błąd występuje podczas kompilacji pliku silowy.cpp którego źródła nie
pokazałeś - przypuszczam, że nie include'ujesz tam pliku "football.h",
w związku z czym przy parsowaniu zawartości "silowy.h" klasa Football
jest nieznana.
Spróbuj z powrotem dodać do pliku silowy.h include dołączający plik
football.h, tak aby początek pliku silowy.h wyglądał tak:
#ifndef SILOWY_H_INCLUDED
#define SILOWY_H_INCLUDED
#include "football.h"
class Silowy : public Football
... i dalej reszta pliku...
W ten sposób za każdym razem gdy dołączana jest definicja klasy Silowy
jednocześnie dołączana jest definicja klasy Football, oraz jesteś
zabezpieczony przed kilkukrotnym zainclude'owaniem definicji tej
samej klasy (include guardy).
Mam nadzieję że teraz wszystko ruszy :)
Pozdrawiam,
Tomek Bywalec
-
8. Data: 2009-07-03 15:34:59
Temat: Re: dziedziczenie c++
Od: "larry2003" <l...@i...pl>
Użytkownik "Tomasz Bywalec" <t...@p...dont.spam.me.o2.pl> napisał w
wiadomości news:h2kfh4$7tf$1@nemesis.news.neostrada.pl...
> larry2003 pisze:
> [...]
>> i po dodaniuch tych trzech linijek w każdym *.h wracam do punktu wyjścia
>> :)
>>
>> g++ -c silowy.cpp
>> In file included from silowy.cpp:1:
>> silowy.h:5: error: expected class-name before '{' token
>> make: *** [silowy.o] Error 1
>>
>
> Błąd występuje podczas kompilacji pliku silowy.cpp którego źródła nie
> pokazałeś - przypuszczam, że nie include'ujesz tam pliku "football.h",
> w związku z czym przy parsowaniu zawartości "silowy.h" klasa Football
> jest nieznana.
>
> Spróbuj z powrotem dodać do pliku silowy.h include dołączający plik
> football.h, tak aby początek pliku silowy.h wyglądał tak:
>
> #ifndef SILOWY_H_INCLUDED
> #define SILOWY_H_INCLUDED
>
> #include "football.h"
>
> class Silowy : public Football
> ... i dalej reszta pliku...
>
> W ten sposób za każdym razem gdy dołączana jest definicja klasy Silowy
> jednocześnie dołączana jest definicja klasy Football, oraz jesteś
> zabezpieczony przed kilkukrotnym zainclude'owaniem definicji tej
> samej klasy (include guardy).
>
> Mam nadzieję że teraz wszystko ruszy :)
> Pozdrawiam,
> Tomek Bywalec
Ehh i kolejny problem:) a podobno programowanie jest takie przyjemne :)
football.h wyglada tak
#ifndef FOOTBALL_H_INCLUDED
#define FOOTBALL_H_INCLUDED
class Football
{
public:
int ile;
Football(int d);
Football();
void podaj(void);
void strzel(void);
void dosrodkuj(void);
void odb_pilke(void);
void drybluj(void);
void bron(void);
};
#endif
silowy.h:
#ifndef SILOWY_H_INCLUDED
#define SILOWY_H_INCLUDED
#include "football.h"
class Silowy : public Football
{
public:
int ile;
Silowy(int d);
Silowy();
void przepychanie_w_polu(void);
void umiejetny_faul(void);
void gra_glowa(void);
};
#endif
zaliczenie.cpp:
#include "football.h"
#include "silowy.h"
int main()
{
Football *f1;
f1=new Football(1);
f1->podaj();
f1->dosrodkuj();
delete f1;
Silowy *s1;
s1=new Silowy(1);
s1->przepychanie_w_polu();
s1->umiejetny_faul();
delete s1;
return 0;
}
silowy.cpp tak:
#include "silowy.h"
#include <iostream>
Silowy::Silowy(int d)
{
ile=d;
}
void Silowy::gra_glowa(void)
{
for (int i=0;i<ile;i++)
std::cout<<"Silowy->gra_glowa()\n";
}
void Silowy::przepychanie_w_polu(void)
{
for (int i=0;i<ile;i++)
std::cout<<"Silowy->przepychanie_w_polu()\n";
}
void Silowy::umiejetny_faul(void)
{
for (int i=0;i<ile;i++)
std::cout<<"Silowy->umiejetny_faul()\n";
}
i w rezultacie po kompilacji:
g++ -o zaliczenie zaliczenie.o football.o silowy.o
silowy.o: In function `Silowy::Silowy(int)':
silowy.cpp:(.text+0x105): undefined reference to `Football::Football()'
silowy.o: In function `Silowy::Silowy(int)':
silowy.cpp:(.text+0x121): undefined reference to `Football::Football()'
collect2: ld returned 1 exit status
make: *** [zaliczenie] Error 1
-
9. Data: 2009-07-03 19:24:52
Temat: Re: dziedziczenie c++
Od: "Grzegorz Niemirowski" <g...@p...onet.pl>
larry2003 <l...@i...pl> napisał(a):
> silowy.cpp:(.text+0x105): undefined reference to `Football::Football()'
Brakuje bezparametrowego konstruktora.
--
Grzegorz Niemirowski
http://www.grzegorz.net/
OE PowerTool i aktualności ze świata Outlook Express: grzegorz.net/oe
Uptime: 0 days, 3 hours, 9 minutes and 35 seconds
-
10. Data: 2009-07-03 19:37:25
Temat: Re: dziedziczenie c++
Od: "larry2003" <l...@i...pl>
Użytkownik "Grzegorz Niemirowski" <g...@p...onet.pl> napisał w
wiadomości news:h2llu5$171u$1@opal.icpnet.pl...
> larry2003 <l...@i...pl> napisał(a):
>> silowy.cpp:(.text+0x105): undefined reference to `Football::Football()'
>
> Brakuje bezparametrowego konstruktora.
>
> --
> Grzegorz Niemirowski
> http://www.grzegorz.net/
> OE PowerTool i aktualności ze świata Outlook Express: grzegorz.net/oe
> Uptime: 0 days, 3 hours, 9 minutes and 35 seconds
A co to oznacza ?:)