我们可以只在c ++中的成员初始化列表中调用成员函数吗?

时间:2014-12-19 06:26:01

标签: c++ member-initialization

我想提供一个带有成员函数的类,它将分别初始化类的所有成员。

e.g。

#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())"会起作用,但我有一些特殊目的可以像上面那样进行初始化。

但是在上面的例子中,我收到了以下错误:

class'my'没有任何名为'initMy'的字段。

如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

如果您正在尝试为class my编写构造函数,则必须使用类名命名。假设initMy是您尝试子类化的另一个类的名称,以下内容将起作用。

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

答案 1 :(得分: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;
};

实际上,我认为你的初始化应该在构造函数中,而不是在其他函数中。

答案 2 :(得分:0)

这里要澄清一些事情。

  1. 成员初始化列表用于初始化成员(主要与构造函数的目的相同)。在初始化列表中与成员函数无关。在此示例中,age(newAge)不是函数。它正在初始化age变量。

  2. class Man{
        private:
            int age;
            string name;
    
        public:
            Man(int newAge):age(newAge),name("Jhon"){}  
        };`
    

    1. 您可以使用构造函数初始化类的成员。

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

      1. 或者,如果您在使用构造函数时遇到问题,可以使用init方法进行初始化。

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

        1. 如果您需要在类中仅设置一个成员的值,则必须使用setter方法
        2. 类Man {     私人的:         年龄;         字符串名称;

          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");
            }