2011-01-07 11 views
0

Ich frage mich, ob es eine Möglichkeit gibt, ein Datenelement einzuschließen, das ein Array nicht fixierter Größe ist.C++ Variables Array in einer Klasse Problem

Die Funktion initModulation erstellt ein int Array der Größe M und ein Complex Array der Größe M. (Complex ist eine weitere Klasse und besteht aus einer reellen Komponente und einer imaginären Komponente).

Der Funktionsmodul muss auf diese beiden Arrays zugreifen können. Diese beiden Arrays gehen nach dem Aufruf der init-Modulationsfunktion nicht mehr in den Geltungsbereich. Um dies zu vermeiden, würde ich nur diese beiden Datenelemente des Modulators Klasse machen, aber ich kann das nicht tun, weil die Feldgröße auf M.

class Modulator 
{ 
    int M; 
    double phase; 
    std::string mapping; 

public: 
    void initModulation(int M, double phase, std::string mapping); 
    double* modulate(int *input,int inputlength,int complexFlag); 
}; 

Irgendwelche Ideen rund um das hängt?

Danke, Minh

+0

std :: Komplex kommt in den Sinn. Zwingen Sie sich nicht, das Rad neu zu erfinden. – IAE

Antwort

1
  1. nicht Initialisierungsfunktionen ohne ganz besondere Umstände schreiben;.. Konstrukt mit dem Konstruktor

  2. Die Arrays sind ein logischer Teil der Klassendaten, da sie für die Modulation verwendet werden, und das ist es, was Instanzen der Klasse tun.So sollten Sie sie als Mitglieder haben ..

  3. Sie planten, Arrays unbekannter Kompilierzeit zu erstellen, nicht wahr? Wie kommt es darauf an, ob Sie sie als Mitglieder der Klasse speichern oder nicht? So oder so, Sie haben die Information über M an diesem Punkt, und verwenden Sie es entsprechend.

  4. Aber Sie sollten sowieso nicht Ihre eigenen Arrays zuweisen. Verwenden Sie std::vector. Schließlich sind Sie klug genug, std::string für Textdaten zu verwenden, also ...

  5. Warum würden Sie einen int für einen Parameter verwenden, der angeblich eine Art "Flagge" ist? C++ hat einen echten booleschen Typ namens bool. Benutze es.

  6. Verwenden Sie für die Ein- und Ausgabe der Modulation wiederum Vektoren.

  7. Eine Klasse mit einer Elementfunktion, deren Name mit dem Klassennamen übereinstimmt, ist verdächtig. Viele Sprachen unterstützen die Idee eines "aufrufbaren" Objekts und C++ gehört dazu. In C++ buchstabieren wir diese Funktionalität "operator()".

So:

class Modulator 
{ 
    std::vector<int> int_data; 
    std::vector<Complex> complex_data; 
    double phase; 
    std::string mapping; 

    public: 
    Modulator(int M, double phase, std::string mapping): 
    int_data(M), complex_data(M), phase(phase), mapping(mapping) {} 

    std::vector<double> operator()(const std::vector<int>& input, bool is_complex); 
}; 

Willkommen bei modernen C++. :)

1

können Sie die std::vector-Klasse verwenden, die wie ein Array ist, sondern eine variable Größe und erfordert keine explizite Speicherverwaltung. Wenn Sie einen als Datenmember deklarieren, können Sie initModulation mit so vielen Elementen füllen, wie Sie möchten, aber dann haben Sie die Daten in modulate.

Ein Vorschlag - es könnte eine gute Idee sein, initModulation zu einem Klassenkonstruktor zu ändern. Auf diese Weise wird es automatisch aufgerufen, und es besteht kein Risiko, modulate aufzurufen, ohne das Objekt zuerst zu initialisieren.

1

I was wondering if there was a way to include a data member which is an array of unfixed size.

STL ist wahrscheinlich das, was Sie suchen (std::vector ...