2016-06-08 12 views
1

Der folgende Code kann mit zwei Fehlern in der Zeile 'func (& pobj);' "Kann nicht konvertieren X * *" zu 'const X * *' in Funktion main() "und" Typenkonflikt in Parameter 1 (wollte 'const X * *', bekam 'X * *') in der Funktion main() "Obwohl es die richtige Art ist, Zeigerparameter zu übergeben. Und auch über das Kommentieren dieser bestimmten Zeile, d. H. 'Func (& pobj);' und Auskommentierung der beiden darüber liegenden Zeilen, die einen neuen 'const' Zeiger 'pp' des erforderlichen Typs (im Parameter von func) deklarieren, aber immer noch einen Fehler in der Zeile, die 'pp' deklariert und zuweist, mit der Aussage 'Kann nicht konvertieren' X * * 'zu' const X * * 'in der Funktion main() ".Übergabe von 'const' Zeiger, der auf einen anderen Zeiger in C++ zeigt

using X = int; 

void func(const X **); 

int main() { 
    X *pobj = new X(58); 

    // const X **pp = &pobj; // ERROR 
    // func(pp); 

    func(&pobj); // ERROR 
} 

Ich glaube, dass dies der richtige Weg ist, konstanten Zeiger als Parameter zu übergeben, und ich verstehe einfach nicht, warum das Programm zu kompilieren, schlägt fehl. Kann jemand den Fehler im obigen Code aufzeigen und mir die richtige Logik/Syntax vorschlagen, wenn ich falsch liege? Danke im Voraus.

UPDATE: Diese Frage wurde als doppelt markiert, aber es hat nicht die Antwort, die das Problem zur Hand löst. Daher würde ich es lieben, wenn die Stack Overflow Community mir helfen würde, mein Problem hier zu lösen. Vielen Dank. diese

Antwort

2

Sie:

const X * pobj = new X(58); 
// ^^^^^^ 

func(&pobj); 

Jetzt pobj ist ein Zeiger auf const X, und seine Adresse vom Typ const X ** nach Bedarf.

Wenn Sie das Original (änderbare) Zeiger beibehalten möchten, müssen Sie zunächst einen neuen const Zeiger machen:

X * p = new X(58); 
const X * q = p; 

func(&q); 
+0

, dass das Problem für den Modulaufruf löst aber das hat uns zu ändern, ist es nicht möglich der Wert, auf den der Zeiger 'pobj' zeigt, der für mein Programm wesentlich ist (dies ist nur ein kleiner Teil davon, der den Fehler hat). Haben Sie eine Idee, dieses Problem zu lösen? Danke für die Antwort. – hecate

+0

@hecate: Klingt so, als ob du deine Modul-API nicht korrekt definiert hast. Wenn Sie eine Sache ändern wollen, müssen Sie einen Zeiger auf eine modifizierbare Sache nehmen. Vielleicht überprüfe die andere Antwort. –

+0

Beachten Sie, dass die zweite Lösung, die Sie im ursprünglichen Zeiger beibehalten haben, nicht funktioniert .. :-( – hecate

2

Sie müssen const anzuwenden, um Zeiger auf Zeiger:

void func(X *const *); 

... 
    X * const *pp=&pobj; // ERROR  
    func(&pobj); // ERROR 
... 

void func(X * const * obj) { // module code goes here 
} 
+0

Heyy danke Mann, der das Problem wirklich löst, aber würde es dir etwas ausmachen, mir die Theorie/Bedeutung/Logik zu erklären, const zwischen die beiden Sternchen (*) zu setzen, da es nicht der übliche Weg ist? Erzähl mir auch, warum das Programm fehlgeschlagen ist, wenn die Funktion nur mit 'func (&pobj);') aufgerufen wird, ohne den Zeiger 'pp' zu deklarieren? Danke nochmal Kumpel :-) – hecate

+0

Kurz gesagt: 'const X *' ist eigentlich 'X const *' - Setzen Sie den Zeigertyp auf "const" (und nicht auf "X"). 'const X **' ist 'X const * *' und nicht 'X * const *'.'X * const *' kann auf 'const X *' zeigen, und Sie können 'X * obj' zu' X const * obj' machen, um dies zu ermöglichen. Sehen Sie den "doppelten" Link, um mehr darüber zu erfahren – Ajay

0

wenn die Antwort von Ajay nicht geeignet ist, weil Sie nicht die Schnittstelle von func() ändern können,

und wenn die Antwort von Kerrek nicht funktioniert, weil func() Änderungen der Zeiger, der wieder zugewiesen werden muss, dass nicht passiert:

X * p = new X(58); 
const X * q = p; 
func(&q); 
p = q; // errror 

dann verwenden Sie einfach eine Besetzung:

func(const_cast<const X**>(&p))