2015-08-22 89 views
2
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; 
    } 
}; 
+0

NSDMI只支持振奮 - 或 - 相等的初始化器 –

回答

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?

相關問題