2013-05-14 3 views
5

Ich bin hier auf der Suche nach C++ - Code und verstehe etwas nicht. Es ist irrelevant, aber es kommt von einem YARP (Roboter Middleware) Tutorial, das mit der Dokumentation einhergeht.Subskribiert einen Verweis auf const

Jetzt ist Header eine Referenz auf const und kann daher nicht innerhalb dieser Funktion geändert werden. get heißt es, sein Prototyp ist char *get() const;. Wie kann header.get() subskribiert und modifiziert werden? Das Programm kompiliert gut. Ich habe nicht verstanden, was hier passiert, aber ich bin stützen mich auf das, was ich in C++ Primer gelesen habe ...

Ich würde es sehr wenig Klärung schätzen!

Haben Sie einen schönen Tag,

+0

'char * get() const;' bedeutet, dass Zeiger auf Zeichen nicht geändert werden können. pointee kann sein. – octoback

+1

Sie denken an "char * const get()". Das "const" auf der rechten Seite der Funktion bedeutet "ändert nicht veränderbare Mitglieder nicht" – kfsone

Antwort

0

Wer die Schnittstelle entschieden ausgelegt, dass der Inhalt eines const Byte Aufgabe kann durch Füllung Werte in sie modifiziert werden. Vermutlich haben sie alle Hacks gemacht, die sie brauchten, um header.get()[i] modifizierbar zu machen. Ich würde diesen Code nicht als Beispiel für gutes Interface-Design verwenden.

+0

Okay, ich fand heraus, dass es eindeutig nicht optimale Codierung war. Ich habe etwas tiefer gegraben und es stellt sich heraus, dass 'get()' nur ein Attribut namens 'data' zurückgibt, das' char * 'ist. Die 'get()' Funktion war in der Tat const, aber es gab etwas zurück, was nicht war. – technimage

0

header.get() Wenn Rückkehr char*, als Basisadresse annimmt und indexiert mit [i] und String in target an dieser Stelle verkraftet.

@antitrust gegeben guten Punkt, Absenderadresse kann nicht durch Adressinhalt geändert werden kann z.

char x[100]; 
char* get() const 
{ 
    return x; 
} 

int Aufruffunktion können Sie tun:

get()[i] = target[i]; 

es target String x kopiert, kann dieses Verfahren nützlich sein, wenn x ist Privat Mitglied zur Klasse, und Sie sind zu kopieren in x.

Editieren Wenn get() a inline function dann ruft get() -Funktion in einer Schleife nicht die Leistung., Ich meine solche Funktion sollte inline definiert werden.

+0

Aber warum verbietet 'const Bytes & header' nicht das Schreiben in interne Datenelemente von' header'? – Vorac

+0

@Vorac 'const Bytes &' bedeutet Verweis auf const, Sie können const nicht ändern. siehe hier für [Referenz vs Zeiger] (http://stackoverflow.com/questions/15995463/in-function-declaration-return-type/15995482#15995482) als Rückgabetyp –

+0

Es ist nicht inline definiert. Ich fange an all das zu bekommen, danke an euch alle! – technimage

0

am doc Blick:

struct Bytes { 
    char* get() const; // works 
    char*& get() const; // would not work 
    char* mem_; 
}; 

Dieser Code ist vollkommen gültig, auch wenn es schlechte Praxis. Das -Problem besteht darin, dass eine Kopie des Zeigers erstellt wird und die Konstanz der -Klasse lost ist. constness in C++ ist weitgehend konzeptuell und leicht zu (oft sogar ohne Folgen) zu brechen. Ich würde mich beschweren, um den Implementierer. Es soll wie folgt aussehen:

struct Bytes { 
    char* get(); // works 
    const char* get() const; // would not work 
    char* mem_; 
}; 
1
char *get() const; 

Die rechte Hand const bedeutet „dieses Element ändert nichts in der Klasse, die nicht wandelbar ist“, und es ehrt, dass - es ist nichts zu ändern. Die Implementierung ist wahrscheinlich etwa so:

Der Zeiger, der zurückgegeben wird, ist jedoch ein einfaches "char *".Stellen Sie sich folgendes vor:

(header.get())[i] = target[i]; 
// or 
char* p = header.get(); 
p[i] = target[i]; 
+0

Genau, es gibt ein char * nicht ein const Char *. –