私はc ++を学んでいます私は恐ろしく新しいです、私は私のコードにバグを見つけて例で再現することができました、このコードで私はいくつかの価格オブジェクトを生成してそれをstd :: vectorに追加しています、なぜオブジェクト内のcloseの値最初の要素の価格は明らかにメモリ内のランダムな値ですか?これは参照の問題ですか?
#include <vector>
#include <string>
#include <iostream>
class Price{
public:
double entry;
double close;
Price(double initial){
entry = initial;
}
};
int main(){
std::vector<Price> prices;
bool open = false;
int index = 1;
std::cout << "####### before ########" << std::endl;
while (index < 10){
if (open){
Price current = prices[prices.size() - 1];
current.close = -current.entry;
open = false;
std::cout << "open: " << current.entry << " | close: " << current.close<<std::endl;
}
else{
Price new_price(index);
prices.push_back(new_price);
open = true;
}
++index;
}
std::cout << std::endl << "####### after ########" << std::endl;
for(const auto price: prices){
std::cout << "open: " << price.entry << " | close: " << price.close << std::endl;
}
}
上記のコードによって生成される出力は次のとおりです。
####### before ########
open: 1 | close: -1
open: 3 | close: -3
open: 5 | close: -5
open: 7 | close: -7
####### after ########
open: 1 | close: 4.6799e-310
open: 3 | close: -1
open: 5 | close: -3
open: 7 | close: -5
open: 9 | close: -7
また、最後の要素のcloseの値に変更Price current = prices[prices.size() - 1];
すると、破損し、最初の要素は問題ありません。私は迷子になっています、誰かが私にこの行動を説明できますか?Price& current = prices[prices.size() - 1];
では####### before ########
リスト、あなたはメンバーの両方を持つオブジェクトを印刷するentry
とclose
初期化されます。
一方、entry
初期化されているだけのオブジェクトはベクターにプッシュprices
され、####### after ########
リストに出力されます。(Price current = prices[prices.size() - 1];
ベクター内のオブジェクトのコピーを作成するためcurrent
、ベクター内の要素に影響を与えないように変更します。初期化されていないdouble
メンバーの値は不確定であるため、結果は偶然に取得されます。
Price& current = prices[prices.size() - 1];
current
ベクトルの要素に影響を与えるように変更を加えますが、ループは9回しか実行されないindex = 1, 2, ... , 9
ため()、の初期化close
は行われません。あなたは、変更することもできますwhile (index < 10)
しwhile (index <= 10)
、この問題を解消します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加