私はC++には新しくプログラミングには向いていませんが、私は非常に困惑しています。私はそのコンストラクタでリストを作成するクラスを持っています。コンストラクタ内のリストのiteratorを呼び出すと、最終値が変更されますか?
私はリストの最終的な価値をプリントアウトしています。これは、一般的にお互いに合っています.1つはlist::end
、もう1つはlist::back
です。次に、私は主な関数でこのクラスのコンストラクタを呼び出し、作成されたリストにアクセスして、最終的な値を出力しようとします。サンプルコードを以下に示します。
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <typeinfo>
#include <list>
#include <algorithm>
#include <queue>
using namespace std;
class Process{
public:
Process(int CB);
int CB;
};
Process::Process(int c){
CB = c;
}
class Event{
public:
Event(Process *process);
Process *process;
};
Event::Event(Process *ps){
process = ps;
}
typedef list<Event> EventList;
class DES{
public:
DES(string originFile);
EventList events;
};
DES::DES(string originFile){
ifstream infile (originFile.c_str());
string str;
while (getline(infile, str)) {
// output the line
//cout << str << endl;
istringstream iss(str);
int AT,TC,CB,IO;
if (!(iss >> AT >> TC>>CB>>IO)) {
cout<<"breaking out of while loop \n";
break;
}
Process p(CB);
Event evt(&p);
this->events.push_back(evt);
}
int cb = this->events.back().process->CB;
EventList::iterator inserter2 = this->events.begin();
EventList::iterator inserter3 = this->events.end();
//inserter3--;
//cout<<"CB after while loop using List<>::end(): " <<inserter3->process->CB<<endl;
//cout<<"CB after while loop using LIST<>::back "<<cb<<endl;
infile.close();
}
int main (int argc, char* argv[]) {
string inputFileName = argv[1];
DES des(argv[1]);
EventList::iterator b = des.events.end();
b--;
cout<<"CB at back of list in main: "<<b->process->CB<<endl;
return 0;
}
ここで私は混乱するところです。 mainのprintステートメントは、リストの最後の要素のフィールド->process->CB
を単に出力するだけなので、コンストラクタのprintステートメントの出力と一致する必要があります。しかし、何らかの理由でこれは私のコンストラクタで//EventList::iterator inserter2 = this->events.begin();
という行のコメントを外すときにのみ機能します。同様に、私はその行を保持し、代わりに行EventList::iterator inserter3 = this->events.end();
をコメントアウトする場合、それは動作しません。私は両方のイテレータを構築するときだけリストの終わりと始めに、正しい値がmainに出力されます。
誰でもこの奇妙な行動を見せてくれますか?私はC++に精通していないために何か簡単な誤解でなければならないことを知っていますが、この動作は私にとって不自然なようです。
編集:ここではコメントアウトコンストラクタでイテレータの一つと出力されます。
CB after while loop using List<>::end(): 10
CB after while loop using LIST<>::back 10
CB at back of list in main: 306496
そして、ここでコンストラクタでのイテレータの両方で出力されます:
CB after while loop using List<>::end(): 10
CB after while loop using LIST<>::back 10
CB at back of list in main: 10
- Paul
質問を編集し、分離された個々のコードフラグメントを削除し、[mcve]に置き換えてください。 –
また、コメントを削除してください。コードの行はどのようなものか知っています。 – PaulMcKenzie
コメントを削除するコードを編集しました。コードが異なるファイルに存在する場合、どのように組み合わせるべきですか? – Paul