5

このエラーが表示されます「「Cell」型への非定数左辺値は、次のコードでは「Cell *」型の一時にバインドできません:

class RegionHolder
{    
public:
    RegionHolder(Region& Region1):m_RegionCellNOO(&(Region1.m_NOO))
    ~RegionHolder();

protected:
    Cell & m_RegionCellNOO; // difference is here   
};

しかし、これではありません:

class RegionHolder
{    
public:
    RegionHolder(Region& Region1):m_RegionCellNOO(&(Region1.m_NOO))
    ~RegionHolder();

protected:
    Cell * m_RegionCellNOO; // difference is here   
};

私は問題を理解していないので、ポインタではなく参照を使用したいと思っています。

ありがとう

4

2 に答える 2

8

定義を示すのを忘れましたが、おそらくRegion1.m_NOOは type のオブジェクトですCell。最初の例は、そのアドレスを取得し、結果のポインターを使用して参照を初期化しようとしています。参照はポインターからではなく、オブジェクト自体から初期化されます。

RegionHolder(Region& Region1):m_RegionCellNOO(Region1.m_NOO) {}
//                                            ^ no &         ^^ don't forget that

ポインターではなく参照を使用する場合の注意点が 1 つあります。これらは割り当て可能ではないため、クラスも同様です。多くの場合、それは問題ではありません。ただし、クラスを割り当て可能にする必要がある場合は、代わりにポインターを使用する必要があります。

于 2013-02-07T15:37:46.643 に答える
2

単項&演算子は、変数へのポインターを取得します。したがって、C++ では (C と同様に)a = &bへのポインターを取得し、この値をbに格納します。一方、参照への代入は暗黙的であるため、 a が型の場合、への参照を作成するために単に記述する必要があります。したがって、あなたの場合、コンストラクターを次のように書き直す必要がありますabintaint*int&a=bab

RegionHolder(Region& Region1):m_RegionCellNOO(Region1.m_NOO) {}

ただし、とにかくここで参照するよりもポインターを使用する方が良いと思います。ポインターに慣れずに C++ を使用しようとするのは非常に悪い考えです。そのため、ポインターを回避しようとするのではなく、時間をかけてポインターを快適に使用できるようにすることをお勧めします。

于 2013-02-07T15:24:00.083 に答える