c++の範囲forとイテレータについての質問です。
クラス内で宣言した別の自作クラスに、範囲forとイテレータを用いて代入する方法を教えてください。
○聞きたいことの詳細
以下のコードのようにコンストラクタで範囲forとイテレータを用いて代入すると、for内では代入されていますが、forを抜けると代入されていません。
ためしに従来のfor文の書式で代入してみると、うまくいきました。
そこで、聞きたいことは以下の2点です。
1.範囲forとイテレータを用いて代入ができなかった原因
2.このコンストラクタ内で範囲forとイテレータを用いて代入を行う場合の正しい書き方
どなたか分かる方がいればお教えください。
おそらくはアクセスの仕方が悪くて、一時的に生成されたインスタンスに代入してしまっているんじゃないかなーと思うのですが…
以下ソースコード。
----
#include <string>
#include <iostream>
#include <vector>
#include <initializer_list>
using namespace std;
class CSign
{
public:
int id;
string sign;
int value;
CSign(const char* s) : sign(s) {}
~CSign() {}
friend ostream& operator<<(ostream& os, const CSign& cls) {
os << cls.sign;
return os;
}
};
class CFixedDo
{
public:
vector<CSign> noteName = initializer_list<CSign>{ "C", "D", "E", "F", "G", "A", "B" };
CFixedDo() {
//範囲forとイテレータを用いて初期化.
int i = 0;
for (auto it : this->noteName) {
it.id = i;
it.value = i;
//for内での代入は成功している
//cout << it.id << "\t" << it.sign << "\t" << it.value << endl;
++i;
}
show(); //ゴミが表示される
cout << endl;
//従来のfor文で初期化.
for (int i = 0, n = (int)this->noteName.size(); i < n; ++i) {
this->noteName[i].id = i;
this->noteName[i].value = i;
}
show(); //代入成功
}
~CFixedDo() {}
inline void show() const
{
for (auto it : this->noteName) cout << it.id << "\t" << it.sign << "\t" << it.value << endl;
}
};
void main()
{
CFixedDo nn;
return;
}
//EOF