07/07/11 01:01:54
どなたかC++に詳しい方、教えてください。今日、はまりました。
以下ClassAに、オーバロードしたfunc()という関数が2つがあるとします。
ClassAを継承したClassBをnewし、classb->func(NUM_2);をコールすると、期待通りに
ClassA::func(NUM)がコールされるのですが、(1)だけオーバライドしたClassCを
newし、classc->func(NUM_2);をコールするとClassC::func(int, NUM)がコールされて
しまいます。
期待した動作はClassA::func(NUM)がコールされる事でした。
これはC++の仕様なのでしょうか。コンパイラがどういう論理でenumを使用した関数の
オーバライド/オーバロードを解決しているのかご存知の方、ご教示お願いします。
enum NUM { NUM_1, NUM_2, NUM_3 };
class ClassA {
virtual int func(int a, NUM b = NUM_1); // ←(1)
virtual int func(NUM a = NUM_1); // ←(2)
};
class ClassB : public ClassA
{
// ClassAの(1),(2)はオーバライドしていないクラス
};
class ClassC : public ClassA
{
// ClassAの(1)だけをオーバライド
int func(int a, NUM b = NUM_1);
};
737:デフォルトの名無しさん
07/07/11 01:03:17
つURLリンク(www.fides.dti.ne.jp)
738:デフォルトの名無しさん
07/07/11 01:06:12
呼び出し側のコードはどうなってんの
739:デフォルトの名無しさん
07/07/11 01:12:08
NUMばっか出てきてとか見づれーんだよ。もっと考えて書けよドカスが
>classc->func(NUM_2);をコールするとClassC::func(int, NUM)
理由は>>737だ
ClassCでfunc(int,NUM)を宣言しちゃったから、ClassAのfunc(int,NUM)が見えなくなってる。
あとvirtualな関数にデフォルトパラメータつけるな
740:デフォルトの名無しさん
07/07/11 01:58:14
>>737
>>738
>>739
見づらくてすいません。
C++にそんな仕様があるとは知りませんでした。
ありがとうございました。
参考までに
>あとvirtualな関数にデフォルトパラメータつけるな
は何故でしょうか?
741:デフォルトの名無しさん
07/07/11 02:10:29
デフォルトパラメータは静的な型に依存する
class B{
virtual void foo(int a=300){std::cout << a;}
}
class D{
void foo(int a=100){std::cout << a;}
}
B* pb = new D();
pb->foo(); //300と表示される
D* pd = new D();
pd->(foo); //100と表示される
だった筈
742:デフォルトの名無しさん
07/07/11 02:11:50
>>741
> pd->(foo);
モチツケ
743:デフォルトの名無しさん
07/07/11 02:24:20
>>741
なるほど。納得しました。
ありがとうございます。
744:デフォルトの名無しさん
07/07/11 10:08:49
>>188
PHPアプリとCアプリとログ出力先を共通化という
無茶な事を要求されているときも
行単位の一発書き込みなら大丈夫かな?
2プロセス立ち上げてそれぞれ適当に書き込みをさせて
100万回くらいテストしたんだけど これで混ざんなかったから
多分大丈夫だよね?
745:デフォルトの名無しさん
07/07/11 10:52:14
>>744
「行単位の一発書き込み」がシステムコールレベルでそうなっているなら大丈夫。
具体的には、(直接的または間接的に)O_APPENDでopen()されており、write()
一発で1行を書き込んでいるなら大丈夫。
それから少しでもズレるならダメ。
Win32の場合、O_APPENDに相当する機能がCreateFile()に存在しないので、
*必ず*排他が必須になるようだ。
746:デフォルトの名無しさん
07/07/11 14:55:19
質問失礼します。
シャノンの符号化法による符号語生成プログラムと、
表計算ソフトを用いた符号語生成の違いについて説明して頂けないでしょうか?
よろしくお願いします。
747:デフォルトの名無しさん
07/07/11 16:23:30
>>746
表計算ソフトを用いた符号語生成って、何のことか教えて。
748:デフォルトの名無しさん
07/07/11 21:59:26
>>743
ちなみに741の問題を回避するためにもNVIパターンが使えるぞ。
749:デフォルトの名無しさん
07/07/12 08:23:23
すみません
string型でファイル名を持っているとき、それをオープンしようとすると
エラーが出ます。char型にするにはどうすれば良いですか?
750:749
07/07/12 08:26:48
自己解決しました
751:デフォルトの名無しさん
07/07/12 08:26:59
つc_str()
752:デフォルトの名無しさん
07/07/12 08:27:49
ありがとうございました
753:デフォルトの名無しさん
07/07/12 08:51:04
ファイルを読み込むとき、終端で必要以上のサイズを
読み込むと配列が最後まで埋まってしまいます
どうすれば実データのみ読めますか??
fp.read(str,N); とすると strのサイズはNになります
754:デフォルトの名無しさん
07/07/12 08:58:00
何使って読み込んでるの? fp の型は?
755:デフォルトの名無しさん
07/07/12 09:04:02
fstream fp ("filename", ios::in | ios::binary );
なんですけど、fp.read(str,N); の戻り値は、istream 型です
どうすればサイズがわかりますか??
756:755
07/07/12 09:24:03
自己解決しました
fp.gcount();で読み込みサイズが出ました