1

オブジェクトへのポインターのベクトルがあります。各オブジェクトには値が格納され、その値を文字列として返す toString() 関数があります。ベクトルを通過する反復子があり、toString() を呼び出して各オブジェクトの値を抽出する必要があります。問題は、値を取得する方法がわからないことです。

この関数は、最終的には数値をファイルに書き込むことになっていますが、テストのために cout を使用しています。

    void writeNumbers(vector<Integer*>& input)
    {
        ofstream write;
        write.open("Integers.txt");
        vector<Integer*>::iterator iter = input.begin();
        for (iter; iter < input.end(); iter++)
        {
            **std::cout << (*iter)->toString() << std::endl;**
        }
        write.close();

I get an Access Violation error which points me to the toString() function:

    std::string Integer::toString()
    {
        std::stringstream ss;
        ss << *(this)->value;
        return ss.str();
    }

toString() works fine whenever I don't try to access it through the iterator.

編集: toString の値は、実際には数値へのポインターです。

Edit2: 新しい writeNumbers:

void writeNumbers(vector<Integer*>& input)
{
    ofstream write;
    write.open("Integers.txt");
    vector<Integer*>::iterator iter = input.begin();
    for (iter; iter != input.end(); iter++)
    {
        std::cout << (*iter)->toString() << std::endl;
    }
    write.close();
}

最終編集:問題は、ポインターを適切に初期化できなかった壊れたコンストラクターであることが判明したため、問題が実際にどこにあったかについて、私はかなり離れていました。:)

Integer::Integer(string input)
{
if(isNaN(input))
value = new int(atoi(input.c_str()));
}

したがって、!isNaNである必要があり、さらに、不適切な入力で初期化する問題を修正しました。

//New constructor, works 100%
Integer::Integer(string input)
{
if(!isNaN(input))
    value = new int(atoi(input.c_str()));
else
    value = new int(0);
}
4

2 に答える 2

2

toSting() に問題があります。変化する

ss <<*(this)->value;

ss << value;
于 2012-11-13T12:18:30.860 に答える
0

編集: これはエラーではありませんが、反復子を使用する場合の一般的なアドバイスです。<終了の確認には使用せず、 を使用してください!=

iter < input.end()

次のようになります。

iter != input.end()

これは、特定のコンテナーでは、< 演算子が期待どおりに動作しないためです。その結果、ある時点で、何も指していない input.end() 自体を逆参照する可能性があります。

于 2012-11-13T12:10:40.447 に答える