-1

クラスのすべてのメンバーを個別に初期化するメンバー関数をクラスに提供したい。

例えば

#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())"が、上記のように初期化する特別な目的があります。

ただし、上記の例では、次のエラーが発生します。

クラス「my」には「initMy」という名前のフィールドがありません。

これを解決するには?

4

3 に答える 3

1

のコンストラクターを作成しようとしている場合はclass my、クラス名を使用して名前を付ける必要があります。initMy以下は、サブクラス化しようとしている別のクラスの名前であると仮定して機能します。

class my : initMy
{
  public:
    int i;
    my() {
      i = 10;
    }
};
于 2014-12-19T06:28:41.933 に答える
0

ここで明確にするべきことはほとんどありません。

  1. メンバー初期化リストは、メンバーを初期化するためのものです (ほとんどコンストラクターと同じ目的です)。初期化リストでは、メンバー関数とは何の関係もありません。この例age(newAge)では、関数ではありません。age変数を初期化しています。

class Man{
    private:
        int age;
        string name;

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

  1. コンストラクターを使用して、クラスのメンバーを初期化できます。

class Man{
private:
    int age;
    string name;

public:
    Man(int newAge)
    {
        age = newAge;
        name = "Jhone";
    }  
};

  1. initまたは、コンストラクターの使用に問題がある場合は、メソッドを使用して初期化を行うことができます。

class Man{
    private:
        int age;
        string name;

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

  1. クラス内の 1 つのメンバーの値のみを設定する必要がある場合は、セッター メソッドを使用する必要があります。

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");
  }
于 2014-12-19T06:44:39.477 に答える
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;
};

実際、初期化は他の関数ではなく、コンストラクターで行う必要があると思います。

于 2014-12-19T06:32:08.093 に答える