Jump to content


Photo

[C++] problema che non so descrivere nel campo titolo del thread


This topic has been archived. This means that you cannot reply to this topic.
15 replies to this topic

#1 toyo

toyo

    sono triste

  • Donatori di sperma
  • PipPipPipPipPipPipPip
  • 44151 posts

Posted 12 July 2011 - 18:33

Sono abbastanza sicuro che sarà una cazzata, ma ci sto perdendo il pomeriggio.

Allora, una funzione/metodo che prende parametri passati come const & è comoda per risparmiare memoria (evita costruttori di copia) quando dobbiamo passare uno o più parametri che non saranno modificati dalla funzione.


Ok, sempre usati, sempre andato tutto bene, però ora:

la firma del metodo è

void inserisciGruppo( const string &, const Account* &  );

l'invocazione è
Account* Legami::crea_account_polimorfo(string line){



[....cose....]



this->inserisciGruppo(idgruppo,tmp);



}


idgruppo è una string creata dentro crea_account_polimorfo, tmp è un Account*, sempre creato in crea_account_polimorfo

errore:

scheletro_logica.cpp:73:46: error: no matching function for call to ‘Legami::inserisciGruppo(std::string&, Account*&)’

scheletro_logica.cpp:26:6: note: candidate is: void Legami::inserisciGruppo(const std::string&, const Account*&)

in pratica: non ho la funzione che prende string& e Account*&, ho quella che prende const string& e const Account&.

:better: Perchè? Non dovrebbe funzionare?



Inb4 errore del cazzo.

FIRMA FOTTUTAMENTE EDITATA. IL FOTTUTO STAFF.
 

Mai più giorni felici


#2 MadJackal

MadJackal

    Schiavo

  • Membri
  • PipPipPipPipPip
  • 3105 posts

Posted 12 July 2011 - 23:32

Prime cose che mi viene in mente: chiami per caso metodi NON const della classe Account nella funzione inserisciGruppo (se ci usi dentro this, sono dichiarati non const al 100%)? Hai dichiarato la variabile che passi alla funzione come const Account*?

Nota che per passare un argomento per reference, senza quindi richiamare il copy-constructor, il const non è necessario. E c'è differenza tra una const reference ed una reference "normale", che mi sa che è la cosa che ti ha gabbato.


Secondariamente, che compilatore usi? Mi sa tanto di un GCC olderrimo...
In Soviet Italy, the evil army owns you!

#3 TigerShark

TigerShark

    Schiavo

  • Membri
  • PipPipPipPipPipPipPip
  • 16685 posts

Posted 13 July 2011 - 08:48

scusa, ma se sei dentro la classe perche' usi this-> ?
I must not fear. Fear is the mind-killer. Fear is the little-death that brings total obliteration. I will face my fear. I will permit it to pass over me and through me. And when it has gone past I will turn the inner eye to see its path. Where the fear has gone there will be nothing. Only I will remain.

#4 toyo

toyo

    sono triste

  • Donatori di sperma
  • PipPipPipPipPipPipPip
  • 44151 posts

Posted 13 July 2011 - 13:17

Prime cose che mi viene in mente: chiami per caso metodi NON const della classe Account nella funzione inserisciGruppo (se ci usi dentro this, sono dichiarati non const al 100%)?


no, nella funzione inserisciGruppo vengono chiamati metodi non const, ma della classe Gruppo


Hai dichiarato la variabile che passi alla funzione come const Account*?


no, è dichiarata come Account* tmp; poi in uno switch c'è la new


Nota che per passare un argomento per reference, senza quindi richiamare il copy-constructor, il const non è necessario. E c'è differenza tra una const reference ed una reference "normale", che mi sa che è la cosa che ti ha gabbato.

vero, me la sono riguardata, il const serve per permettere di passare oggetti anonimi come reference, l'avevo lasciato per quello. L'ho tolto e funziona, grazie :okay: .
Però non capisco ancora perché prima non funzionasse, in quanto i 2 parametri passati erano due oggetti indirizzabili, non oggetti anonimi.





Secondariamente, che compilatore usi? Mi sa tanto di un GCC olderrimo...


come ide uso netbeans, il compilatore è il g++ standard della macchina

FIRMA FOTTUTAMENTE EDITATA. IL FOTTUTO STAFF.
 

Mai più giorni felici


#5 toyo

toyo

    sono triste

  • Donatori di sperma
  • PipPipPipPipPipPipPip
  • 44151 posts

Posted 13 July 2011 - 13:17

scusa, ma se sei dentro la classe perche' usi this-> ?



boh, è un vezzo che mi porto dalle superiori. L'ho tolto dai, ma alla fine non cambiava niente.

FIRMA FOTTUTAMENTE EDITATA. IL FOTTUTO STAFF.
 

Mai più giorni felici


#6 toyo

toyo

    sono triste

  • Donatori di sperma
  • PipPipPipPipPipPipPip
  • 44151 posts

Posted 13 July 2011 - 15:24

Ok ora c'è una roba che mi fa alquanto bestemmiare :whistler:

void Legami::inserisciGruppo( string& s, Account* &  member){

    vector::iterator it;

    it= gruppi->begin();

    [ ... cose commentate ... ]

    }

così dà segmentation fault :whistler:

void Legami::inserisciGruppo( string& s, Account* &  member){

    vector::iterator it;

    //it= gruppi->begin();

    [ ... cose commentate ... ]

    }

così no :asd:

gruppi è un vector*

al primo colpo è vuoto, quindi il begin dovrebbe restituirimi l'iteratore past-the-end


invece segmentation fault :cryy:

FIRMA FOTTUTAMENTE EDITATA. IL FOTTUTO STAFF.
 

Mai più giorni felici


#7 toyo

toyo

    sono triste

  • Donatori di sperma
  • PipPipPipPipPipPipPip
  • 44151 posts

Posted 13 July 2011 - 15:25

che mona, non l'avevo inizializzato nel costruttore :whistler:


fa bene scrivere le cose però :whistler:

FIRMA FOTTUTAMENTE EDITATA. IL FOTTUTO STAFF.
 

Mai più giorni felici


#8 toyo

toyo

    sono triste

  • Donatori di sperma
  • PipPipPipPipPipPipPip
  • 44151 posts

Posted 12 July 2011 - 18:33

Sono abbastanza sicuro che sarà una cazzata, ma ci sto perdendo il pomeriggio.

Allora, una funzione/metodo che prende parametri passati come const & è comoda per risparmiare memoria (evita costruttori di copia) quando dobbiamo passare uno o più parametri che non saranno modificati dalla funzione.


Ok, sempre usati, sempre andato tutto bene, però ora:

la firma del metodo è

void inserisciGruppo( const string &, const Account* &  );

l'invocazione è
Account* Legami::crea_account_polimorfo(string line){



[....cose....]



this->inserisciGruppo(idgruppo,tmp);



}


idgruppo è una string creata dentro crea_account_polimorfo, tmp è un Account*, sempre creato in crea_account_polimorfo

errore:

scheletro_logica.cpp:73:46: error: no matching function for call to ‘Legami::inserisciGruppo(std::string&, Account*&)’

scheletro_logica.cpp:26:6: note: candidate is: void Legami::inserisciGruppo(const std::string&, const Account*&)

in pratica: non ho la funzione che prende string& e Account*&, ho quella che prende const string& e const Account&.

:yuno: Perchè? Non dovrebbe funzionare?



Inb4 errore del cazzo.

FIRMA FOTTUTAMENTE EDITATA. IL FOTTUTO STAFF.
 

Mai più giorni felici


#9 MadJackal

MadJackal

    Schiavo

  • Membri
  • PipPipPipPipPip
  • 3105 posts

Posted 12 July 2011 - 23:32

Prime cose che mi viene in mente: chiami per caso metodi NON const della classe Account nella funzione inserisciGruppo (se ci usi dentro this, sono dichiarati non const al 100%)? Hai dichiarato la variabile che passi alla funzione come const Account*?

Nota che per passare un argomento per reference, senza quindi richiamare il copy-constructor, il const non è necessario. E c'è differenza tra una const reference ed una reference "normale", che mi sa che è la cosa che ti ha gabbato.


Secondariamente, che compilatore usi? Mi sa tanto di un GCC olderrimo...
In Soviet Italy, the evil army owns you!

#10 TigerShark

TigerShark

    Schiavo

  • Membri
  • PipPipPipPipPipPipPip
  • 16685 posts

Posted 13 July 2011 - 08:48

scusa, ma se sei dentro la classe perche' usi this-> ?
I must not fear. Fear is the mind-killer. Fear is the little-death that brings total obliteration. I will face my fear. I will permit it to pass over me and through me. And when it has gone past I will turn the inner eye to see its path. Where the fear has gone there will be nothing. Only I will remain.

#11 toyo

toyo

    sono triste

  • Donatori di sperma
  • PipPipPipPipPipPipPip
  • 44151 posts

Posted 13 July 2011 - 13:17

Prime cose che mi viene in mente: chiami per caso metodi NON const della classe Account nella funzione inserisciGruppo (se ci usi dentro this, sono dichiarati non const al 100%)?


no, nella funzione inserisciGruppo vengono chiamati metodi non const, ma della classe Gruppo


Hai dichiarato la variabile che passi alla funzione come const Account*?


no, è dichiarata come Account* tmp; poi in uno switch c'è la new


Nota che per passare un argomento per reference, senza quindi richiamare il copy-constructor, il const non è necessario. E c'è differenza tra una const reference ed una reference "normale", che mi sa che è la cosa che ti ha gabbato.

vero, me la sono riguardata, il const serve per permettere di passare oggetti anonimi come reference, l'avevo lasciato per quello. L'ho tolto e funziona, grazie :trollface: .
Però non capisco ancora perché prima non funzionasse, in quanto i 2 parametri passati erano due oggetti indirizzabili, non oggetti anonimi.





Secondariamente, che compilatore usi? Mi sa tanto di un GCC olderrimo...


come ide uso netbeans, il compilatore è il g++ standard della macchina

FIRMA FOTTUTAMENTE EDITATA. IL FOTTUTO STAFF.
 

Mai più giorni felici


#12 toyo

toyo

    sono triste

  • Donatori di sperma
  • PipPipPipPipPipPipPip
  • 44151 posts

Posted 13 July 2011 - 13:17

scusa, ma se sei dentro la classe perche' usi this-> ?



boh, è un vezzo che mi porto dalle superiori. L'ho tolto dai, ma alla fine non cambiava niente.

FIRMA FOTTUTAMENTE EDITATA. IL FOTTUTO STAFF.
 

Mai più giorni felici


#13 toyo

toyo

    sono triste

  • Donatori di sperma
  • PipPipPipPipPipPipPip
  • 44151 posts

Posted 13 July 2011 - 15:24

Ok ora c'è una roba che mi fa alquanto bestemmiare :oki:

void Legami::inserisciGruppo( string& s, Account* &  member){

    vector::iterator it;

    it= gruppi->begin();

    [ ... cose commentate ... ]

    }

così dà segmentation fault :pua:

void Legami::inserisciGruppo( string& s, Account* &  member){

    vector::iterator it;

    //it= gruppi->begin();

    [ ... cose commentate ... ]

    }

così no :v

gruppi è un vector*

al primo colpo è vuoto, quindi il begin dovrebbe restituirimi l'iteratore past-the-end


invece segmentation fault :v

FIRMA FOTTUTAMENTE EDITATA. IL FOTTUTO STAFF.
 

Mai più giorni felici


#14 toyo

toyo

    sono triste

  • Donatori di sperma
  • PipPipPipPipPipPipPip
  • 44151 posts

Posted 13 July 2011 - 15:25

che mona, non l'avevo inizializzato nel costruttore :pua:


fa bene scrivere le cose però :oki:

FIRMA FOTTUTAMENTE EDITATA. IL FOTTUTO STAFF.
 

Mai più giorni felici


#15 toyo

toyo

    sono triste

  • Donatori di sperma
  • PipPipPipPipPipPipPip
  • 44151 posts

Posted 19 August 2011 - 16:32

ho scoperto qual'era il problema iniziale, che avevo per il momento lasciato stare passando i puntatori per copia


in pratica, per prendere un riferimento puntatore costante a Tipo, non bisogna scrivere (come "intuitivo") cost Tipo * &, perchè questo è un riferimento puntatore a Tipo costante, e quindi non può prendere un oggetto anonimo, ma solo un lvalue.

Bisogna invece scrivere Tipo* const & (riferimento puntatore costante a Tipo), così prende anche oggetti anonimi (rvalue senza lvalue) :asd:

se si vuole prendere un riferimento puntatore costante a Tipo costante invece è const Tipo * const & :alone:

FIRMA FOTTUTAMENTE EDITATA. IL FOTTUTO STAFF.
 

Mai più giorni felici


#16 matti157

matti157

    Schiavo

  • GRULLINO
  • 15041 posts

Posted 19 August 2011 - 16:46

ahhhhhhhhh ora si che si ragiona :asd:
Cooler Master 690|Intel Core i7 920 @3.7Ghz|Gigabyte GTX 770 OC|12GB Corsair DDR3 1600|Noctua NH-U12P|Corsair TX550

 

 

Un giorno ho visto per strada un tizio barcollante , sporco, pieno di chiazze verdi e pus, infastidiva bambine e rubava i soldi alle vecchiette: era uno che postava nel DS.


ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้