Правильный способ инициализации указателя в конструкторе

У меня есть следующее упражнение:

Добавьте код, чтобы он работал правильно.

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;}
Другие вопросы по тегам