class data
{
private:
int ID;
string address,name;
public:
data(int i,string a,string n):ID(i),address(a),name(n){}
friend class SetData;
};
class SetData
{
private:
data obj(43,"185 Awan Market","Talha"); //this is where the error happens
public:
void show()
{
cout<<"Name is: "<<obj.name<<endl;
cout<<"Address is: "<<obj.address<<endl;
cout<<"ID is: "<<obj.ID;
}
};
2
A
回答
5
C++ 03
它屬於在構造函數中的MEM-初始化:
class SetData
{
private:
data obj;
public:
SetData() : obj(43,"185 Awan Market","Talha")
{
}
// Rest goes here...
};
C++ 11
你必須使用支架或相等的初始值設定項。
// Fine
data obj{43,"185 Awan Market","Talha"};
// Fine, too
data obj = data(43,"185 Awan Market","Talha"); //this is where the error happens
爲什麼不允許使用括號,請參閱Non-static data member initializers提案。向下滾動到「關於標識符的範圍中科納提出了一個問題」
了類作用域查找的動機是,我們希望能夠 放任何東西在非靜態數據成員的初始化程序,我們可能 放於MEM-初始化沒有顯著改變語義 (模直接初始化與拷貝初始化):
int x(); struct S { int i; S() : i(x()) {} // currently well-formed, uses S::x() // ... static int x(); }; struct T { int i = x(); // should use T::x(), ::x() would be a surprise // ... static int x(); };
不幸的是,這使得的初始化「(表達式列表)」 形式的曖昧聲明被解析的時間:
struct S { int i(x); // data member with initializer // ... static int x; }; struct T { int i(x); // member function declaration // ... typedef int x; };
一個可行的辦法是依靠現有的規則,如果一個 聲明可能是一個對象或一個函數,那麼它是一個功能:
struct S { int i(j); // ill-formed...parsed as a member function, // type j looked up but not found // ... static int j; };
類似的解決方案將適用另一個現有的規則,目前 只用於模板,如果T可能是一個類型或其他東西, 那麼它是別的東西;我們可以用「類型名稱」如果我們真正的意思 類型:基本上
struct S { int i(x); // unabmiguously a data member int j(typename y); // unabmiguously a member function };
這些解決方案都引入可能是 受到不少用戶的誤解(通過 補償的許多問題證明微妙之處。 lang.C++關於爲什麼「int i();」在塊範圍不聲明默認初始化int的 )。
本文提出的解決方案是僅允許初始值爲 的「=初始化子句」和「{初始值列表}」形式。這 解決了大多數情況下的模糊性問題,例如:
HashingFunction hash_algorithm{"MD5"};
0
不能初始化對象直列這樣的,你必須這樣做,在構造函數初始化列表:
class SetData
{
private:
data obj;
public:
SetData() : obj(43,"185 Awan Market","Talha") {}
...
};
1
不允許以這種方式初始化非靜態數據成員。你應該使用支撐或相等初始化器
class SetData
{
private:
// data obj = {43,"185 Awan Market","Talha"}; is also valid
data obj{43,"185 Awan Market","Talha"};
參考文獻non-static data members initialization
替代解決方案:構造函數初始化列表
class SetData
{
private:
data obj;
public:
SetData() : obj(43,"185 Awan Market","Talha") {}
void show()
...
};
至於爲什麼括號不支持非靜態數據成員的初始化,我建議你閱讀這篇文章:Why C++11 in-class initializer cannot use parentheses?
相關問題
- 1. C++:數字常量之前的預期標識符
- 2. 字符串常量之前的預期標識符C++錯誤
- 3. FLEX-BISON:錯誤:期望的標識符或'('字符串常量之前
- 4. 錯誤:期望')'數字常量之前
- 5. 期望';'數字常量之前
- 6. C - 錯誤:期望的標識符或'('之前的'void'
- 7. 「在'A'之前的期望標識符或'('之前'['token'和'error:expected')'」
- 8. 獲取錯誤:期望的標識符或'('在'{'標記之前
- 9. 錯誤:預期的標識符或「(」編譯內核時之前數字常量
- 10. 在數字常量之前預期爲非限定標識
- 11. 期望標識符
- 12. 期望的標識符或 「(」 之前 「{」 令牌
- 13. 錯誤:「(」令牌隊列之前的期望標識符
- 14. Flash CS4錯誤1084:期望Var之前的標識符
- 15. IE8的期望標識符
- 16. Xcode的期望標識符
- 17. C-錯誤的期望標識符或「(」前令牌
- 18. IE 7期望的標識符,字符串或數字
- 19. C頭文件錯誤:期望的標識符或'('之前'['令牌
- 20. C++錯誤「期望不符合標識之前')'標記」(第1行)
- 21. 錯誤:期望的聲明說明符或'...'在字符串常量之前
- 22. 預期的標識符或'('之前'int'
- 23. 問題與宏(#define)「在數字常量之前顯示預期的標識符」錯誤,在iPad中
- 24. initWithObjects - 期望標識符
- 25. 預計標識符或「(」前的數字常量ATMEGA
- 26. 預期';'數字常量之前
- 27. 數字常量之前預期的非限定符號?
- 28. 數字常量之前的預期說明符 - 限定符列表
- 29. C++中的常量標識符修改
- 30. ';'之前的預期標識符令牌在objective-c
NSDMI只支持振奮 - 或 - 相等的初始化器 –