Ошибки кодирования конструктора C ++ - PullRequest
2 голосов
/ 01 декабря 2008

Я только что наткнулся на эту ошибку в каком-то устаревшем коде:

class MyAPIHandler
{
    private:
     int handle;
    public:
    void MyApiHandler()  // default constructor
    {
        handle = 42;
    };
};

Он компилируется нормально, без предупреждений, - но поведение было не тем, что я хотел, потому что имя конструктора - ошибка. Это само по себе привело бы к предупреждению о том, что «функция не возвращает значение», но я думаю, что я был на автопилоте и добавил тип возврата «void», чтобы «исправить» это.

Теперь исправление было простым, но мой вопрос таков: -

Какие приемы можно использовать для предотвращения повторения подобных ошибок?

В некоторых языках требуется явное ключевое слово «конструктор», что должно сделать эту проблему очевидной. Модульное тестирование, очевидно, также должно было его поймать. Что еще я могу сделать?

Ответы [ 13 ]

0 голосов
/ 01 декабря 2008

Юнит-тесты.

MyAPIHandler mah;
BOOST_CHECK_EQUAL(mah.handle, 42);
0 голосов
/ 01 декабря 2008

Полагаю, что следующий TDD поможет, но не то решение, которое вы искали ...

Как вы уже сказали, это унаследованный код, я предлагаю вам прочитать "Работа с унаследованным кодом - Кент Бек". Это может помочь.

регрессионное тестирование выберет проблемы из-за исправления ошибок.

даже я с нетерпением жду предложений из коробки :)

0 голосов
/ 01 декабря 2008

Может быть, вы могли бы сделать

#define CONSTRUCTOR

А потом в вашем коде

class MyAPIHandler
{
   public:
       CONSTRUCTOR MyAPIHandler()
       {
           // Deep magic
       }
};

Теперь само по себе это ничего не даст, но если вы привыкнете так писать, вам будет легче обнаружить ошибку.

Хотя я, честно говоря, считаю, что это настолько редкий случай, что не стоит хлопот.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...