簡體   English   中英

正確地將迭代器解引用到指針

[英]Dereferencing iterator to pointers correctly

我有一個指向對象的指針向量。 每個對象存儲一個值並有一個 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 中的值實際上是一個指向數字的指針。

編輯 2:新的 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);
}

您的 toSting() 有問題。 改變

ss <<*(this)->value;

ss << value;

編輯:這不是錯誤,而是使用迭代器時的一般建議。 不要使用<檢查結束,使用!=

iter < input.end()

應該是這樣的:

iter != input.end()

這是因為對於某些容器,< 運算符不會執行您期望的操作。 結果,在某些時候您可能會取消引用 input.end() 本身,這沒有任何意義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM