2014-12-19 54 views
-1

我想提供一個成員函數的類,它將分別初始化類的所有成員。只能在C++的成員初始化列表中調用成員函數嗎?

例如

#include <iostream> 

using namespace std; 
int x = 10; 

class my{ 
    public: 
    my():init{} 
    int &i; 
    void init() 
    { 
     i = x; 
    } 
}; 

int main() 
{ 
    my m; 
    return 0; 
} 

我知道如果我可以用"class my : i(init())"的工作,但我有一些特殊用途並初始化像上面。

然而,在上面的例子中,我發現了以下錯誤:

類「我」沒有名爲「initMy」任何領域。

如何解決這個問題?

+0

@All現在我編輯的類代碼,請你看看現在吧。 – balaji 2014-12-19 06:39:52

+1

函數不能初始化成員,只能將新值賦給已經初始化的成員。顯式初始化數據成員的唯一方法是將它列在一個bases-members-initializer中,並且唯一可以放在bases-members-initializer中的東西是數據成員和基數,以及(在C++ 11中)其他構造函數。您可以在構造函數體中調用成員函數。 – 2014-12-19 07:23:28

+0

'initMy()'是什麼?那是什麼定義? – 2014-12-19 07:23:32

回答

1

如果您正在嘗試編寫class my的構造函數,那麼它必須用類名命名。假設initMy是您嘗試子類化的另一個類的名稱,以下內容將工作。

class my : initMy 
{ 
    public: 
    int i; 
    my() { 
     i = 10; 
    } 
}; 
0

您可以嘗試預先初始化所有字段,然後調用構造函數中初始化函數:

class my { 
public: 
    int i; 
    void initMy() { 
    i = 10; 
    } 
    my() : i(0) { initMy(); }; 
}; 

你也可以(在C++ 11),用於定義一個奇怪的簽名私有的構造,並委託構造函數它

class my { 
    private: 
    void initMy() { i=10; }; 
    enum privateen {privatev}; 
    my(enum privateen) : i(0) { initMy(); }; 
    public: 
    my() : my(privatev) {}; 
    int i; 
}; 

其實,我相信你的初始化應該是在構造函數中,而不是在一些其他的功能。

0

這裏有幾件事要澄清。

  1. 成員初始化列表用於初始化成員(大多數構造函數的用途相同)。 初始化列表中與成員函數無關。在這個例子中age(newAge)不是一個函數。它正在初始化變量age

class Man{ 
    private: 
     int age; 
     string name; 

    public: 
     Man(int newAge):age(newAge),name("Jhon"){} 
    };` 

  • 可以使用構造函數來初始化類的成員。

  • class Man{ 
    private: 
        int age; 
        string name; 
    
    public: 
        Man(int newAge) 
        { 
         age = newAge; 
         name = "Jhone"; 
        } 
    }; 
    

  • 或者您可以使用一個init方法做初始化,如果你有一些問題,用構造函數。

  • class Man{ 
        private: 
         int age; 
         string name; 
    
        public: 
         Man(){} 
         init(int newAge, string newName) 
         { 
          age = newAge; 
          name = newName; 
         } 
        }; 
    

  • 如果需要設置僅一個成員的值中的一類,則必須使用一個setter方法
  • class Man { private: int age; 字符串名稱;

    public: 
        Man(){} 
        setAge(newAge) 
        { 
        age = newAge; 
        } 
        setName(newName) 
        { 
         name = newNAme 
        } 
    
    }; 
    

    編輯:

    class Man{ 
        private: 
         int age; 
         string name; 
    
        public: 
         Man(initAge, initName) 
         { 
          setValues(initAge, initName); 
         } 
    
         setValues(newAge, newName) 
         { 
         age = newAge; 
         name = newName; 
         }   
    
        }; 
    
        int main() 
        { 
        Man goodMan(34,"Jhon"); 
        goodMan.setValues(45,"Kevin"); 
        } 
    
    +0

    你的所有場景都是正確的。我想要的是在初始化類時使用的泛型方法。可以在構造後調用具有不同值的成員變量。可能嗎?當然是 – balaji 2014-12-19 06:50:26

    +0

    。聲明函數來初始化變量並在構造函數中調用它。之後你可以隨時調用相同的函數。檢查我的編輯部分 – 2014-12-19 06:53:52

    +0

    如果可以在構造函數中調用init方法,但是如果我的成員變量是引用呢?我們必須在成員初始化列表中初始化它們,在這種情況下,我們如何使用init()方法? – balaji 2014-12-19 06:56:43

    相關問題