2016-10-24 17 views
0

というクラスといくつかのインスタンス変数を持つクラスがあるとします。ask()(整数を返します)。オブジェクトへのポインタのstd :: vectorの各要素の参照解除

std::vector<TextEntry*> d_text(タイプTextEntryのポインターのベクトル)タイプのベクトルを作成します。このベクトルのすべての要素を繰り返し処理し、各要素に適用されるメソッドask()を呼び出したいと思います。これは正しい方法ですか?理由がなぜあるため、上記のコードや私のプロジェクトの残りの部分で他のいくつかの問題であるかどうかを知るために参考になるように、この実装は私にエラーを与えている何らかの理由

for (std::vector<TextEntry*>::iterator it = d_text.begin(); it != d_text.end(); ++it) { 

    TextEntry* TextEntryPointer = *it; // first dereference the iterator 

    TextEntry TextEntry = *TextEntryPointer; // dereference the TextEntry pointer 

    int j = TextEntry.ask(); 

} 

+1

"エラーが何であるかを知ることは役に立ちます" – krzaq

+2

ポインタが邪魔にならないようにするには、 'TextEntryPointer-> ask()'を呼び出してください。 –

+4

'ask( ) 'を使用すると、なぜあなたはその要素のコピーに対してそれを呼び出すのか自分自身に尋ねるべきです。 – juanchopanza

答えて

3

このベクトルのすべての要素を繰り返し処理し、各要素にask()メソッドを呼び出します。これは正しい方法ですか?

ほぼ。

d_textによって指し示された要素ではなく、各指し示された要素のコピーに対して、askが呼び出されます。


それがコピーである、なぜ私は混乱しています。

あなたはタイプTextEntryの変数を作成します。 *TextEntryPointerからコピーを初期化します。だからコピーがあるのです。

元の要素で呼び出す方法はありますか?

はい。代わりに、コピー構築TextEntry変数の、あなたが代わりに参照変数を使用することができます。

TextEntry& TextEntry = *TextEntryPointer; 

をこれは、ベクトルの要素が指すオブジェクトを参照します。

以上簡単に、すべてで中間変数を作成しないでください:

int j = TextEntryPointer->ask(); 

を多分いなくても、ポインタのための:

:あなたは、同様のループを簡素化することができ

int j = (*it)->ask(); 

for(TextEntry* ptr : d_text) { 
    int j = ptr->ask(); 
} 

012この実装はセミコロン

TextEntry TextEntry = *TextEntryPointer // dereference the TextEntry pointer 

PSがあり、私にエラー

を与えている何らかの理由

。型と同じ識別子を持つ変数の命名は避けてください。

+0

オリジナルの要素でそれを呼び出す方法はありますか?それがなぜコピーであるのか混乱しています。 – IntegrateThis

+1

@JamesDickens try(** it).ask();または(* it) - > ask(); – Aram

1

少し仮定のあるプログラム例。 メンバー関数を呼び出すmain関数を調べます。

#include <iostream> 
    #include <vector> 

using namespace std; 

class TextEntry 
{ 
    public: 

    int ask() 
    { 

     return 1; 

    } 

}; 

int main() 
{ 
    vector<TextEntry*> te; 

    TextEntry* te1 = new TextEntry(); 
    TextEntry* te2 = new TextEntry(); 
    TextEntry* te3 = new TextEntry(); 
    TextEntry* te4 = new TextEntry(); 

    te.push_back(te1); 
    te.push_back(te2); 
    te.push_back(te3); 
    te.push_back(te4); 

    for (std::vector<TextEntry*>::iterator it = te.begin(); it != te.end(); ++it) 
    { 
     TextEntry *t = *it; 
     cout<<t->ask(); 

    } 

} 
1

その他の回答は正しいです。しかし、今は2016年だから、C++を持っています。11:

for (auto& text_entry_ptr: d_text) 
{ 
    int j = text_entry_ptr->ask(); 
} 

はるかに簡単でクリーンです。

関連する問題