Неопределенные / неинициализированные значения по умолчанию в классе - PullRequest
0 голосов
/ 01 июня 2010

Предположим, у вас есть этот класс:

class A
{
public:
  A () {}
  A (double val) : m_val(val) {}
  ~A () {}
private:
  double m_val;
};

Как только я создаю экземпляр A, как я могу проверить, был ли инициализирован / определен m_val? Другими словами, есть ли способ узнать, был ли инициализирован / определен m_val или нет? Полагаю, что-то вроде оператора defined в Python. (Но поправьте меня, если я ошибаюсь.)

Я думал об изменении класса и c-tors следующим образом:

class A
{
public:
  A () : defined(false) {}
  A (double val) : m_val(val), defined(true) {}
  ~A () {}
private:
  double m_val;
  bool defined;
};

Как вы оцениваете это решение? Любое предложение?

ТИА, Chris

Ответы [ 2 ]

4 голосов
/ 01 июня 2010

Вам нужно будет установить разумное значение по умолчанию в конструкторе по умолчанию, в противном случае его значение не определено. Что в основном означает, что это будет случайное значение - может быть 0, NaN или 2835.23098 - невозможно определить, если вы не установите его явно.

class A
{
public:
  A () : m_val(0.0) {}
  A (double val) : m_val(val) {}
  ~A () {}
private:
  double m_val;
};
2 голосов
/ 01 июня 2010

IMO, вы должны просто инициализировать переменные-члены во всех конструкторах, по крайней мере, с разумным значением по умолчанию:

A () : m_val(0.0) {}
A (double val) : m_val(val) {}

Я не вижу никакой выгоды в сохранении значения мусора в ваших переменных (если только вы не планируете использовать их как очень грубый генератор случайных чисел - просто шучу :-). Такие значения мусора и дополнительные флаги усложняют код и всегда требуют внимания программиста, чтобы избежать ошибок - и, поскольку мы люди, наше внимание иногда падает ...

...