2011-03-30 33 views
5

Böyle bir dersim varsa, kopya kurucuyu nasıl yazmalıyım?Std :: stringstream üyesi olan sınıfım için nasıl bir kopya oluşturucu yazarım?

#include <stringstream> 

class MyClass { 
    std::stringstream strm; 
public: 
    MyClass(const MyClass& other){ 
    //... 
    } 
    std::string toString() const { return strm.str(); } 
}; 

std :: stringstream hiçbir kopya kurucu kendisi vardır, bu yüzden böyle bir Başlatıcı listesini kullanamazsınız:

MyClass(const MyClass& other): strm(other.strm) {} 

cevap

6

Bu deneyebilirsiniz: Eğer

MyClass(const MyClass& other): strm(other.strm.str()) {} 
+0

Bu durumda yalnızca içerik kopyalanır, nesnenin durumu değil. :/ – Naszta

+0

@Naszta: Evet, bunu kendi cevabınızla ima ediyorsunuz. Bu cevaptaki kod bir "std :: stringstream" yi nasıl etkiler? – quamrana

+1

@Naszta: Haklısınız. Bununla birlikte, bir akışı kopyalamak iyi tanımlanmış bir işlem değildir, bu yüzden içeriğe özgü bir tanım vermek için yazara bırakılmıştır. Örneğin, kopyalanan akışın temel nesneyi orijinal nesneyle paylaşması gerekiyorsa, bunu başaramayacaksınız. – ognian

4

senin derleyici, C++ 0x desteğini desteklemiyor ya da taşıyıcı kurucuyu kullanmak istemiyor.:

MyClass(const MyClass& other) 
: strm(other.strm.str()) 
{ 
    this->strm.seekg(other.strm.tellg()); 
    this->strm.seekp(other.strm.tellp()); 
    this->strm.setstate(other.strm.rdstate()); 
}; 
+0

Bir not: C++ 0x durumunda, bir _move constructor_! – Naszta

+0

İlk örnekte 'other.strm', hareket ettirici için geçerli bir değişken değil. – dalle

+0

@dalle: Referansı http://www.cppreference.com/wiki/io/basic_stringstream/constructor adresinden kullandım C++ 0x uyumlu derleyicim yok. Doğru form nedir? – Naszta

İlgili konular