2016-12-10 92 views
-1

我有一個類返回類對象的指針

class Foo 
{ 
    public: 
    char* ptr; 
    Foo() { ptr=new char [10]; } 
    ~Foo() { delete [] ptr; } 
}; 

我已經瞭解到,返回這個類的一個對象是不可能的,因爲動態分配指針是delete「ED和在創建一個懸空指針調用函數

那麼如何返回這個類的一個對象?

Foo Bar() 
{ 
    Foo obj; 
    return obj; 
} 

能把它通過將一個拷貝構造函數

Foo::Foo(const Foo& obj) 
{ 
    ptr = new char [10]; 
    for(int i = 0 ; i < 10 ;++i) 
     ptr [i] = obj.ptr[i]; 
} 

而且功能要解決的問題

Foo Bar() 
{ 
    Foo obj; 
    return Foo(obj);  //invokes copy constructor 
} 

注意這些都只是實際的類我想,是不是代表根據推薦標準創建(即請不要告訴我使用std::stringstd::vector)。

+0

@PaulMcKenzie它沒有解釋怎麼做才能克服它。 – WARhead

+1

該鏈接顯示您需要複製構造函數,賦值運算符和析構函數。 – PaulMcKenzie

+1

@Warhead,你看過第一個答案中的** Managing Resources **部分嗎? –

回答

0

那麼我該如何返回這個類的對象?

您需要實現正確管理內存的複製構造函數和複製賦值操作符。

// Copy constructor 
Foo(Foo const& copy) : ptr(new char[strlen(copy.ptr)+1]) 
{ 
    strcpy(ptr, copy.ptr); 
} 

// Copy assignment operator 
Foo& operator=(Foo const& rhs) 
{ 
    // Don't do anything for self assignment 
    if (this != &rhs) 
    { 
     delete [] ptr; 
     ptr = new char[strlen(rhs.ptr)+1]); 
     strcpy(ptr, rhs.ptr); 
    } 
    return *this; 
} 

如果ptr總是將是10 char秒的數組,你需要重新考慮拷貝構造函數和拷貝賦值。

// Copy constructor 
Foo(Foo const& copy) : ptr(new char[10]) 
{ 
    memcpy(ptr, copy.ptr, 10); 
} 

// Copy assignment operator 
Foo& operator=(Foo const& rhs) 
{ 
    // Don't do anything for self assignment 
    if (this != &rhs) 
    { 
     memcpy(ptr, rhs.ptr, 10); 
    } 
    return *this; 
} 
+0

int賦值運算符是否是'Foo const&'或'const Foo&'?或者它沒有區別? – WARhead

+0

@Warhead,它沒有什麼區別。我更喜歡'Foo const&'編碼風格。 –