1. 程式人生 > >vector中存放自定義類 ,對類的要求

vector中存放自定義類 ,對類的要求

vector中存放自定義類的前提是:

自定義的類必須有預設建構函式。因為vector會呼叫預設建構函式來初始化元素的物件。

那必須要明確:編譯器什麼時候隱式宣告預設建構函式?

有兩個條件:

· 該類沒有顯式宣告任何建構函式--既然你都定義了,系統就不給你生成了。

· 資料成員中沒有constreference--因為要初始化

滿足則隱式生成預設建構函式。這裡強調任何,是指即使使用者自定義了複製建構函式或一個需要多個引數的建構函式,預設建構函式也不會被隱式聲明瞭。在定義一個類時要保證有預設的建構函式。

沒有預設建構函式,系統會報錯:

#include<map>
#include<sstream>
using namespace std;
 
class myInt
{
public:
    myInt(int a ,int b):m_li(a),m_ri(b)
     {}
    void print()
    {
        std::cout<<"m_li = "<<this->m_li<<std::endl;
        std::cout<<"m_ri = "<<this->m_ri<<std::endl;
    }

    void set(int li, int ri)
    {
        this->m_li = li;
        this->m_ri = ri;
    }
private:
    int m_li;
    int m_ri;
};

int main() {

	std::vector<myInt> v1(30);
	for(std::vector<myInt>::iterator iter = v1.begin(); iter != v1.end(); iter++)
    {
        iter->print();
    }

	return 0;
}

報錯資訊:error C2512: myInt沒有合適的預設建構函式可用。

分析:myInt(int a ,int b):m_li(a),m_ri(b) 該類定義了建構函式,編譯器就不會定義預設建構函式,所以,就會報錯。

正確的做法:

class myInt
{
public:
    myInt(int a ,int b):m_li(a),m_ri(b)
     {}
	myInt():m_li(0),m_ri(0)
     {}
    void print()
    {
        std::cout<<"m_li = "<<this->m_li<<std::endl;
        std::cout<<"m_ri = "<<this->m_ri<<std::endl;
    }

    void set(int li, int ri)
    {
        this->m_li = li;
        this->m_ri = ri;
    }
private:
    int m_li;
    int m_ri;
};


int main() {

	std::vector<myInt> v1(30);
	for(std::vector<myInt>::iterator iter = v1.begin(); iter != v1.end(); iter++)
    {
        iter->print();
    }

	return 0;
}