2015-10-21 3 views
5

Ich möchte ein Objekt einer anderen Klasse einen Zeiger durch den Konstruktor einer Klasse speichern. Was ist der richtige Weg?ungültige Konvertierung von ‚const Typ *‘ auf ‚Typ *‘

Wenn ich MyClass1* ptr mit const MyClass1* ptr ersetze gibt es keinen Fehler, aber in diesem Fall denke ich, dass ich ptr nicht mehr ändern kann. Was ist der richtige Weg, um das zu erreichen, was ich will?

example.cpp

class MyClass1{ 
    public: 
     int a; 
     int b; 
}; 

class MyClass2{ 
    MyClass1* ptr; 
    public: 
     MyClass2(const MyClass1& obj){ptr = &obj;}; 
}; 

int main(int argc, char* argv[]){ 
    MyClass1 object1; 
    object1.a = object1.b = 0; 
    MyClass2 object2(object1); 

    return 0; 
} 

Kompilieren es durch g++ -o example example.cpp geben Sie mir diesen Fehler

example.cpp: In constructor ‘MyClass2::MyClass2(const MyClass1&)’:

example.cpp:10:37: error: invalid conversion from ‘const MyClass1*’ to ‘MyClass1*’ [-fpermissive]

MyClass2(const MyClass1& obj){ptr = &obj;};

+3

Mögliche Duplikat [Was ist der Unterschied zwischen const int \ *, const int \ * const und int const \ *?] (Http://stackoverflow.com/questions/1143262/what-is-the-difference -between-const-int-const-int-const-und-int-const) –

+0

Warum entfernen Sie nicht den "const" Modifikator Ihres 'obj' Arguments? Sie könnten auch direkt den Zeiger anstelle der Referenz übergeben. – aslg

+0

@aslg: weil ich nicht möchte, dass der Konstruktor das Objekt ändern kann. (Ich weiß, dass es nichts gibt, was das Objekt tatsächlich verändert) – giusva

Antwort

2

Wenn Sie die Sache, dass ptr Punkte, dann Ihre Funktion muss, um seine Argumentation ändern möchten, indem Sie nicht const Referenz (seit MyClass2 könnte es ändern):

MyClass2(MyClass1& obj) { ptr = &obj; } 

Oder, wenn Sie die Sache, dass ptr Punkte, zu modifizieren, nicht beabsichtigen, dann sollten ptr als ein Zeiger-to deklariert werden const:

const MyClass1* ptr; 

Beide Lösungen werden den Code führen zu kompilieren .

+0

'const MyClass1 &' ist unsicher, da in – CoffeeandCode

+1

ein temporäres übergeben werden könnte. Es ist auch unsicher, da ein nicht temporäres Objekt mit einer Lebensdauer kürzer als das des Objekts 'Class2' übergeben werden kann. Im Allgemeinen Speichern von nicht besitzenden Referenzen/pointers long-time bittet wegen dieser lebenslangen Probleme um Ärger. – emlai

+0

@zenith: In meinem Algorithmus hat das Objekt von 'Class1' eine Lebenszeit, die länger ist als diejenige des Objekts von' Class2', die einen Zeiger auf den ersten hat. Dies trifft jedoch offensichtlich nicht zu. Wie kann ich dieses Ereignis berücksichtigen? – giusva

0

Zuerst entfernen Sie das Extra;

MyClass2(const MyClass1& obj){ptr = &obj;} 

kann nicht const Argument innerhalb Funktion übergeben (könnte es später ändern), so kann diese Arbeit:

MyClass2(MyClass1 & obj){ 
    ptr = &obj; 
} 

aber hier der Wert von & obj entkommt dem lokalen Bereich.

2

Antwort basierend auf den letzten Kommentaren.

ich Ihnen ein Beispiel für konst geben würde Zeiger mit ints angewandt,

int a = 2; 
int b = 3; 

int*    p1 = &a; // Modifiable pointer modifiable value 
const int*  p2 = &a; // Modifiable pointer const value 
int* const  p3 = &a; // Const pointer  modifiable value 
const int * const p4 = &a; // Const pointer  const value 

*p1 = 3; // Ok, modifiable left-value 
*p2 = 4; // Error: non-modifiable left-value 
*p3 = 5; // Ok 
*p4 = 6; // Error 

p1 = &b; // Ok: modifiable pointer 
p2 = &b; // Ok 
p3 = &b; // Error 
p4 = &b; // Error 

In Ihrem Fall sind Sie für einen modifizierbaren Zeiger aus, aber ein konstanten Wert. Sie wollen also den zweiten Fall,

const MyClass1* ptr; 

(Was ist das, was Sie ursprünglich hatte)

Es würden Sie scheinen nicht versuchen, tatsächlich um den Zeiger zu ändern?

2

ich aus dem Kommentar bekannt, dass Sie den Inhalt des Zeigers ändern mögen, nicht die Objektzeiger zeigen auf, so wenden Sie sich bitte die ptr Zeiger als const MyClass1* ptr erklären. Dies bedeutet, dass ptr ein Zeiger ist, der sich auf eine const MyClass1 bezieht. Sie können also den Zeiger ändern, aber Sie können das vom Zeiger referenzierte Objekt nicht ändern.