2017-05-01 5 views
-3

私はベクトルとこのようなベクトルへのポインタを返す関数を含むクラスAを持っています。C++のvector []演算子がat()の実行中にエラーをスローする

std::vector<ALuint> * SoundComponent::getSource() 
{ 
    return &m_Sources; 
} 

私はgetSource()関数を呼び出すことにより、クラスAのベクトルの値を変更する必要が別のクラスBを持っています。だから私はこれを行うことによってベクトルへのポインタを取得します。

std::vector<ALuint> * sources = m_pSoundComponent[i]->getSource(); 

そしてm_pSoundComponents say for example I want to add 1 to the entries in the vector. For some reason演算子[] gives me an error but at`だけで正常に動作させ、クラスAの配列です。だから、私が試した3つのことがあり、そのうち2つは機能しますが、最初のものが間違っている理由を知りたいのです。

sources[0] += 1; //Does not work 
sources[0][0] += 1; //Works ? Not sure why it became a 2D vector. 
sources->at(0) += 1; //works 

私はat() rはoperator []よりもはるかに遅いので、私はoperator []を使用しようとしていますが、それは今の2Dベクトルである理由私はわからないことを聞きました。

また、クラスAでは、sources[0]をエラーなしで使用することができますが、sources[0][0]でエラーが表示されます。

+2

'sources'はポインタであり、ベクトルではありません。 – juanchopanza

+1

*参考文献*を適切に教える優れたC++教師/レッスンを見つける必要があります。 – Xirema

+0

これを '(* sources)[0]'に変更してください。 – Logman

答えて

4

sourcesは、std::vector<ALuint> *と定義されます。つまり、sources[0]はベクトルを与え、ベクトルの要素にはアクセスしません。 (*sources)と同じです。だからsources[0] += 1は、ベクトル要素ではなくベクトルに1を追加しようとすると意味をなさない。

sources[0][0]とすると、ベクトルが得られ、ベクトルの0番目の要素にアクセスします。これは(*sources)[0]と同じです。

sources->at(0)も同じことをします。それはあなたの代わりに、ポインタの参照を返す場合は、このすべてがけれども回避することができ(*sources).at(0)


と同じであるので、->は、ポインタのメンバーアクセス演算子です。あなたは

std::vector<ALuint>& SoundComponent::getSource() 
{ 
    return m_Sources; 
} 

std::vector<ALuint> * SoundComponent::getSource() 
{ 
    return &m_Sources; 
} 

を変更して、あなたは通常と同じようにあなたがsourcesを使用することができます

std::vector<ALuint>& sources = m_pSoundComponent[i]->getSource(); 

を使用することを可能にすることができます。

+0

ああ、私はポインタと参照がどのように働くか忘れているとは思っていません。これは何年もC++でのコーディングを止めPythonでコードを書くとどうなりますか?どうもありがとうございました。 – Saik

関連する問題