1

こんにちは、「->」演算子に問題があります。ここに私のコードがあります:クラスOfferingPair * weeklySchedule ;内でSchedule宣言され、OfferingPairはヘッダーファイル内で宣言されます。

struct     OfferingPair
{
  Offering     * off     ;
  OfferingPair * nextOff ;

}


Schedule::Schedule ()
{
    this->weeklySchedule=new OfferingPair[5];

    for(int i=0;i<5;i++)
    {
        weeklySchedule[i]->off=NULL;
        weeklySchedule[i]->nextOff=NULL;
    }   
}

そして理由:

weeklySchedule[i]->off=NULL;
weeklySchedule[i]->nextOff=NULL; 

行私は言うエラーを得ました:

base operand of ‘->’ has non-pointer type ‘OfferingPair’

しかし、weeklySchedule[i] は、「->」を使用できない理由を示すポインタです。よろしくお願いします。

4

3 に答える 3

14

weeklySchedule[i]ポインターではなくオブジェクト自体を返すため、使用する必要があります.

weeklySchedule[i].off=NULL;
weeklySchedule[i].nextOff=NULL;

コードを次のように変更することをお勧めします。

std::vector<OfferingPair> weeklySchedule

けれど。それがRAIght (c) の仕事です。

于 2012-10-22T17:37:08.220 に答える
0

->他の人はすでにvs.ドット(.)構文の問題を指摘しています。

しかし、私は他の側面について少し詳しく説明したいと思います。

OfferingPair::offnextOffデータメンバーをに初期化しているのでNULL、おそらくこの作業はOfferingPair デフォルトのコンストラクター内で行う必要があります。

struct OfferingPair
{
  ....

  OfferingPair()
    : off(NULL)
    , nextOff(NULL)
  {
  }
};

また、生のCのような配列の代わりに使用してstd::vector、上記の構造のインスタンスを格納できます。Schedule次のようにデータメンバーをクラスに追加します。

  std::vector<OfferingPair> m_weeklySchedule;

次に、デフォルトのコンストラクターstd::vectorで5つのアイテムを作成します。

Schedule::Schedule()
  : m_weeklySchedule(5)
{
}

コードがどのように単純化されているかに注意してください。

delete[]動的に割り当てられた配列のメモリを解放するために、デストラクタに明示的なものは必要ないことにも注意してください。std::vectorのデストラクタは自動的に呼び出され、それを処理します。

さらに、コンパイラーが生成したコピーコンストラクターとコピーは、メンバーごとのコピー(対応するコピー操作を呼び出す)でoperator=正しいことを行います。代わりに、生のCのような配列を使用して、コピーコンストラクターの適切なコードを記述します(またはそれらを禁止します。それらを宣言する)。std::vectoroperator=private

編集: 新しいコード、特にOfferingPairデータ構造のスケッチを追加して、元の投稿を編集したようです。

struct OfferingPair
{
  Offering     * off;
  OfferingPair * nextOff;
};

あなたが次の内部へのポインタを 持っているという事実は、多分あなたはただのリンクリストが必要だと思いますか?これがリンクリストの学習演習でない限り、おそらく、、またはC ++ 11が必要ですか?OfferingPairOfferingPairOfferingstd::list<Offering>std::forward_list<Offering>

于 2012-10-22T17:55:35.290 に答える
0

配列インデックス演算子は、基本的に次のように定義されます。

a[b]=*(a + (b))

演算子は、基本的に次の->ように定義されます。

a->b=(*a).b

だからあなたが書くとき:

weeklySchedule[i]->off=NULL;

あなたはこれを書いています:

(*(*(weeklySchedule + i))).off=NULL;

ポインターを 2 回逆参照していることに注意してください。明らかにこれは間違っています!

于 2012-10-22T18:23:58.257 に答える