Ereditarietà con array

di il
11 risposte

Ereditarietà con array

Salve,
Non capisco come assegnare dei valori ad un array ereditato usando le "classiche" parentesi graffe.
Il codice penso che sia più' esplicativo;

class Basic {
  public:
    uint8_t var[];
    //altre variabili...
};

class MyClassOnce : public Basic {
  public:
    void init()
    {
      var[10] = {
        (byte)0xcf,(byte)0x90,(byte)0x20,(byte)0x69,(byte)0xa4,
        (byte)0x3e,(byte)0x9f,(byte)0x21,(byte)0x72,(byte)0x83
      };
      //altre inizializzazioni
    }
};
La classe Basic in realtà è solo una classe che contiene variabili che poi MyClassOnce eredita (in realtà ho nel codice altre classi che ereditano da classe Basic). Ho fatto così perché mi serve avere classi diverse che usano lo stesso set di variabili (ma con diverse inizializzazioni).
Il codice da errore quando inserisco i valori dentro "var".
Sapete dirmi come posso risolvere l'errore o suggerirmi un metodo migliore per creare un contenitore di variabili via via settate da classi diverse?
Grazie

11 Risposte

  • Re: Ereditarietà con array

    Nessuno mi sa aiutare o suggerire come procedere?
  • Re: Ereditarietà con array

    Il codice da errore quando inserisco i valori dentro "var".
    Innanzitutto prima devi allocare var, oppure semplicemente lo definisci in class Basic con una dimensione opportuna, es.: uint8_t var[100];
    Poi, scrivendo var[10]=... tenti di scrivere all'elemento in posizione 10, NON di scrivere 10 elementi: per fare questo devi fare un ciclo; ti consiglio di fare un pò di ricerche con google su come inizializzare un array in C.
  • Re: Ereditarietà con array

    Non puoi scrivere in quel modo. Se non sbaglio è consentito solo con il C++11
  • Re: Ereditarietà con array

    candaluar ha scritto:


    Il codice da errore quando inserisco i valori dentro "var".
    Innanzitutto prima devi allocare var, oppure semplicemente lo definisci in class Basic con una dimensione opportuna, es.: uint8_t var[100];
    Poi, scrivendo var[10]=... tenti di scrivere all'elemento in posizione 10, NON di scrivere 10 elementi: per fare questo devi fare un ciclo; ti consiglio di fare un pò di ricerche con google su come inizializzare un array in C.
    Umh, non posso definire in Basic "uint8_t var[100];" perchè in realtà la dimensione cambia nelle varie classi figlie!
    E no var[10] era tipo un modo di assegnare a var, 10 elementi... (modo ovviamente sbagliato, altrimenti non mi sarei rivolto al forum).

    Il mio "problema" è più un problema di code-style, credo.
    Io ho 3 classi :
    MyClassOnce, MyClassTwo, MyClassThree
    Tutte le classi hanno lo stesso tipo di variabili ma per gli array la dimensione cambia e quindi il contenuto. Per assegnare il contenuto voglio usare il metodo {valore1, valore2, valore3...} (ho i dati in questo modo!).

    Per evitare di definire tutte e tre le classi con le stesse variabili e quindi stesso nome, etc... Avevo pensato a una classe madre che contiene le variabili e le figli ereditano.
    Ma come ho postato sopra nel codice ho problemi con gli array... non riesco proprio ad assegnargli i dati usando la notazione {valore1, valore2, valore3...} .

    Altri suggerimenti?
  • Re: Ereditarietà con array

    No, la dimensione non può cambiare altrimenti devi usare un semplice puntatore e allocare/riallocare l'array.
  • Re: Ereditarietà con array

    Se gli array contengono dati costanti potresti definire nella classe base un puntatore e una variabile che contiene la dimensione (di default 0); in ciascuna della classi derivate definisci degli array costanti e poi nel costruttore inizializzi la dimensione (nella classe base) e fai puntare il puntatore all'array.
    I metodi della classe base accederanno ai dati tramite il puntatore, facendo affidamento alla dimensione specificata.
  • Re: Ereditarietà con array

    candaluar ha scritto:


    Se gli array contengono dati costanti potresti definire nella classe base un puntatore e una variabile che contiene la dimensione (di default 0); in ciascuna della classi derivate definisci degli array costanti e poi nel costruttore inizializzi la dimensione (nella classe base) e fai puntare il puntatore all'array.
    I metodi della classe base accederanno ai dati tramite il puntatore, facendo affidamento alla dimensione specificata.
    Avresti la possibilità di scrivermi un piccolo esempio semplicissimo per capire meglio cosa intendi?
  • Re: Ereditarietà con array

    Ma i dati che devi utilizzare sono costanti o no?

    E nella classe Basic quel vettore lo utilizzerai o solamente nelle derivate?
  • Re: Ereditarietà con array

    I dati sono costanti, si! Come nell'esempio che ho postato.... quelli sono i dati di una delle Classi figlie! Tra le classi figlie cambiano dimensione dei dati (cioè numero di elementi nell'arra) ovviamente!

    Il vettore lo uso nelle derivate (al momento)... forse nella classe Base metterò qualche altra funzione che fa delle print o delle conversioni...
  • Re: Ereditarietà con array

    Nella classe base definisci
    int *p; // o const int *p;
    int size;
    che nel costruttore della classe base inizializzi così
    p = NULL
    size = 0;
    i metodi della classe base possono accedere agli array per tramite del puntatore p, che deve essere != NULL, e la sua dimensione size, che deve essere > 0.

    Le classi derivate devono, tramite costruttore o tramite metodi appositi, far puntare p della classe base ad un array valido e settare correttamente la dimensione size.
  • Re: Ereditarietà con array

    Ho risolto proprio come mi avete suggerito. Grazie!
Devi accedere o registrarti per scrivere nel forum
11 risposte