2013-05-25 62 views
2

我想學習C++中的標準庫,我試圖運行我的代碼,但我無法成功。我忘了什麼,在我的課程「Class」中需要添加哪些內容才能使程序運行?在C++中使用標準庫,複製算法

#include <iostream> 
    #include <vector> 
    #include <list> 
    #include <algorithm> 
    #include <iterator> 
    using namespace std; 

    class Class { 
    public: 
     Class (int ii, double dd) : ival(ii) { dval = new double; *dval = dd; } 
     ~Class() { delete dval; } 
    private: 
     int ival; 
     double *dval; 
    }; 

    int main() 
    { 

     vector<Class> vec; 
     list<Class> list; 
     vec.push_back(Class(1, 2.2)); 
     vec.push_back(Class(2, 4.3)); 
     vec.push_back(Class(3, 5.7)); 
     ostream_iterator<const Class> classout(cout,"\n"); 
     copy(vec.begin(), vec.end(), classout); 
    } 

基本上,我試圖瞭解並使用複製算法:

template 
     OutputIterator copy (InputIterator first, InputIterator last, 
          OutputIterator result) 
    { 
     while (first!=last) *result++ = *first++; 
     return result; 
    } 
+0

@codesinchaos也許你可以幫助我這個嗎?:) – Stabbah

回答

1

std::ostream_iterator使用插入運算符<<將對象到輸出流。您必須提供這樣的操作員。使用成員函數的範例:

class Class { 
public: 
    Class (int ii, double dd) : ival(ii) { dval = new double; *dval = dd; } 
    ~Class() { delete dval; } 
    void print(std::ostream &stream) const { 
    stream << ival << ' ' << *dval; 
    } 
private: 
    int ival; 
    double *dval; 
}; 

std::ostream& operator<< (std::ostream &stream, const Class &arg) { 
    arg.print(stream); 
    return stream; 
} 

作爲替代方案,你也可以通過使一個friend,而不是創建一個成員函數實現它。

+0

非常感謝你們的幫助! @Angew – Stabbah

1

您的代碼有幾個問題。第一個導致編譯錯誤的原因是,您的類不會爲流輸出聲明<<運算符,這意味着它不能使用ostream_iterator打印到流中。爲了解決這個問題,你需要這樣的操作添加到您的類,如:

class Class { 
public: 
    Class (int ii, double dd) : ival(ii) { dval = new double; *dval = dd; } 
    ~Class() { delete dval; } 
    friend std::ostream& operator<<(std::ostream& os, const Class& c) 
    { 
    return os<<c.ival<<": "<<*c.dval;//or whatever you want your output to look like 
    } 
private: 
    int ival; 
    double *dval; 
}; 

但是你的代碼仍然包含一個嚴重的問題:違反三個(或五冶/如果你在C-任何的++ 11)。你的類聲明瞭一個自定義析構函數,但既不是一個自定義的拷貝構造函數,也不是一個自定義賦值運算符這意味着當你複製你的類的一個實例時(比如將它放入一個vector,這兩個對象將包含相同的指針,導致運行時錯誤,因爲第二個對象的銷燬是雙重釋放的)要解決這個問題,要麼需要自己聲明這些操作或者(甚至更好)不要自己做資源管理,而是使用智能指針來代替(C++ 11 std :: unique_ptr或std::shared_ptr,std::tr1::shared_ptr或來自boost for pree C++ 11代碼的指針)