Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it L'avatar di ing82
    Registrato dal
    Sep 2014
    Messaggi
    177

    [C++] Interazione tra classi

    Definisco Classe1

    codice:
    class Classe1
    {
      public:
      //costruttore, distruttore, metodi, ecc
      tipo2 getCl1_membro2() const;//restituisce il valore di membro2
      tipo3 getCl1_membro3() const;//restituisce il valore di membro3
      private:
        //tutto quanto serve da dichiarare come private +
       tipo1 cl1_membro1;
       tipo2 cl1_membro2;
       tipo3 cl1_membro3;
    }
    Poi definisco Classe2

    codice:
    class Classe2
    {
      //costruttore, distruttore, metodi, ecc
      //poniamo che uno dei metodi, detto cl2_metodo1, abbia bisogno di cl1_membro3, senza modificarlo, per fare quello per cui viene definito
      void cl2_metodo1(const tipo3 parametro/*che è il valore di cl1_membro3, + eventuali altri parametri*/);
      private:
        //tutto quanto serve da dichiarare come private +
       tipo4 cl2_membro1;
       tipo5 cl2_membro2;
       tipo6 cl2_membro3;
    }
    Poi definisco Classe3

    codice:
    class Classe3
    {
      //costruttore, distruttore, metodi, ecc
      //poniamo che uno dei metodi, detto cl3_metodo1, abbia bisogno di cl1_membro2, senza modificarlo, per fare quello per cui viene definito
      void cl3_metodo1(const tipo2 parametro/*che è il valore di cl1_membro2, + eventuali altri parametri*/);
      private:
        //tutto quanto serve da dichiarare come private +
       tipo7 cl3_membro1;
       tipo8 cl3_membro2;
       tipo9 cl3_membro3;
    }
    Mi vengono in mente le seguenti opzioni:

    • prima opzione

    quando richiamo il metodo in questione, faccio
    codice:
    Classe1 oggetto1;
    Classe2 oggetto2;
    Classe3 oggetto3;
    oggetto2.cl2_metodo1(oggetto1.getCl1_membro3());
    oggetto3.cl3_metodo1(oggetto1.getCl1_membro2());
    • seconda opzione


    Evitando di passare il parametro alla funzione, potrei memorizzare sia in Classe2 che in Classe3 un puntatore (eventualmente smart-pointer?) a Classe1, in modo che all'interno del metodo possa richiamare addirittura il metodo di Classe1 senza dover passare il parametro alla funzione. Diventerebbe una cosa del genere

    codice:
    Classe2
    {
       //quanto definito prima
      void cl2_metodo1(/*eventuali altri parametri*/);//il parametro viene  richiamato all'interno del metodo facendo  puntatoreAClasse1->getCl1_membro3()
      private:
        Classe1* puntatoreAClasse1;
    }
    codice:
    Classe3
    {
       //quanto definito prima
      void cl3_metodo1(/*eventuali altri parametri*/);//il parametro viene richiamato all'interno del metodo facendo puntatoreAClasse1->getCl1_membro2()
      private:
        Classe1* puntatoreAClasse1;
    }
    • terza opzione

    definisco in Classe1 come friend i metodi di Classe2 e Classe3.



    Arrivo alle domande:
    1. Quale delle tre opzioni è ottimale? Oppure nessuna delle tre è ottimale e ciascuna ha un proprio ambito in cui è meglio?
    2. L'istanza di Classe1, potrebbe non essere stata ancora creata (nel programma verranno dichiarati i puntatori a Classe1, Classe2 e Classe3, e istanziati all'occorrenza), mentre le relative istanze di Classe2 e Classe3 potrebbero essere già state create (oppure andare fuori scope prima di Classe2 e Classe3): come gestire questo aspetto?
    3. gli smart-pointer potrebbero dare una mano a gestire questa verifica di esistenza o meno di Classe1 quando vengono richiamati i metodi di Classe2 e Classe3? Ad esempio, dichiaro Classe1 come shared_ptr, mentre il dato membro di Classe2 e Classe3 sarà un weak_ptr, come ipotizzato qui ?

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    1) Come sempre dipende dal contesto. La prima opzione ha il vantaggio di non avere accoppiamento tra le varie classi, il che da un design più pulito, cosa che invece non avviene con le altre due opzioni. Tradotto in soldoni, la prima opzione rende indipendenti le classi, le altre due no; il vantaggio è nel riutilizzo del codice: nella prima opzione hai le classi come entità singole per cui puoi riusarne una senza che le altre due sappiano che esiste, cosa che non è detto avvenga nelle altre opzioni.

    2) Fa un esempio concreto di cosa intendi.

    3) Lascia perdere weak_ptr che si usa solo in casi particolari: dentro una classe si usano solo shared_ptr o unique_ptr, la cui scelta si decide in base al contesto in cui si opera.
    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
    Utente di HTML.it L'avatar di ing82
    Registrato dal
    Sep 2014
    Messaggi
    177
    Quote Originariamente inviata da shodan Visualizza il messaggio
    1) Come sempre dipende dal contesto. La prima opzione ha il vantaggio di non avere accoppiamento tra le varie classi, il che da un design più pulito, cosa che invece non avviene con le altre due opzioni. Tradotto in soldoni, la prima opzione rende indipendenti le classi, le altre due no; il vantaggio è nel riutilizzo del codice: nella prima opzione hai le classi come entità singole per cui puoi riusarne una senza che le altre due sappiano che esiste, cosa che non è detto avvenga nelle altre opzioni.
    Credo che il tipo di domanda da me faccia intuire la mia immensa esperienza , per cui mi risulta difficile capire quali possano essere i contesti...Intanto, optiamo per la soluzione più pulita e più riciclabile, quando poi capirò i diversi contesti, vedremo di adattarci, per ora, avanti in questo modo.
    Sempre riguardo alla mia immensa esperienza , il fatto di essere indipendenti due classi, significa che se sono in due file header diversi, non serve fare #include di uno nell'altro, corretto?

    Quote Originariamente inviata da shodan Visualizza il messaggio
    2) Fa un esempio concreto di cosa intendi.
    Allora, sperando di riuscire ad essere conciso e preciso, ci provo:
    il programma può(vorrei, dato che il tutto è ancora under construction) permettere di eseguire calcoli secondo diverse normative, le quali prevedono parametri/coefficienti diversi da applicare durante i calcoli. Quindi pensavo di creare una classe normativa base, da cui derivare le classi per gestire la normativa specifica (ad esempio, all'interno di ciascuna normativa torna comodo definire delle enum apposite, ecc).

    L'altra classe potrebbe essere quella per gestire l'azione sismica di progetto, che varia in base alla normativa scelta, quindi anche qui, una classe base, da cui derivare quelle specifiche per ciascuna normativa.

    Vorrei avere l'opportunità/potrebbe esserci la necessità, di eseguire il calcolo del medesimo elemento, ma con due differenti normative, prima ne eseguo uno, poi ne eseguo un altro per vedere cosa comporta il cambio di norma (ad esempio, edificio esistente fatto con vecchia norma, verifiche con vecchia norma, verificare che vada bene anche con quella attuale, potrebbe essere un caso).

    In pratica, durante il cambio di norma, non vorrei che rimanesse scollegata l'azione sismica, ma un qualcosa mi verifichi che l'azione sismica (ma in realtà la questione va estesa ai materiali, ai sovraccarichi, al tipo di verifiche, ecc) sia coerente con la norma applicata, e non riesco a capire come gestire questo aspetto.

    Quote Originariamente inviata da shodan Visualizza il messaggio
    3) Lascia perdere weak_ptr che si usa solo in casi particolari: dentro una classe si usano solo shared_ptr o unique_ptr, la cui scelta si decide in base al contesto in cui si opera.
    Ok. Da quanto letto in giro, i weak_ptr danno una mano per evitare i riferimenti circolari e/o nelle strutture ad albero, se ricordo bene, ma direi che non è il mio caso.

  4. #4
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    ...il fatto di essere indipendenti due classi, significa che se sono in due file header diversi, non serve fare #include di uno nell'altro, corretto?
    Più o meno. In teoria due classi sono indipendenti se una non accetta come parametro l'altra oppure non la contiene, il che il 99% delle volte è impossibile. Il senso del discorso è: se è possibile evitare dipendenze, meglio farlo. Se puoi usare l'opzione 1 (che pare contemplata), personamente non cercherei soluzioni alternative solo per risparmiare qualche riga di codice: ritengo che un design pulito paghi di più.

    Allora, sperando di riuscire ad essere conciso e preciso, ci provo: ...
    Quello di cui parlavi qui:
    http://forum.html.it/forum/showthrea...1#post25345405
    giusto?
    Riassumendo: hai un numero indefinito di normative e un numero altrettanto indefinito di azioni sismiche di progetto, corretto?
    Ogni normativa ha una specifica azione sismica di progetto, corretto? In più ti servirebbe poter usare due o più normative con una singola azione sismica di progetto per delle comparazioni.
    Inoltre ogni normativa derivata può differenziarsi per dati e funzioni membro, corretto?
    Fammi sapere che sono curioso.
    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
    Utente di HTML.it L'avatar di ing82
    Registrato dal
    Sep 2014
    Messaggi
    177
    Quote Originariamente inviata da shodan Visualizza il messaggio
    Più o meno. In teoria due classi sono indipendenti se una non accetta come parametro l'altra oppure non la contiene, il che il 99% delle volte è impossibile. Il senso del discorso è: se è possibile evitare dipendenze, meglio farlo. Se puoi usare l'opzione 1 (che pare contemplata), personamente non cercherei soluzioni alternative solo per risparmiare qualche riga di codice: ritengo che un design pulito paghi di più.
    Grazie del consiglio. Tutto il mio tentativo di "raggirare" questa cosa nasceva appunto dal non voler scrivere qualche riga di codice in più...

    Quote Originariamente inviata da shodan Visualizza il messaggio
    Quello di cui parlavi qui:
    http://forum.html.it/forum/showthrea...1#post25345405
    giusto?
    Riassumendo: hai un numero indefinito di normative e un numero altrettanto indefinito di azioni sismiche di progetto, corretto?
    Ogni normativa ha una specifica azione sismica di progetto, corretto? In più ti servirebbe poter usare due o più normative con una singola azione sismica di progetto per delle comparazioni.
    Inoltre ogni normativa derivata può differenziarsi per dati e funzioni membro, corretto?
    Fammi sapere che sono curioso.
    Direi che sono curioso anche io ...probabilmente non riesco a descrivere in modo decente il problema in quanto neanche io so bene quale sia (dal punto di vista della programmazione, si intende). Direi che il nocciolo fondamentale è la norma di riferimento, da cui poi discende il "metodo di calcolo", le caratteristiche dei materiali, i sovraccarichi/azioni da impiegare (valore e modalità di combinazione tra di essi), ecc.

    Credo che superato questo ostacolo, sarà solo "puro divertimento", nel senso che poi potrò concentrarmi sulla creazione del programma: in giro c'è un sacco di materiale (programmi, anche gratis), ma ognuno ha una lacuna, cosa che non potrò dire con quello che farò io, anche perchè, una volta identificata una mancanza, ci si potrà mettere una pezza.
    Oltre che una soddisfazione personale, sarà anche un alleggerirmi il mio lavoro...

    Grazie ancora per l'aiuto

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.