PROBLEMA C++, Costruttore di una classe

stex99.

Nuovo Utente
6
1
Creo un file chiamato ao.cpp su Linux Ubuntu usando l'editor emacs.
C++:
#include <iostream>

using namespace std;

class ao{
  public:
   ao();};
ao::ao(void){
  cout << "ao";
  return;}

int main(){
  ao x();
  return 0;}
Salvo in Scrivania e avvio il Terminale dalla Scrivania e inserisco i seguenti comandi:
Codice:
g++ text.cpp
./a.out
Il primo è la compilazione e non mi dà errori, di conseguenza crea il file a.out che eseguo con ./a.out
Però io mi aspettavo che eseguisse il comando cout << "ao"; ma non ha scritto niente...
PERÒ se il costruttore lo rendo un generico metodo (pubblico in tal caso) allora va bene e mi esegue le istruzioni al suo interno
 
Ultima modifica:

BrutPitt

Utente Attivo
1,166
1,262
Creo un file chiamato ao.cpp su Linux Ubuntu usando l'editor emacs.
C++:
#include <iostream>

using namespace std;

class ao{
  public:
   ao();};
ao::ao(void){
  cout << "ao";
  return;}

int main(){
  ao x();
  return 0;}
Salvo in Scrivania e avvio il Terminale dalla Scrivania e inserisco i seguenti comandi:
Codice:
g++ text.cpp
./a.out
Il primo è la compilazione e non mi dà errori, di conseguenza crea il file a.out che eseguo con ./a.out
Però io mi aspettavo che eseguisse il comando cout << "ao"; ma non ha scritto niente...
PERÒ se il costruttore lo rendo un generico metodo (pubblico in tal caso) allora va bene e mi esegue le istruzioni al suo interno

Giustamente hai corretto definendo "public:" il costruttore ... ?

Poi, semplicemente:
C++:
int main(){
  ao x;
  return 0;
}

Il tuo codice invece:
C++:
int main(){
  ao x();  // questo non fa nulla: e' solo il prototipo/dichiarazione di una funzione "x()" che restituisce "ao",
           // e non essendo usata e/o implementata e' ignorata dal compilatore
  return 0;
}
 
Ultima modifica:

stex99.

Nuovo Utente
6
1
Ah, allora ho capito male tutto ahahahahahha
io pensavo che il costruttore partisse non appena si dichiarava l'oggetto. Quindi come dovrei fare? così?
C++:
int main(){
    ao x;
    x.ao();
    return 0;
}
(ovviamente cito solo il main)
E se sì, che differenza c'è tra il costruttore e un metodo? cioè io li uso nella stessa maniera solo che il metodo non può avere il nome della classe (e il costruttore sì), il metodo ha bisogno di un tipo (int,void,...) e il costruttore no... però si trattano allo stesso modo
 
  • Mi piace
Reazioni: BrutPitt

BrutPitt

Utente Attivo
1,166
1,262
No, hai capito bene... ?
Il costruttore viene chiamato nell'istanziamento dell'oggetto, quindi:
C++:
int main(){
ao x; //chiama il costruttore
x.ao(); // questo non serve: chiami esplicimanete il costruttore una seconda volta, come metodo/funzione
return 0;
}

Era il codice precedente che formalmente faceva riferimento ad altro, e sintatticamnete non istanziava un oggetto.

Il codece precedente:
C++:
int main(){
  ao x();  // questo non fa nulla: e' solo il prototipo/dichiarazione di una funzione "x()" che restituisce "ao",
           // e non essendo usata e/o implementata e' ignorata dal compilatore
  return 0;
}

Equivale a una cosa del genere:

File1:
C++:
class ao;

// funzione NON membro della classe "ao"
ao x() { // implementazione della funzione "x()" che restituisce un oggetto "ao"
    cout << "sono solo una funzione";
    ao AO; // oggetto ao
    return AO; //ritorna un oggetto ao
}

File2
C++:
int main(){
  ao x();  // e' il prototipo della funzione nel File1:
// con questa "dichiarazione" dico semplicemente al compilatore che esiste tale funzione
x(); // adesso posso usarla... senza prototipo/dichiarazione darebbe errore, non sapendo cosa sia "x()"
  return 0;
}

Nel tuo codice la funzione "x()" non e' stata implementata ne' usata, ma solo dichiarata... per cui il compilatore ha semplicemente ignorato la dichiarazione.
Quindi non instanziavi un oggetto della classe "ao", ma facevi tutt'altro: una semplice dichiarazione/prototipo di una ipotetica funzione "x()"
 
Ultima modifica:
  • Mi piace
Reazioni: stex99.

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

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili