12/01/06 20:41:49.47
①
bool Load()
{
return false;
}
②
void Load()
{
new throw Exception()
}
関数のエラーをboolかthrowどっちで検知すればいいのだろうか
263:デフォルトの名無しさん
12/01/06 20:44:12.88
1
264:デフォルトの名無しさん
12/01/06 20:48:23.09
正解: optional
265:デフォルトの名無しさん
12/01/06 20:55:09.37
>>241
C++11からは、一様な初期化構文を使って、デフォルトコンストラクタ呼び出しを明示できるよ
URLリンク(d.hatena.ne.jp)
X x; // ok
X x(); // error
X x{}; // ok (C++11)
266:デフォルトの名無しさん
12/01/06 20:57:37.01
X x {} って気色悪いな
267:デフォルトの名無しさん
12/01/06 20:58:50.74
C#ではよくある事。
268:デフォルトの名無しさん
12/01/06 21:17:49.32
class IHoge {
public:
virtual ~IHoge(void) { }
virtual void Method(void) = 0;
};
class HogeBase : public IHoge {
public:
void Method(void) { }
};
class HogeEx : public HogeBase { };
こうやっていちいち分けるのが流行ってるのはなんで?
どうせポリモーフィックなクラスはほぼ全てがHogeBaseを継承するんだし
class HogeBase {
public:
virtual ~HogeBase(void) { }
virtual void Method(void) { }
};
class HogeEx : public HogeBase { };
でいいじゃないですか?
269:デフォルトの名無しさん
12/01/06 21:30:19.69
>>268
IHogeって事はCOMか?COMは実体を持てないからな。
それは別として、最上位に完全抽象化クラスを置いとくのは、
HogeBaseの全てをオーバーライドするクラスを作ったとき、
HogeBaseの実装がデッドウエイト(容量食うだけのゴミ)になるから。
270:デフォルトの名無しさん
12/01/06 21:32:37.36
>>262
Function( source.Load() ); // Loadはsourceから読み出した情報を返す
こういうコードを書こうとしたとき、どっちを取るべきが正しいか考えろ。
271:デフォルトの名無しさん
12/01/06 21:39:14.50
>>269
なるほど
272:デフォルトの名無しさん
12/01/06 21:48:34.28
>>262
Loadが失敗する状況がふつうにありえそうなら1。
(プログラムの実行自体が怪しくなるような)ハードやOSの異常による状況でしか失敗しないようなら2。
273:デフォルトの名無しさん
12/01/06 21:51:30.44
bool Load(...) {
// ファイルフォーマットエラーなど
return false;
// ハードウェアエラーなど
throw unko();
// 成功
return true;
}
これで決まりや
274:デフォルトの名無しさん
12/01/06 22:01:26.36
東京にある6つのキー局の内、製作から財務まで一貫して朝鮮人が行ってるテレビ局が1つ
中国共産党から毎年大量の反日工作費が流れているテレビ局が2つ
もろに北朝鮮と繋がっているテレビ局が1つ
年寄はまだまだテレビという外国人に騙され続ける
275:デフォルトの名無しさん
12/01/06 22:03:02.69
例外とはまさしく例外であり必ずキャッチされなければプログラムを終了するしかないものに対して使うのがいいだろう。
一方、返却値は返却値。失敗してもいかなるリソースの破壊、開放忘れも発生しない場合に使える。
276:デフォルトの名無しさん
12/01/06 22:05:46.18
事前に書いたフローチャートに書いてないことは例外
277:デフォルトの名無しさん
12/01/06 22:07:59.24
例外ってフローチャートに書いてないの?
278:デフォルトの名無しさん
12/01/06 22:13:05.48
普通は書かない
書いてあるならどんなエラーでも想定の範囲内だから例外ではなく返り値などで判断
279:デフォルトの名無しさん
12/01/06 23:42:39.91
二重キャストって意味あるんだね
はまって痛い目見たよ
こんなん
template<class T> struct Base {
Base(){ unko = reinterpret_cast<__int64>(this); }
void OK(){ T *t = static_cast<T *>(reinterpret_cast<Base<T> *>(unko); }
void NG(){ T *t = reinterpret_cast<T *>(unko); }
__int64 unko;
};
struct Derived : Base<Derived> {};
int main()
{
Derived d;
}
280:デフォルトの名無しさん
12/01/07 00:19:45.06
void NG(){ T *t = reinterpret_cast<Base<T> *>(unko); } これだけで十分そうだが?
reinterpret_castで直接reinterpret_cast<T*>してんのが引っかかっただけじゃないの?
void*的なものに突っ込んだ時は、突っ込む前の型と全く同じ型じゃないと、
オフセットが違うから位置がずれて異常が起きる。
281:デフォルトの名無しさん
12/01/07 00:54:17.62
>>280
>void*的なものに突っ込んだ時は、突っ込む前の型と全く同じ型じゃないと、
>オフセットが違うから位置がずれて異常が起きる。
ありがとう、目から鱗だわ
ポインタ値とアドレス値は同じものだと思ってたけど違うのか
282:デフォルトの名無しさん
12/01/07 01:39:13.10
>>245
廃止ってのはexportみたいなのを言うんだ