2015-10-11 4 views
0

Я делаю класс исключения, просто сообщает о проблеме на cout и выходит из программы, как это:наследование классов: статические члены и виртуальные методы

class Exception { 
protected: 
    short code; 
    string text; 
public: 
    friend ostream& operator <<(ostream& out, const Exception& p_exception) { 
     return out << p_exception.text; 
    } 
    void execute() { cout << text; exit(code); 
}; 

и это конкретные примеры:

class IndexOutOfBoundsException : public Exception { 
public: 
    IndexOutOfBoundsException() { 
     this->text = "\nERR: An unsuccessful attempt was made to access the index outside the bounds of the array!"; 
     code = 1; 
    } 
}; 
class IndexOfEmptyFieldException : public Exception { 
public: 
    IndexOfEmptyFieldException() { 
     this->text = "\nERR: An unsuccessful attempt was made to access the index of an empty field!"; 
     code = 2; 
    } 
}; 
class AllocationFailureException : public Exception { 
public: 
    AllocationFailureException() { 
     this->text = "\nERR: An unsuccessful attempt was made to allocate dynamic memory!"; 
     code = 3; 
    } 
}; 

В моей голове все выглядело очень аккуратно, но теперь это как-то не похоже на хороший пример ООП. Хотя я и думал об этом, мне пришло в голову, что я могу как-то использовать статические члены, например, сделать int code; статической переменной, характерной для наследующих классов. Или я мог бы сделать метод void generate(); чистой виртуальной функцией с = 0, что было моей первой идеей.

Мой вопрос: Можно ли сделать это решение лучшим примером ООП и/или я пропущу общую точку OOD?

+1

Это, вероятно, принадлежит на [Просмотр Кода] (http://codereview.stackexchange.com/). – 0x499602D2

+1

Дайте вашему классу 'Exception' (возможно,' protected') конструктор, который получает значения для 'text' и' code'. Затем вызовите конструктор через список инициализаторов в производных классах. – 0x499602D2

ответ

2

Ниже приведен пример, который уменьшает объект след и перемещает выделение памяти от пункта броска:

class Exception { 
protected: 
    short code; 
    const string &text; 
    Exception(short code, const string &text) : 
    code(code), text(text) 
    {} 
... 
} 

class IndexOutOfBoundsException : public Exception { 
private: 
    static const string c_text = "\nERR: An unsuccessful attempt was made to access the index outside the bounds of the array!"; 
public: 
    IndexOutOfBoundsException() : Exception(1, c_text) 
    { } 
}; 
Смежные вопросы