Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 21
  1. #1

    [C++] settare variabile in una classe

    Salve,

    ho iniziato a studiare le classi in C++ volevo sapere se si può dare subito un valore ad una variabile senza usare un metodo, ad esempio nel seguente codice imposto io il valore di una variabile di tipo string:

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    class myClass {
    
    public:
    	void print();
    private:
    	void setup();
    	typedef char* string;
    	string saluto;
    };
    
    int main()
    {
    	myClass* C = new myClass;
    	C->print();
    
    	system("pause");
    	return 0;
    }
    
    inline void myClass::print()
    {
    	setup();
    	printf("%s\n", saluto);
    }
    
    inline void myClass::setup()
    {
    	saluto = "Hello World!";
    }
    ma se provo a fare:

    codice:
    myClass::saluto = "Hello World!";
    mi da errore...

    grazie
    Alla batteria dai retta ballA

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381

    Re: [C++] settare variabile in una classe

    Se stai studiando il C++, inizia a prendere le buone abitudini
    Puoi fare quello che chiedi usando il costruttore della classe.

    codice:
    #include <iostream>
    #include <string>
    
    class myClass {
    
    public:
            myClass(const std::string& s) : saluto(s) {}
    	void print();
    private:
    	std::string saluto;
    };
    
    int main()
    {
    	myClass* C = new myClass("Hello World!");
    	C->print();
            delete C; // si libera la memoria alla fine.
    	std::cin.get();
    	return 0;
    }
    
    inline void myClass::print()
    {
    	std::cout<< saluto << std::endl;
    }
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  3. #3
    se ti riferisci alla typedef e alla printf() hai perfettamente ragione, volevo fare una cosa semplice per adesso, cmq posso implementare il costruttore della classe fuori dalla sua dichiarazione, vero?

    codice:
    class marameo {
    public:
    	marameo(string);
    	void print();
    private:
    	string saluto;
    }
    
    marameo::marameo(const string a) : saluto(a) {}
    
    void marameo::print()
    {
    	printf("%s\n", saluto);
    }
    io volevo sapere se posso partire con dei valori costanti già prefissati che fanno parte della classe, ad esempio come potrebbe essere la versione della classe stessa

    grazie
    Alla batteria dai retta ballA

  4. #4
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Più che alla printf (un pò scomoda in C++, ma perfettamente usabile) mi riferivo al typedef e ai char*. Come nome del typedef avevi scelto proprio quello che va in collisione con la std::string (quando si esplicita il namespace) e questo ti avrebbe causato problemi più avanti.
    In C++ è comunque preferibile usare std::string rispetto alle stringhe C e limitare l'uso di queste ultime solo per interfacciarsi con codice C esistente, API del sistema operativo o codice legacy.

    Se non hai già un testo di riferimento, ti consiglio Thinking in C++ di Bruce Eckel ( scaricabile liberamente dal suo sito e in altri.)
    posso implementare il costruttore della classe fuori dalla sua dichiarazione, vero?
    Certamente. Attento però che i prototipi devono essere uguali. (Nel codice ripostato sono diversi).

    Per quanto possibile sarebbe meglio fossero:
    const Tipo&
    quindi nel tuo caso
    const std::string&
    (Risparmi un costruttore di copia, può ricevere stringhe costanti letterali, etc)
    volevo sapere se posso partire con dei valori costanti già prefissati che fanno parte della classe, ad esempio come potrebbe essere la versione della classe stessa
    Con il prossimo standard ( e i compilatori che lo supportano, ormai alle porte) sarà possibile scrivere:
    codice:
    private:
    	string version="ver. 1.0,0";
    }
    Con l'attuale no, si può solo inizializzare il valore tramite il costruttore o usando una funzione apposita.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  5. #5
    ok, quindi quindi si potrebbe fare così?

    codice:
    class marameo {
    public:
    	marameo(const string);
    	void print();
    private:
    	string saluto;
    	string versione;
    }
    
    marameo::marameo(const string a) : saluto(a), versione("V1.0.0") {}
    
    void marameo::print()
    {
    	printf("%s\n", saluto);
    }
    (naturalmente in questo semplice esempio non c'è nessun bisogno di dichiarare/implementare un distruttore, credo)

    sto leggendo quel testo insieme ad "Accelerated C++"

    grazie
    Alla batteria dai retta ballA

  6. #6
    pardon, /string versione/ è "public:" e mafari anche "static"
    Alla batteria dai retta ballA

  7. #7
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Si, (a parte che si perde una & per strada, non marginale.)

    (naturalmente in questo semplice esempio non c'è nessun bisogno di dichiarare/implementare un distruttore, credo)
    No, in questo caso no. Il distruttore serve quando si devono liberare risorse (variabili allocate nella classe, chiudere un file, liberare un HANDLE etc.)

    pardon, /string versione/ è "public:" e mafari anche "static"
    Per il costruttore non ha importanza se sono public, protected o private: ci accede comunque.
    Se sono static però non puoi inizializzarle così, ma devi farlo fuori dalla classe.
    Una variabile static esiste anche se non esiste il suo oggetto.
    In questo caso il tutto diventa:
    codice:
    class marameo {
    public:
    	marameo(const string& ) ;
    	void print();
    	static string versione;
    private:
    	string saluto;
    };
    
    string marameo ::versione="Ver 1.0.0"; // obbligatorio farlo qui.
    
    marameo::marameo(const string& a) : saluto(a) {}
    
    void marameo::print()
    {
    	printf("%s\n", saluto);
    }
    
    int main () {
    
        cout << marameo::versione << endl;
        marameo m("ciao");
    
    }
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  8. #8
    ma allora se voglio vedere dall'esterno della classe una variabile privata (senza modificarla) l'unico modo è creare un metodo pubblico della classe con lo stesso nome della variabile? (il compito di questo metodo sarà tornare la variabile)
    Alla batteria dai retta ballA

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Se è privata ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10

    Re: Re: [C++] settare variabile in una classe

    Originariamente inviato da shodan
    codice:
    class myClass {
    
    public:
            myClass(const std::string& s) : saluto(s) {}
    	void print();
    private:
    	std::string saluto;
    };
    scusa shodan ma perchè a questo punto non lo scrivi cosi che mi sembra qualcosa di molto più chiaro:

    codice:
    public:
           myClass(std::string s) { saluto = s; }
    private:
           std::string saluto;
    ?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.