2012-12-08 62 views
0

我自學C++。 如果你製作的Class只有一個成員變量是「X」對象的集合,(無論X是什麼)只有一個默認的構造函數和一個解構器就足夠了,看起來它純粹處理的是一組對象?謝謝。C++集合類

編輯:抱歉應該更清楚。對於另一個例子,如果你有一個類「Aclass」,它有一個int,一個字符串和另一個類的對象向量,你會建議「Aclass」類有一個帶參數的構造函數嗎?即Aclass(int i, string s);,你是否也需要在構造函數中使用vector?我有點困惑。謝謝。

+3

夠用了麼? –

+0

「收藏」是什麼意思? –

回答

1

如果通過「收集'x'對象」,您的意思是「一個標準的'x'對象容器」,並且「足夠」表示「足夠不用擔心資源管理」,那麼是的。任何由您或第三方製作的精心製作的容器也是如此。

這也假設你的X對象正確地處理了他們的資源。而且,他們有與你把他們在容器中。

編輯

如果你是具有填充有默認值的一切對象確定你不需要那樣的構造兼容的語義。即空容器,歸零成員(或者是未初始化的?-_-)等。

如果對象將處於無效狀態而沒有一個,或者您想要某種自定義邏輯跑。

+0

對不起,我應該更清楚。我已更新我的問題 – binary101

+0

編輯我的答案 – Cogwheel

+0

好吧,我明白了,謝謝你的時間。 – binary101

0

你的意思是足以正確處理內存?取決於類型X。例如,如果您有一個vector<string>數據成員,則不必在班級中進行任何手動內存管理。

0

對於類,你可以寫自己的構造函數,這表明,如何構造內的對象,即

class A{ 
    string s; 
    int x; 
    A(string t):s(t), x(17){} // x is always 17 after construction 
} 

但如果內部對象是默認施工的,你可以把它的建設,它將由costruct默認。

A(int l):x(l){} 

相當於

A(int l):x(l), s(){} 

(除了基本類型),可以由默認

包含垃圾如果你使用的A默認的構造函數,所有內部的對象將默認構造。

0

如果通過collection您指的是標準庫類,則需要copy ctor和assignment operator = overloaded。

std :: map和std :: set將需要重載一個額外的比較運算符<。 std :: unorderd_map和std :: unordered_set需要一個專門用於你的類型的std :: hash。

0

通常您不必定義默認構造函數。編譯器將隱式地聲明一個默認的構造函數,如果需要的話並且沒有定義構造函數的話。除了默認的構造函數外,定義其他的構造函數通常是很有用的(比如你提到的構造函數)。在這種情況下,您需要同時定義:

class A 
{ 
public: 

    string s; 
    int x; 

    // default constructor, no arguments 
    A(): x(), s() {} 

    // constructor 
    A(int i, string t): x(i), s(t) {} 
} 

int main() 
{ 
    A a1; 
    A a2(5, "text"); 
    vector<A> ls; 
    return 0; 
} 

正如pwned提到的,爲了在STL容器中使用您的類A,向量,需要A具有默認構造函數,如示例中所示(用戶定義或隱式)。