SOFTWARE > Linguaggi di programmazione e scripting

dead

(1/2) > >>

legacy:
dead

cdimauro:

--- Citazione da: legacy - 13 Gennaio 2015, 19:06:58 ---e' tutto per include, non me ne vogliate  ;D
--- Termina citazione ---
Beh, C e C++ hanno solo quelli... :-\

cdimauro:
GLOM. :-X Poi io i Makefile li amo particolarmente... :'(

TheKaneB:
Nel tuo caso, di buona norma, dovresti scrivere le implementazioni di tutti gli operatori nel file .h principale. Magari sotto la definizione di classe, così:

--- Codice: ---class Banana
{

  void someFunc();
};

inline void Banana::someFunc()
{
  doBanana();
}

--- Termina codice ---
In questo modo il compiler può fare l'inline automatico. Se invece li metti nel .cpp ci sono alcuni compilatori furbi che ci riescono e altri che falliscono miseramente e si riducono a fare function call, che è uno spreco per codice di una sola riga. Nota che la keyword "inline" l'ho scritta ma è del tutto inutile (cioè è utile solo ad altri programmatori, non al compiler), il compiler probabilmente nemmeno se la caga, perchè va tutto in automatico in base al livello di ottimizzazione scelto e i calcoli che si fa internamente.

Z80Fan:

--- Citazione da: TheKaneB - 13 Gennaio 2015, 23:54:40 ---Nota che la keyword "inline" l'ho scritta ma è del tutto inutile
--- Termina citazione ---

Actually, anche se non è pertinente al discorso, la keyword "inline" è obbligatoria nel caso di funzioni o metodi che non sono template: questo perchè altrimenti la funzione o metodo verrebbe compilata tante volte quanti sono i file che la includono, e il linker si lamenterebbe di troppe funzioni con il nome uguale.

Se la funzione/metodo è un template l'errore non c'è perchè i template sono sempre considerati locali alla translation unit dove la specializzazione è generata.

@legacy:
Ho visto un po' il codice (a tratti), e ci sono alcune cose che ti consiglio di rivedere (oltre a quello che ti ha detto TheKaneB):
- dovresti dichiarare tutti gli operatori const, così li puoi sia usare su oggetti const, sia non rischi per sbaglio di scrivere codice negli operatori che modifica gli oggetti stessi.
- I parametri agli operatori potresti dichiararli tutti come "const fixed &", in modo che gli oggetti vengano passati come riferimento; ti eviti la copia degli oggetti ogni volta che chiami un operatore ma devi ora stare attento a usare la funzione equalize_precision, come fai ad esempio in operator+. Per quest'ultimo caso, potresti riscrivere equalize_precision come:

--- Codice: ---fixed fixed::equalize_precision(const fixed &x) const
{
    // se la precisione è inferiore, cambialo
    if (precision < x.precision)
    {
        fixed_numerator value = value * SCALE.x[x.precision - precision];
        unsigned char precision = x.precision;
        return fixed(value, precision);
    }

    // altrimenti ritorna lui stesso intatto
    return *this;
}
--- Termina codice ---

e cambiare operator+ (e tutti gli altri simili) in:

--- Codice: ---fixed operator + (const fixed_t x, const fixed_t y)
{
    fixed a = x.equalize_precision(y);
    fixed b = y.equalize_precision(x);
    a.value = a.value + b.value;
    return a;
}
--- Termina codice ---

o qualcosa del genere insomma. Forse si può schiacciare qualche copia in più, ma almeno è un inizio. :D

- Di solito, nei linguaggi OOP, gli oggetti vengono chiamati con la prima lettera maiuscola (quindi verrebbe Fixed invece di fixed); è una questione di stile quindi puoi fare come vuoi. :D
- non serve che fai "typedef class fixed  fixed_t;" come si farebbe in C perchè (come hai in realtà già visto nel codice), per dichiarare sia struct che class in C++ non è necessario precederle con "struct" (come in C) e "class".
- usare [ ] per settare la precisione è interessante, ma è anche una di quelle cose che sono eccessivamente "zuccherate" e poi ti portano a fare cose strambissime come, chessò, usare "<<" e ">>" per inserire dati in uno stream... :P
- credo che la funzione show() si possa scrivere in molte meno righe... ma dovrei analizzare bene il suo comportamento quindi in caso te lo dico più tardi. :D
- Con quel sistema hai veramente troppi file per qualcosa che potrebbe stare tranquillamente in uno o due... così complichi anche la consultazione, in quanto sia devi aprire tantissimi file per vedere poche righe, sia non puoi usare le funzioni di ricerca degli editor.

Bon queste son le cose che sento "a pelle", però puoi iniziare da qui intanto. :D

PS: e si scrive "overload", non "overlay"! >:(

Navigazione

[0] Indice dei post

[#] Pagina successiva

Vai alla versione completa