PROBLEMA codice c++ con classi derivate

fedi98

Nuovo Utente
121
8
vi allego qua il mio frammento di codice (scusate i nomi, ma mi sono attenuto a quelli che mi forniva il libro)

#include <iostream>
using namespace std;


class veicolo
{
public:
bool stato_motore;
string nome_proprietario;
string colore;
veicolo (string _nome_proprietario, string _colore)
{
nome_proprietario=_nome_proprietario;
colore=_colore;
stato_motore=true;
}
void mostra_stato ()
{
cout << "Veicolo di: " << nome_proprietario << ", colore: " << colore << endl;
if (stato_motore==1)
{
cout << "Motore acceso" << endl;
}
else
{
cout << "Motore spento" << endl;
}
}
};


class veicolo_a_propulsione_umana: public veicolo
{
veicolo_a_propulsione_umana (string _nome_proprietario, string _colore):
veicolo (_nome_proprietario, _colore)
{
}
// esempio di funzione ereditata da veicolo (eredita mostra_stato)
};


class bicicletta: public veicolo_a_propulsione_umana
{
public:
int raggi;
bicicletta (string _nome_proprietario, string _colore, int _raggi):
veicolo_a_propulsione_umana(_nome_proprietario, _colore),
veicolo (_nome_proprietario, _colore)
{
raggi=_raggi;
}
void mostra_stato () // esempio di funzione ridefinita, si aggiungono i raggi
{
cout << "Veicolo di: " << nome_proprietario << ", colore: " << colore << ", raggi: " << raggi << endl;
if (stato_motore==true)
{
cout << "Motore acceso" << endl;
}
else
{
cout << "Motore spento" << endl;
}
}
};


class veicolo_a_motore: public veicolo
{
};


class abitazione
{
};


class caravan: public veicolo_a_motore, public abitazione
{
public:
int marcia;
caravan (string _nome_proprietario, string _colore, int _marcia):
veicolo (_nome_proprietario, _colore)
{
marcia=_marcia;
}
void cambia_marcia (int n) // esempio di funzione estesa, si aggiunge cambio_marcia
{
if (marcia+n>=0&& marcia+n<=6)
{
marcia+=n;
}
}
};


int main ()
{
}



queso codice produce come errore: [Error] type 'veicolo' is not a direct base of 'bicicletta'
non me lo riesco a spiegare perchè ho riportato passo passo cio che mi ha detto il libro

grazie a chiunque mi risponda
 
M

Mursey

Ospite
bicicletta deriva da veicolo_a_propulsione_umana
non chiamare i costruttori per le classi derivate, basta quello della classe attuale
 

fedi98

Nuovo Utente
121
8
bicicletta deriva da veicolo_a_propulsione_umana
non chiamare i costruttori per le classi derivate, basta quello della classe attuale

lo so che bicicletta deriva da veicolo_a_propulsione_umana, ma veicolo_a_propulsione_umana a sua volta deriva da veicolo
comunque il mio libro chiama i costruttori anche dalle classi derivate (se io ad esempio voglia dare alla bicicletta un nome e un colore, il costruttore deve essere per forza essere implementato e chamato)...... comunque ancora non capisco l' errore
 

1nd33d

Utente Attivo
653
279
CPU
Intel i5 3570K @ 4,5Ghz
Dissipatore
Scythe Mugen 2
Scheda Madre
Gigabyte Z77X-UD3H
HDD
Samsung 840 PRO 256GB + Sandisk Ultra 250GB + Sandisk Plus 960GB
RAM
2x8GB Crucial Ballistix Tactical @2000Mhz CL9
GPU
XFX RX480 GTR Black Edition
Audio
Auzentech X-Fi Forte
Monitor
AOC i2369VW
PSU
Seasonic P660
Case
eh?
Periferiche
Razer Naga HEX v2
OS
Windows 10 64bit - Linux Mint 18
Nel costruttore di una classe puoi chiamare il costruttore della superclasse, ma non quello della supersuperclasse. Nel tuo codice, quando costruisci un oggetto di tipo bicicletta chiedi l'invocazione del costruttore della classe vapu (abbreviato) al cui interno a sua volta chiamerà comunque il costruttore di veicolo. L'errore è chiedere al costruttore di bicicletta di invocare anche il costruttore di veicolo, già invocato dal costruttore di vapu (non puoi invocare due volte lo stesso costruttore sullo stesso oggetto).
Soluzione: togli l'invocazione al costruttore di veicolo nel costruttore di bicicletta.
 

fedi98

Nuovo Utente
121
8
Nel costruttore di una classe puoi chiamare il costruttore della superclasse, ma non quello della supersuperclasse. Nel tuo codice, quando costruisci un oggetto di tipo bicicletta chiedi l'invocazione del costruttore della classe vapu (abbreviato) al cui interno a sua volta chiamerà comunque il costruttore di veicolo. L'errore è chiedere al costruttore di bicicletta di invocare anche il costruttore di veicolo, già invocato dal costruttore di vapu (non puoi invocare due volte lo stesso costruttore sullo stesso oggetto).Soluzione: togli l'invocazione al costruttore di veicolo nel costruttore di bicicletta.
Che tu sappia questa e una modifica nuova nel linguaggio c++? Perche il mio libro, che e parecchio vecchio (usa ad esempio iostream.h e non iostream + using namespace std) fa proprio un paragrafo solo per dire che si possono chiamare i costruttori dalla classe derivata fino alla supersuperclasse, separandoli con la virgolaComunque grazie, adesso correggo
 

1nd33d

Utente Attivo
653
279
CPU
Intel i5 3570K @ 4,5Ghz
Dissipatore
Scythe Mugen 2
Scheda Madre
Gigabyte Z77X-UD3H
HDD
Samsung 840 PRO 256GB + Sandisk Ultra 250GB + Sandisk Plus 960GB
RAM
2x8GB Crucial Ballistix Tactical @2000Mhz CL9
GPU
XFX RX480 GTR Black Edition
Audio
Auzentech X-Fi Forte
Monitor
AOC i2369VW
PSU
Seasonic P660
Case
eh?
Periferiche
Razer Naga HEX v2
OS
Windows 10 64bit - Linux Mint 18
Che tu sappia questa e una modifica nuova nel linguaggio c++? Perche il mio libro, che e parecchio vecchio (usa ad esempio iostream.h e non iostream + using namespace std) fa proprio un paragrafo solo per dire che si possono chiamare i costruttori dalla classe derivata fino alla supersuperclasse, separandoli con la virgolaComunque grazie, adesso correggo
Non saprei dirti... in ogni caso anche se fosse possibile, l'errore nel tuo caso è comunque concettuale: stai chiamando due volte lo stesso costruttore.
L'approccio giusto è quello di richiamare solo il costruttore della superclasse diretta ed eventualmente prevedere una catena di chiamate da costruttore a "supercostruttore".
 

signore del tempo

Utente Èlite
3,228
491
CPU
Intel Core i5 4670K
Scheda Madre
Asus Z87-Plus
HDD
WD Caviar Green 500GB
RAM
G.Skill Ares 2x4GB 1600MHz
GPU
Sapphire 7850 1GB @ 1050MHz
Audio
Integrata
Monitor
Acer V193w
PSU
XFX ProSeries 550W Core Edition
Case
CM HAF 912 plus
OS
ArchLinux + KDE - Windows 10
Che tu sappia questa e una modifica nuova nel linguaggio c++? Perche il mio libro, che e parecchio vecchio (usa ad esempio iostream.h e non iostream + using namespace std) fa proprio un paragrafo solo per dire che si possono chiamare i costruttori dalla classe derivata fino alla supersuperclasse, separandoli con la virgolaComunque grazie, adesso correggo
Mi permetto di rispondere anche io: sì, è possibile fare quanto tu vuoi, ma utilizzando l'ereditarietà virtuale; ho scritto un banale esempio qui. Nota che, come ti è stato fatto giustamente notare, è un problema di design ed il fatto che possa essere bypassato non dovrebbe indurti all'abuso di certe funzionalità del linguaggio, dato che in sviluppi futuri il problema si ripresenterebbe aggravato.
 

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili