ゾンビオブジェクトを処理する必要がないように、コンストラクターで例外をスローしたいと思います。しかし、私はまた、人々が理由のない「例外を扱う」ことを避けることができるように、事前に検証方法を提供したいと思います。GUIでは、無効なデータを予期することも例外ではありません。ただし、コードの重複やオーバーヘッドも避けたいと思います。GCC / Microsoft Visual C ++コンパイラは、入力を2回検証するというこの非効率性を取り除くのに十分スマートですか?そうでない場合は、微妙な変更がありますか?
私のポイントを示すサンプルコードブロックは以下のとおりです。
#include <string>
#include <exception>
#include <iostream>
using std::string;
using std::cout;
using std::endl;
using std::exception;
// a validation function
bool InputIsValid(const string& input) {
return (input == "hello");
}
// a class that uses the validation code in a constructor
class MyObject {
public:
MyObject(string input) {
if (!InputIsValid(input)) //since all instances of input
throw exception(); //has already been validated
//does this code incur an overhead
//or get optimised out?
cout << input << endl;
};
};
int main() {
const string valid = "hello";
if (InputIsValid(valid)) {
MyObject obj_one(valid);
MyObject obj_two(valid);
}
return 0;
}
クラスのオブジェクトファイルが単独で生成された場合、コンストラクターを呼び出す前にユーザーが検証することを保証する方法がないため、これはおそらくあり得ないと思いますが、アプリケーションがコンパイルされ、単一のアプリケーションにリンクされている場合はそうですか?可能ですか?