Правильный способ инициализации указателя в конструкторе
У меня есть следующее упражнение:
Добавьте код, чтобы он работал правильно.
class MyInt
{
public:
private:
int* MyValue;
}
int main(int argc,char** argv)
{
MyInt x(1);
...//a bit more code where the actual value of x is going to be used.
return 0;
}
Я добавил как частную собственность
int val;
и общественный конструктор
Myint(int x)
{
val = x;
MyValue = &val;
}
Я добавил int val как способ для конструктора назначить MyVal адрес объекта, который не является временным, как x.
Есть ли хороший способ ответить на это упражнение?
3 ответа
По-другому:
MyInt(int x) : MyValue(new int(x)) {}
Это не требует дополнительного члена. Однако вы должны убедиться, что вы освободили память в деструкторе.
~MyInt() { delete MyValue; }
Я не вижу ничего в исходной постановке проблемы, которая требует инициализации указателя по адресу int
, Минимальный код, необходимый для исправления примера, заключается в добавлении конструктора, который принимает int
и инициализировать MyValue
в nullptr
,
class MyInt
{
public:
MyInt(int) {}
private:
int* MyValue = nullptr;
};
int main(int argc,char** argv)
{
MyInt x(1);
return 0;
}
Если ваш компилятор не поддерживает C++11, тогда
class MyInt
{
public:
MyInt(int) : MyValue(NULL) {}
private:
int* MyValue;
};
Я не совсем уверен, почему вы хотите сохранить указатель на int
внутри класса, вместо того, чтобы просто хранить значение напрямую (и не иметь указатель в качестве входных данных для конструктора), но предполагая, что вы действительно этого хотите, вот как вы это сделаете:
MyInt(int x):MyValue(new int(x)){}
Но это действительно, действительно ужасный стиль, и у тебя должна быть веская причина для этого. Вы также должны помнить, чтобы освободить указатель при уничтожении класса:
~MyInt(){delete MyValue;}