Я не знаю ваш более крупный дизайн, но, как правило, перегруженные операторы никогда не должны иметь сбоев во время выполнения (например, "=", "*" и т. Д. Никогда не должны вызывать исключения). Это потому, что пользователи ожидают, что они будут действовать как +, - и т. Д. для номеров.
Подумайте, как пользователь собирается это называть. Похоже, вы хотите, чтобы они имели что-то вроде:
NNMatrix<int> matrixA; // Obviously with real assignments...
NNMatrix<int> matrixB;
matrixA *= matrixB;
Теперь, если вам действительно нужно поддерживать матрицы, размеры которых установлены во время выполнения, у вас будут операции сложения, вычитания и умножения, которые могут завершиться неудачей. Лично я не стал бы перегружать фактические операторы , +, -, = и т. Д. Для такого объекта, потому что вы можете только сообщить об ошибке с исключением.
Подумай об этом. Вы требуете, чтобы у пользователя было что-то подобное для обеспечения безопасности при КАЖДОМ вызове ваших матричных операторов:
try {
matrixA *= matrixB;
}
catch(bad_alloc& ba) {
// Handle runtime error
}
Теперь, каковы шансы, что кто-то собирается обернуть каждый из ваших вызовов в try-catch? Даже если они это сделают, это не чище, чем альтернатива, которая использует обычную функцию-член, такую как:
bool NNMatrix<T>::MultiplyBy(const NNMatrix<T>& other);
Если вы вернете false и не сделаете умножение при несовпадении размеров, вы получите то же поведение, что и раньше. Теперь звонящему нужно только что-то вроде:
if(!matrixA.MultiplyBy(matrixB)) {
// Handle runtime error
}
Это лучше, потому что это никогда не вызовет сбой, если они забудут проверить возврат. Из общедоступного API очевидно, что пользователям необходимо проверять наличие ошибок и что операция либо полностью завершается, либо завершается неудачей. По общему признанию это все еще не симпатично, и пользователь не получит то, что он ожидает, если у него нет логики 'if ()', но по крайней мере он был предупрежден. Насколько я знаю, это лучшее, что вы можете сделать, если вам действительно нужно поддерживать матрицы с неизвестным количеством строк и столбцов во время компиляции.