2015-10-21 22 views
5

クラスのコンストラクターを介して、別のクラスのオブジェクトへのポインターを格納します。それを行う正しい方法は何ですか?'const type *'から 'type *'への無効な変換

const MyClass1* ptrと置き換えてもエラーはありませんが、この場合は私はもうptrを変更できないと思います。私が欲しいものを達成する正しい方法は何ですか?

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; 
} 

あなたはptrポイントはにその事を変更したい場合は、あなたの関数がで引数を取る必要がある私は、このエラー

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

[const int \ *、const int \ * const、およびint const \ *の違いは何ですか?](http://stackoverflow.com/questions/1143262/what-is-the-difference const-int-const-int-const-and-int-const) –

+0

'obj'引数の' const'修飾子を削除してみませんか?また、参照の代わりにポインタを直接渡すこともできます。 – aslg

+0

@aslg:コンストラクタがオブジェクトを変更できることを望まないので。 (私はそのオブジェクトを実際に変更するものは何もないことを知っています) – giusva

答えて

2

を与えるg++ -o example example.cppを通してそれをコンパイルします非const参照(MyClass2はそれを変更することがあります):

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

それとも、あなたはptrポイントは、その後、ptrのように宣言する必要があるために事を変更する予定がない場合は、ポインタ・ツー・const

const MyClass1* ptr; 

は、これらのソリューションの両方をコンパイルしたコードが発生します。

+0

'const MyClass1&'はテンポラリを渡すことができないので安全ではない – CoffeeandCode

+1

'Class2'オブジェクトより寿命の短い一時的でないオブジェクトが渡されるかもしれないので安全でもありません。/pointersはこれらの生涯の問題のために長い間トラブルを求めています。 – emlai

+0

@zenith:私のアルゴリズムでは、Class1のオブジェクトの寿命は、Class2のオブジェクトのうち最初のものへのポインタを持つものより長くなります。しかし、これは明らかに一般的ではない。この発生をどのように考慮に入れることができますか? – giusva

0

最初に余分な部分を削除します。

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

は、(後でそれを修正するかもしれません)関数内のconst引数を渡すことはできませんので、これは動作することがあります。

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

が、ここで&をobjの値がローカルスコープをエスケープします。

2

最後のいくつかのコメントに基づく回答。

私はあなたのconstの例をあげるには、int型とポインタにあなたのケースで

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 

を適用し、あなたは、変更ポインタが、constの値を探しています。ですから、

(あなたがもともと持っていたものです)

const MyClass1* ptr; 

、第二ケースをしたいあなたが実際にポインタを変更しようとしていないように見えるでしょうか?

2

オブジェクトポインタが指していないポインタの内容を変更したいというコメントからわかったので、ptrポインタをconst MyClass1* ptrと宣言してください。これは、ptrconst MyClass1を指すポインタであることを意味します。したがって、ポインタを変更することはできますが、ポインタによって参照されるオブジェクトを変更することはできません。

関連する問題