2012-08-31 35 views
0

我的任務之一就是創建一個類,其中包含兩個其他兩個類的列表並創建「大四」(構造函數,複製構造函數,操作符=,析構函數)如何在C++中創建一個類的列表

這裏就是我所做的:

using namespace std; 

class A{...}; 
class B{...}; 

class C{ 
    list<A> a; 
    list<B> b; 
    public: 
    C(); 
    ~C(); 
    C(const C& c); 
    void operator=(const C& c); 
}; 

C::C(){ 
    //How to allocate memory for a and b? 
} 

C::~C(){ 
    //How to free the memory? 
} 

C::C(const C& c){ 
    a=c.a; 
    b=c.b; 
} 

void operator=(const C& c){ 
    if(&c==this) return; 
    // how do I delete a and b? 
    a=c.a; 
    b=c.b; 
} 

莫非你清楚的是,我不明白的事情(如註釋中的代碼)。如果我沒有做任何正確的事情,也給我建議?

+0

這是什麼'list','std :: list'? –

+0

nope,它不是作業,編輯後 - 是std :: list。 –

+0

你能詳細說明你的意思嗎:*包含兩個其他類的列表*? 這實際上是兩個其他兩個類*的實例列表嗎?每個列表是否需要包含其他類的對象或只是一種類型對象的容器? – marko

回答

2

由於您使用的是值(std::list值),因此無關。你的構造函數會自動調用std::list構造函數,它可以分配所需的任何資源。你的析構函數會調用std::list析構函數,它釋放它獲取的資源。

需要一些額外的工作,如果你持有任何指針(std::list<A*> a;')的指針列表(即std::list<A> *a;)或列表 - 或兩者(std::list<A*> *a;)。

+0

1.但在這些列表中有類的實例 - 列表將自動釋放它們? 2.運算符=?沒有補充? 3.因此,C的構造函數和析構函數應該保持空着? –

+0

@John:re 1 .:是的,'std :: list'會自動調用'A'析構函數。重新2/3:你不需要四者之一:沒有構造函數,沒有析構函數,沒有拷貝構造函數,也沒有賦值操作符。這些函數的默認實現將在你的情況下做正確的事情。 –

+0

@John:你不需要operator =。將爲您生成一個默認的,做正確的事情。 –

0

//如何爲a和b分配內存?

你不需要自己分配內存。因爲你正在堆棧上分配你的成員變量。當有人在你的班級實習時會自動設置。

//如何釋放內存?

你不需要自己釋放內存。爲了同樣的原因。當scop結束時,您的堆棧變量將自動解除分配。

//如何刪除a和b?

爲什麼你需要刪除a和b?您正在將其他對象的數據複製到此目錄中。

+0

它與「在堆疊」上沒有關係。 C類型的對象可以在靜態作用域中聲明,也可以使用new來創建。 –

0

您的變量使用自動存儲類,他們不需要顯式刪除。

你的賦值運算符

void operator=(const& C rhs); 

不應該返回void。 //因爲這不是內建類型所做的,並且阻止了分配鏈接。

例如

int x, y, z; 
x = y = z = 0; 

它看起來像你想實現你的評論移動語義

// how do I delete a and b? 

你的賦值運算符應該複製的狀態,或者你應該記錄它使用不規範的行爲。例如移動語義,boost :: noncopyable Et cetera。

0

如果你使用std :: list,你的類A或B應該: 1可以在堆棧和堆上分配 2不能是單例對象。

+0

單身人士在哪裏? –

+0

位於std :: list中的對象應該安全地支持副本(克隆)。如果我們把一個單例對象輸入一個std :: list,那就錯了。 – feelapi

0

隨着移動構造函數的出現,它現在變成了六大類。在這裏學習和理解所有的細節,並且你將在課堂鍋爐板上獲得碩士學位。

#include <list> 

class A {}; 
class B {}; 

class C{ 
    std::list<A> a; 
    std::list<B> b; 
    public: 
    typedef std::list<A>::size_type size_type; 
    explicit C(size_type sz =0); 
    virtual ~C(); 
    C(const C& c); 

    // Specialize external swap. Necessary for assignment operator below, 
    // and for ADL (argument-dependant lookup). 
    friend void swap(C& first, C& second); 

    // Assignment-operator. Note that the argument "other" is passed by value. 
    // This is the copy-and-swap idiom (best practice). 
    C& operator=(C other); // NOTE WELL. Passed by value 

    // move-constructor - construct-and-swap idiom (best practice) 
    C(C&& other); 

}; 

C::C(size_type sz) : a(sz), b(sz) {} 

C::~C(){} 

C::C(const C& c) :a(c.a), b(c.b){} 

void swap(C& first, C& second) { 
     // enable ADL (best practice) 
     using std::swap; 
     swap(first.a, second.a); 
     swap(first.b, second.b); 
} 

// Assignment-operator. Note that the argument "other" is passed by value. 
// This is the copy-and-swap idiom (best practice). 
C& C::operator=(C other) { 
    swap(*this, other); // Uses specialized swap above. 
    return *this; 
} 

// move-constructor - construct-and-swap idiom (best practice) 
C::C(C&& other): a(0) , b(0) { 
    swap(*this, other); 
} 
相關問題