Un sacco di strutture di dati indipendenti in una grande

1

Ho 10 strutture di dati indipendenti che contengono byte senza segno e campi di bit da diverse origini dati. Sto usando C ++ e stavo cercando un modo per combinare tutte queste strutture di dati in una struttura di dati allo scopo di far passare tutti i dati tra metodi diversi.

Ad esempio, ho un oggetto che utilizza i dati di tutte e 10 le strutture di dati, ma ho riferimenti simili a:

method(datastructure1 &d1, datastructure &d2, datastructure &d3, datastructure &d4, ...)

Voglio evitare questo, perché è sempre più difficile tener traccia e manutenzione. Preferirei avere:

method(superStructure &allData);

Non riesco a pensare a come combinare tutti i dati in modo da poter accedere in modo univoco ai dati di ogni singola struttura.

    
posta zacharoni16 10.09.2015 - 16:44
fonte

2 risposte

1

Puoi fare quanto segue:

  1. Crea una super classe delle 10 strutture dati. La super classe non ha bisogno di contenere alcuna funzionalità, ma dovrà contenere il nome di ognuna delle funzioni delle 10 strutture dati che si desidera utilizzare in seguito.
  2. Implementa le 10 strutture dati come sottoclassi della super classe precedentemente creata.
  3. Conta quanti elementi di dati vuoi inviare al metodo menzionato nella tua domanda e crea un array con quella dimensione utilizzando il tipo di dati super classe e passa l'array di dati al metodo.
  4. Scorrere l'array per eseguire le operazioni.

Se i nomi di funzione per le 10 strutture dati sono diversi, puoi creare una variabile nella super-classe chiamata current_data_type per verificare quale oggetto viene elaborato in un'istruzione condizionale nel passaggio 4 dalla matrice di oggetti passati.

Questo è un esempio di come sarebbe strutturato il codice:

    class SuperClass {
      public:

        static int current_data_type;

        // add all data type specific functions
        void set_values_d1 (int,double);
        void set_values_d2 (int,float);
        // ... add as many as necessary
        double get_values_d1 (void);
        float get_values_d2 (void);
        // ... add as many as necessary
    };

    class DataType1: public SuperClass {
      public:
        void set_values_d1 (int,double) { /* do something */ }
        double get_values_d1 (void) { /* do something */ }
        // ... add all the other functions
    };
    int DataType1::current_data_type = 1;

    class DataType2: public SuperClass {
      public:
        void set_values_d2 (int,float) { /* do something */ }
        float get_values_d2 (void) { /* do something */ }
        // ... add all the other functions
    };
    int DataType2::current_data_type = 2;

    int arrayItems = 100;
    SuperClass myDataArray [arrayItems] = {dataItem1, dataItem2, ... , dataItem100};

    method(SuperClass &myDataArray, int arrayItems) {
      for (int i = 0; i < arrayItems; i++) {
        switch(myDataArray.current_data_type){
          case 1 :
            // do all computations for DataType1
            break;

          case 2 :
            // do all computations for DataType2
            break;

          // create as many case statements as there are data types.
        }
      }
    }
    
risposta data 11.09.2015 - 00:43
fonte
5

Bene, questo è esattamente lo scopo di una struttura, quindi perché non usarne uno? Una struct, in sostanza, è solo un raggruppamento di altri tipi di dati, e quindi non ha bisogno di memoria per se stessa. È solo una questione di convenienza.

    
risposta data 10.09.2015 - 17:14
fonte

Leggi altre domande sui tag