15 Stimmen

Übergabe eines Arrays als konstantes Argument einer Methode in C++

Ich möchte in der Lage sein, ein konstantes Array-Argument an eine Methode in C++ zu übergeben.

Ich weiß, dass wenn Sie ein Array an eine Methode übergeben, es dasselbe ist wie das Übergeben eines Zeigers auf das erste Element des Arrays, sodass eine einfache Möglichkeit ist, den Zeiger zu verwenden.

void myMethod(int * const inTab)

Aber manchmal ist es besser, ein Array zu haben, Sie können beispielsweise die Größe des Arrays angeben.

27voto

BoBTFish Punkte 18837

Du kannst eine Vorlage verwenden, die die Arraygröße annimmt: http://ideone.com/0Qhra

template 
void myMethod ( const int (& intArray) [N] )
{
    std::cout << "Array von " << N << " Ganzzahlen\n";
    return;
}

ÄNDERUNG: Ein möglicher Weg, um Code-Blähung zu vermeiden, wäre eine Funktion zu haben, die einen Zeiger und eine Größe annimmt und die eigentliche Arbeit erledigt:

void myMethodImpl ( const int * intArray, size_t n );

und eine triviale Vorlage, die sie aufruft, die leicht inliniert werden kann.

template 
void myMethod ( const int (& intArray) [N] )
    { myMethodImpl ( intArray, N ); }

Natürlich müsstest du einen Weg finden, um sicherzustellen, dass dies immer weg optimiert wird, aber du bekommst die Sicherheit und Benutzerfreundlichkeit. Selbst in den Fällen, in denen dies nicht der Fall ist, erhältst du die Vorteile zu relativ geringen Kosten.

8voto

ecatmur Punkte 145884

Zu 3.9.3:2

Alle cv-Qualifier, die auf einen Arraytyp angewendet werden, wirken sich auf den Arrayelementtyp und nicht auf den Arraytyp selbst aus (8.3.4).

und 8.3.4:1

Jeder Typ in der Form "cv-Qualifier-Sequenz Array von N T" wird zu "Array von N cv-Qualifier-Sequenz T" angepasst, und ähnlich für "Array mit unbekannter Größe von T".

Außerdem, gemäß 8.3.5:5

Nachdem der Typ jedes Parameters bestimmt wurde, wird jeder Parameter vom Typ "Array von T" oder "Funktion, die T zurückgibt" angepasst, um "Zeiger auf T" bzw. "Zeiger auf Funktion, die T zurückgibt" zu sein.

Das bedeutet, dass innerhalb einer Funktion, die einen Arrayparameter akzeptiert, der Parametertyp tatsächlich ein Zeiger ist, und aufgrund von 3.9.3:2 ist der Zeiger nicht cv-qualifiziert:

void foo(const int parameter[10]) {
    parameter = nullptr;   // das kompiliert!
}

Dies betrifft nicht den Typ der Funktion selbst, aufgrund einer anderen Klausel in 8.3.5:5

Nachdem die Liste der Parametertypen erstellt wurde, werden alle obersten cv-Qualifier, die einen Parametertyp modifizieren, beim Bilden des Funktionstyps gelöscht.

Deshalb, wenn Sie ein Array mit cv-Qualifiern übergeben möchten, muss es per Referenz erfolgen:

void foo(const int (¶meter)[10]);

5voto

Torsten Robitzki Punkte 3019

Wenn Sie die Größe des Arrays benötigen:

template 
void meineMethode(const int (&inTab)[Größe]);

5voto

Desmond Hume Punkte 7356

Ich bin mir nicht sicher, ob das ist, was du gefragt hast, aber vielleicht ist es, was du gesucht hast

void func (const int array[10])
{
    //array[0] = 12345; // das würde nicht kompilieren, also funktioniert 'const'
}

int main ()
{
    int array[10];
    func(array);
}

-1voto

Sadeesh Kalhara Punkte 73

Versuche std::vector

void myMethod(const std::vector &inTab);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X