2012-11-13 48 views
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(); 
} 

最後編輯:好吧,這個問題原來是這是未能正確初始化一個指針borked構造,所以我WAY上在關閉基地問題實際上是。 :)

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); 
} 
+0

我覺得這個代碼將不能編譯,更不用說給一個訪問衝突。除非你寫了'int * Integer :: operator - >()'某地 –

回答

0

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

iter < input.end() 

它應該是這樣的:

iter != input.end() 

這是因爲某些容器,該<運營商不會做你期望的。因此,在某些時候,您可能會取消引用input.end()本身,而這無關緊要。

+4

'std :: vector'有隨機訪問迭代器。 '''可以工作得很好,雖然'!='更具慣用性。 –

+0

@PeteBecker是否真的被標準強制要求,還是定義了實現? – Axel

+0

@Axel - 查看它。 –

2

Your toSting()存在問題。更改

ss <<*(this)->value;

ss << value; 
+0

這是我沒有提及它的錯,但值實際上是一個指針。 – ThisIsNoZaku

+0

擴展的是,如果我傳遞了指針,它可以工作,但它當然會傳遞地址而不是我需要的值。任何試圖解引用以傳入串流會導致訪問錯誤。 – ThisIsNoZaku