2013-10-13 51 views
0

我是新來的c + +,我想創建和下面的結構數組。請任何幫助!感謝如何在C++ 11中創建這個結構體的數組?

struct contact{ 
    string name; 
    string address; 
    string phone; 
    string email; 
    contact(string n, string a, string p, string e); 
    }; 
+5

這樣一個基本的問題應該不需要計算器問題;無論您正在學習C++的書籍或教程應該涵蓋此內容,還是谷歌搜索「C++數組」。 Stackoverflow不應該是您的第一個也是唯一的資源。 – bames53

回答

0
#include <vector> 
#include <array> 
#include <string> 

using std::string; 

struct contact{ 
    string name; 
    string address; 
    string phone; 
    string email; 
    contact(string n, string a, string p, string e); 
}; 

std::vector<contact> contacts1;  // for an array without a size known at compile time. 
std::array<contact, 1> contacts2 = { // for an array with a known and static size. 
    contact{ "Bob Smith", "42 Emesgate Lane, Silverdale, Carnforth, Lancashire LA5 0RF, UK", "01254 453873", "[email protected]"} 
}; 
+1

'std :: array'版本可能會因爲'contact'沒有默認構造函數而被刪除。 – juanchopanza

+0

是的,你是對的std ::數組沒有工作 我試圖尋找如何創建一個默認的構造函數,並沒有運氣 – user2843336

+0

@ user2843336你不必做太多。只要'contact(){}'(或'contact()= default',如果你有C++ 11的話)。 – juanchopanza

1

在C++中,如果你沒有任何的構造函數創建一個類時,編譯器會創建一個平凡缺省構造你的 - 那就是,一個構造函數沒有參數。由於您創建了一個非默認構造函數,因此編譯器不會爲您生成默認構造函數。您通常會創建一個類型爲「contact」的數組,其格式如下:

contact my_array[10]; 

這將在每個成員上調用聯繫人的默認構造函數。由於沒有默認構造函數,因此您可能會看到編譯失敗。

我會建議添加一個默認的構造函數。你的新的結構可能類似於如下:

struct contact{ 
    string name; 
    string address; 
    string phone; 
    string email; 
    contact(); // This is your default constructor 
    contact(string n, string a, string p, string e); 
}; 

之後你這樣做,你現在應該能夠創建具有如下內容的數組:

contact my_array[10]; 
+0

這非常有幫助!謝謝:) 有沒有辦法讓我用變量創建一個數組? 例如,我想創建一個數組,它是文件中行數的大小。所以我得到一個文件中的行數,然後將它存儲在一個變量中。 – user2843336

+0

謝謝,如果回答您的問題,請不要忘記註冊並接受。另外請確保看看@juanchopanza的答案;它提供了更多的信息。要創建一個可變長度的數組,我會推薦一個教程,例如[this one](http://www.cplusplus.com/doc/tutorial/dynamic/) –

3

的問題似乎是,你是試圖實例化一個contact對象的數組,但是這個類沒有默認的構造函數,因爲你已經添加了一個非默認的用戶定義的構造函數。這將刪除編譯器生成的默認構造函數。拿回來,你可以使用default

struct contact{ 
    string name; 
    string address; 
    string phone; 
    string email; 
    contact() = default; // HERE 
    contact(string n, string a, string p, string e); 
}; 

這允許你做這樣的事情:

contact contactsA[42]; 
std::array<contacts, 42> contactsB; 

編輯:另一種解決辦法,因爲你的類型的簡單,是刪除用戶定義的構造函數。這將使類型的集合,這將允許您使用集合初始化,你將不得不採取任何特殊措施,使默認建築:

struct contact 
{ 
    string name; 
    string address; 
    string phone; 
    string email; 
}; 

現在你可以使用集合初始化:

contact c{"John", "Doe", "0123-456-78-90", "[email protected]"}; 

和實例化數組作爲前:

contact contactsA[42]; 
std::array<contacts, 42> contactsB; 
+0

或者只是忽略這兩個ctors並依賴聚合初始化? – dyp

+0

@DyP好點,我沒有注意到contsructor參數和數據成員之間的一對一映射。我相應地編輯我的答案。 – juanchopanza

+1

這不僅是ctor中的1對1映射,令我震驚的是四位公共非常數數據成員。無論ctor做什麼,一個免費函數都可以做到這一點(只要它有*任何*的方式來創建一個實例)。 – dyp