0

C++ の変数に constness を追加しようとしていますが、VC は でのコンパイルを拒否していますError C2664 : cannot convert MyClass * to const MyClass &。私はすべてを試し、検索を行い、同様の質問 ( 12 ) を読みましたが、まだ解決できません。

私の機能は次のように定義されています:

void ClassFoo::FuncFoo(MyClass* instance){
     Merge(instance);     // <--- Error C2664 -- cannot convert MyClass* to const MyClass &
     Merge(&instance);     // <--- Error C2664 -- cannot convert MyClass** to const MyClass &
     Merge(*instance);     // <--- This compiles fine, but doesn't work properly at runtime
     Merge(const_cast<const GFxTextFormat&>(instance));     // <--- Error C2440
}

MyClass Merge (const MyClass &instance){
}

constness を変数に適切に追加して、適切に呼び出せるようにするにはどうすればよいinstanceですMergeか?

4

3 に答える 3

3

constここでは問題ありません。自動的に追加されます。問題はポインタと参照です。

あなたが私たちに示したコードに関する限り、以下は正しいです:

 Merge(*instance);

これが実行時に機能しない場合、問題は表示されていないコードにあります。

于 2013-03-23T19:11:13.167 に答える
1

NPEが言ったように、この方法Merge(*instance);は正しいですが、c++で「スライス」として知られている問題が発生する可能性があります。ググって、実験的な方法で検出してみてください。

主な問題は次のとおりです。

struct A
{ 
  A ( const int value ) : myValue1( value ) {};

private:
  double myValue1;
};

struct B : public A 
{ 
  B ( const int first, const int second ) : A( first ), myValue2( second ) {};

private:
  double myValue2;
};

main()
{
 B child( 1, 2 );  // The "child" object contains two values.
 A parent = child; // Here the "slicing" error, but the compiler will not say anything.
                   // So, the object "parent" now is the new object of type "A" and it memory only one value. 
                   // By the way, it can not be downcasted to object of type "B".
}
于 2013-03-23T19:27:18.613 に答える
1

メソッドの署名を作成できますか

void ClassFoo::FuncFoo(MyClass* const instance)

それが唯一の方法のようです。オリジナルでは、instance は非 const MyClass へのポインターです。を使用できますがconst_cast、それは正しいでしょうか?

于 2013-03-23T19:12:42.517 に答える