Sono a digiuno di C++ mi aiutate a comprendere qst sintassi?

di il
19 risposte

Sono a digiuno di C++ mi aiutate a comprendere qst sintassi?

Sto seguendo un libro sulla creazione di un engine 3D ma gli esempi riportati sono in C++, lunguaggio che non conosco per niente. Grossomodo riesco a capire i passaggi, ma ci sono alcune sintassi che non ho mai visto in altri linguaggi per cui mi riesce difficile comprenderle.

Vector3 &operator =(const Vector3 &a){
 //codice funzione
}
so che operator è utilizzato per fare l'overloading delle funzioni associate agli operatori, ma quado si antepone la "&" cosa significa?
// Construct given three values
Vector3(float nx, float ny, float nz) : x(nx), y(ny), z(nz) {}
che signifca x(nx)? (idem per la y e la z)

float oneOverA = 1.0f ; 
cos'è qualla f? Possibile sia float? Quindi per i numeri interi si sceive 10i ?

 return *this;
cos'è l'asterisco?

19 Risposte

  • Re: Sono a digiuno di C++ mi aiutate a comprendere qst sintassi?

    so che operator è utilizzato per fare l'overloading delle funzioni associate agli operatori, ma quado si antepone la "&" cosa significa?
    Si tratta di un riferimento.
    che signifca x(nx)? (idem per la y e la z)
    Il codice che hai postato è evidentemente quello di un costruttore e le chiamate che indichi sono quelle ai costruttori delle classi base.
    cos'è qualla f? Possibile sia float? Quindi per i numeri interi si sceive 10i ?
    La f è per i float e questa indicazione c'è solo per i float.
    cos'è l'asterisco?
    Indica un puntatore.
    Ma tu in quale linguaggio vorresti sviluppare il motore 3D? Magari qualcuno di questo forum può indicarti un testo più appropriato...
  • Re: Sono a digiuno di C++ mi aiutate a comprendere qst sintassi?

    In java, ma ormai ho già iniziato con questo libro.
    Cmq non capisco questo passaggio
    le chiamate che indichi sono quelle ai costruttori delle classi base.
    Le classi base hanno costruttori per x, y e z?
  • Re: Sono a digiuno di C++ mi aiutate a comprendere qst sintassi?

    Le classi base hanno costruttori per x, y e z?
    Scusa, probabilmente devo rivedermi un pò di cose (a mia parziale discolpa, non vedendo il codice completo sono stato portato fuori strada, chiedo scusa).
    In realtà si tratta di una lista di inizializzazione con il quale puoi inizializzare campi costanti, quindi x, y e z vengono inizializzati con nx, ny e nz.
  • Re: Sono a digiuno di C++ mi aiutate a comprendere qst sintassi?

    Riporto parte del codice:
    class Vector3
    {
    		public:
    		// Public representation: Not many options here.
    		float x,y,z;
    		// Constructors
    		// Default constructor leaves vector in
    		// an indeterminate state
    		Vector3() {}
    		// Copy constructor
    		Vector3(const Vector3 &a) : x(a.x), y(a.y), z(a.z) {}
    		// Construct given three values
    		Vector3(float nx, float ny, float nz) : x(nx), y(ny), z(nz) {} //<----- QUESTO E' IL NOSTRO CASO
    		// Standard object maintenance
    		// Assignment. We adhere to C convention and
    		// return reference to the lvalue
    		Vector3 &operator =(const Vector3 &a)
    		{
    		   x = a.x; y = a.y; z = a.z;
    		   return *this;
            }
    
    ora quelle x, y e z che stanno prima delle parentesi si riferiscono alle rispettive proprietà della classe Vector3? Quindi è un'operazione di assegnazione? E per quale motivo non si scrive semplicemente x=a.x (idem per y e z) ?

    I costruttori poi sono sempre inizializzati utilizzando i due punti ":" prima del corpo? In java sono inizializzati come normali funzioni, mettendo il corpo tra parentesi graffe, quei due punti nn li ho mai visti.
  • Re: Sono a digiuno di C++ mi aiutate a comprendere qst sintassi?

    // Default constructor leaves vector in
          // an indeterminate state
          Vector3() {}
          // Copy constructor
          Vector3(const Vector3 &a) : x(a.x), y(a.y), z(a.z) {}
    Siccome si parla di costruttori in C++ i costruttori si inizializzano con i due punti. L'inizializzazione si va con x(a.x) in quanto in realta stai chiamando il costruttore della variabile x che in questo caso è un float e coincide con l'operatore di assegnazione essendo una variabile POD (Plain Old Data), ma potrebbe bennissimo essere a sua volta una classe la cui inizializzazione è diversa dalla assegnazione. Per questo esistono i overload degli operatori. Per assurdo potresti avere una classe somma dove l'operatore = in overload non fa l'assegnazione ma un'altra cosa.
    Quindi in C++ l'inizializzazione e l'assegnazione sono due cose ben distinte che chiamano a loro volta due funzioni diferenti. L'inizilizzazione chiama il costruttore, l'assegnazione chiama l'overload dell'operatore = oppure quello di default generato dal compilatore.

    p.s.: tutte e due i costructor sono fatti male e propensi a bug.
  • Re: Sono a digiuno di C++ mi aiutate a comprendere qst sintassi?

    X(a.x) mi suona come un richiamo ad una funzione che pero non é stata dichiarata.
    E' quindi una funzione che crea di default il compilatore, magari in base ai parametri della classe?
  • Re: Sono a digiuno di C++ mi aiutate a comprendere qst sintassi?

    È la chiamata del costruttore della classe instanziata da x.
    class x
    { 
          x(const x &  rhs);
    ...................
    ]
    Solo che x è un float quindi un tipo di dato base.

    Non so in java ma in C++ io posso iniziallizare un int/float anche così
    int a(3);
    La differenza è quella di prima. inizializzazione variabile contro assegnazione variabile.
    int a = 3;
  • Re: Sono a digiuno di C++ mi aiutate a comprendere qst sintassi?

    class x
    {
    x(const x & rhs);
    ...................
    ]
    sinceramente continuo a non capire. La classe x chi l'ha creata? Nel codice non c'è quindi devo presumere che la crea in automatico il compilatore?
  • Re: Sono a digiuno di C++ mi aiutate a comprendere qst sintassi?

    La classe x la stai definendo tu. La segnature indicata e' quella del "costruttore di copia".
    Viene usato negli assegnamenti in fase di creazione e nel passaggio parametri per valore.
  • Re: Sono a digiuno di C++ mi aiutate a comprendere qst sintassi?

    Ma non c'è in nessuna parte del codice questa dichiarazione
    class x
    {
    x(const x & rhs);
    ...................
    ]
    Quindi io non ho definito nulla . Resta dunque il dubbio, da dove salta fuori la classe x ?
  • Re: Sono a digiuno di C++ mi aiutate a comprendere qst sintassi?

    Ti stai perdendo in un bichiere di acqua. Vuoto, per giunta !

    Riassumiano:

    un programma C/C++ generalmente e' composto da piu' file.

    Ci sono 2 tipi di file:

    1) i file con estensione .c .cpp .cxx contenenti l'implementazione degli oggetti (variabili, funzioni, classi)

    2) i file con estensione .h, .hpp, .hxx contenenti la dichiarazione degli oggetti (variabili, funzioni classi). La dichiarazione NON e' l'implementazione.

    La dichiarazione dice: esiste un oggeto di questo tipo con questo nome.

    E a che serve dichiarare oggetti in un file .h?

    Serve perche' i file .h vengono inclusi dentro i file .c per informare il codice relativo all'implementazione degli oggetti ivi presenti, che da qualche parte (ma lo sapra' solo il linker, non il compilatore) esitono degli oggetti con quelle particolari caratteristiche.

    Ad esempio: quando usi la funzione "printf", il compilatore deve sapere che tale funzione esiste (altrimenti genera un errore di compilazione), e che riceve certi parametri in ingresso e ritorna un certo tipo di risultato. Ma non ha idea di come questa funzione e' implementata.
    Ma come fa a sapere che tale funzioen esiste? Lo sa perche' in testa al tuo file hai scritto "#include <stdio.h>", il file .h contenente un bel po' di definizioni.

    Ora, non e' il caso di andare nei dettagli infinitesimi (template, inline code ecc...).

    Quindi, la classe x da qulche parte sta, altrimenti non avresti potuto fare copia/incolla del pezzo di codice postato ! Almeno nel file .h da cui hai fatto copia/incolla.

    E se e' usata, ci deve essere anche la relativa implementazione.
    Se non e' usata, allora la sua dichiarazione non ha effetto: il compiler la compila ma non se ne fa nulla, il linker non ha la necessita' di sapere dove si trova e quindi non ci fa nulla. E' uno zombi!

    L'impressione, comunque, e' che non hai letto il testo sul C++ che sicuramente devi avere. Sono concetti presenti nei primi capitoli, se non adirittura nell'introduzione.
  • Re: Sono a digiuno di C++ mi aiutate a comprendere qst sintassi?

    La dichiarazione dice: esiste un oggeto di questo tipo con questo nome.
    Esatto, capisco questo, ma nel codice riportato sul libro non c'è alcuna dichiarazione della classe x, per questo mi sorge il dubbio.
    Tra l'altro non c'è nemmeno l'include di altri file .h, per cui a maggior ragione non capisco come fa a dar per scontata l'esistenza di una classe x

    Posso solo pernsare che il codice è incompleto, che manca l'implementazione di classi e file d'intestazione, etc etc..
    L'impressione, comunque, e' che non hai letto il testo sul C++ che sicuramente devi avere. Sono concetti presenti nei primi capitoli, se non adirittura nell'introduzione.
    Il testo che sto leggendo è sulla matematica degli engine 3d che riporta esempi applicati in c++ (supponendo che già si abbiano delle basi su tale linguaggio, ma io non le ho)
  • Re: Sono a digiuno di C++ mi aiutate a comprendere qst sintassi?

    M sembra che tu stia facendo il passo abbondantemente piu' lungo della gamba.

    Se la grafica 3D e' geometria in R^3, si suppone che uno che affronta un argomento del genere, dal punto di vista della programmazione, non abbia problemi concettuali.

    Il consiglio e', ovviamente: studia prima il linguaggio di programmazione e poi affronta il problema di come si fa modellazione 3D.
  • Re: Sono a digiuno di C++ mi aiutate a comprendere qst sintassi?

    migliorabile ha scritto:


    Tra l'altro quale engine? Ogre? Irrlicht? Panda 3D?
    Nessuno, è solo un libro incentrato sul capire le fondamenta matematiche degli engine, per questo la parte di programmazione è secondaria.

    Questo è il libro http://www.amazon.com/Primer-Graphics-Development-Wordware-Library/dp/1556229119
Devi accedere o registrarti per scrivere nel forum
19 risposte