Можем ли мы вызывать функцию-член только в списке инициализации члена в 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())" будет работать, но у меня есть особая цель инициализировать, как указано выше.

Однако в приведенном выше примере я получаю следующую ошибку:

В классе «my» нет поля с именем «initMy».

Как решить это?

-1

Решение

Если вы пытаетесь написать конструктор для class my, тогда он должен быть назван с именем класса. Следующее будет работать при условии, что initMy это имя другого класса, который вы пытаетесь подкласс.

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

Другие решения

Вы можете попытаться предварительно инициализировать все поля, а затем вызвать функцию инициализации внутри конструктора:

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

  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. Если вам нужно установить значение только одного члена в классе, вы должны использовать метод установки

класс 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");
}
0
По вопросам рекламы [email protected]