2015-10-21 2 views
1

Привет, Я сейчас пишу манипуляцию с обработкой программ, и я борюсь с проблемой обработки ошибок в функции-члене.Функция класса, возвращающая недопустимый lvalue

Учитывая функцию

double & MATRIX::elements(int i, int j) const; 

это функция, которая может возвращать ссылку обратно, так что эта функция может быть -значение, например,

object.elements(1,2)= 2; // I can change the value matrix element (1,2) to be 2 

Я предполагаю, что некоторые люди могут войти в индекс матрицы Неправильно (i.e.invalid значение I и J), что элемент (I, J) не существует. Поэтому я пишу оператор if-else, однако мне интересно, что я должен вернуть, когда найдены недопустимые значения i и j? Могу ли я предотвратить функцию от возврата чего-либо, например, такие ситуации, как

object.elements(100,100000)= 2; // where the matrix size is only 3x3 

не так ли?

P.S. Я храню матричные элементы в динамическом массиве, когда я создаю объект

+2

исключение? – NathanOliver

+3

Похоже, что функция-член не должна быть 'const'. – juanchopanza

+0

@NathanOliver как выбросить исключение ??? Я не могу найти способ правильно вернуться ... – jackycflau

ответ

2

Есть три практические возможностей:

  • assert Предпосылки, и полагаться на тестировании, чтобы искоренить все недействительные вызовы или
  • броска исключение, если предварительное условие неверно, или
  • возвращает легко распознанное значение ошибки.

В старые времена также включались такие схемы, как вызов функции, предоставляемой пользователем, но на самом деле, что бы она могла сделать, кроме как прекратить или выбросить исключение.

Третья возможность, возвращающая известное как значение ошибки, может показаться непригодной для вашего нынешнего затруднительного положения, которое идеально вернет double&, который будет немедленно использован. Но в целом это правильный вариант. Например, он может быть реализован как Boost optional.


Проходя мимо, некоторые общие рекомендации.

Для данного кода,

double & MATRIX::elements(int i, int j) const; 

обычно метод const не предоставляет доступ для чтения/записи, то поражения цели. Однако существуют исключения, например, для прокси-объекта. Но на третьей и захватывающей руке вышеупомянутый код не для таких объектов.

Также рассмотрите вопрос о резервировании всех идентификаторов UPPERCASE для макросов. Таким образом, вы можете избежать конфликтов имен. Помните, что макросы не учитывают области видимости, и поскольку многие люди используют все идентификаторы верхнего регистра для макросов, в то время как мало кто делает это, вероятность столкновения, приводящая к нежелательной замене текста, больше в верхнем регистре, используемом для обычных идентификаторов.

Смежные вопросы