我是新來的c + +,我想創建和下面的結構數組。請任何幫助!感謝如何在C++ 11中創建這個結構體的數組?
struct contact{
string name;
string address;
string phone;
string email;
contact(string n, string a, string p, string e);
};
我是新來的c + +,我想創建和下面的結構數組。請任何幫助!感謝如何在C++ 11中創建這個結構體的數組?
struct contact{
string name;
string address;
string phone;
string email;
contact(string n, string a, string p, string e);
};
#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]"}
};
'std :: array'版本可能會因爲'contact'沒有默認構造函數而被刪除。 – juanchopanza
是的,你是對的std ::數組沒有工作 我試圖尋找如何創建一個默認的構造函數,並沒有運氣 – user2843336
@ user2843336你不必做太多。只要'contact(){}'(或'contact()= default',如果你有C++ 11的話)。 – juanchopanza
在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];
這非常有幫助!謝謝:) 有沒有辦法讓我用變量創建一個數組? 例如,我想創建一個數組,它是文件中行數的大小。所以我得到一個文件中的行數,然後將它存儲在一個變量中。 – user2843336
謝謝,如果回答您的問題,請不要忘記註冊並接受。另外請確保看看@juanchopanza的答案;它提供了更多的信息。要創建一個可變長度的數組,我會推薦一個教程,例如[this one](http://www.cplusplus.com/doc/tutorial/dynamic/) –
的問題似乎是,你是試圖實例化一個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;
或者只是忽略這兩個ctors並依賴聚合初始化? – dyp
@DyP好點,我沒有注意到contsructor參數和數據成員之間的一對一映射。我相應地編輯我的答案。 – juanchopanza
這不僅是ctor中的1對1映射,令我震驚的是四位公共非常數數據成員。無論ctor做什麼,一個免費函數都可以做到這一點(只要它有*任何*的方式來創建一個實例)。 – dyp
這樣一個基本的問題應該不需要計算器問題;無論您正在學習C++的書籍或教程應該涵蓋此內容,還是谷歌搜索「C++數組」。 Stackoverflow不應該是您的第一個也是唯一的資源。 – bames53