C++相談室 part38

このエントリーをはてなブックマークに追加
952デフォルトの名無しさん:05/01/22 18:08:48
class BASE{
public:
  virtual void out(int n = 0){ 〜; }
  virtual void out(void){ 〜; }
};

class A1 : public BASE{
public:
  void out(void){ 〜; }
};

int main()
{
  A1 a;
  a.out();
  a.out(2);  // ←コンパイルエラー

  return 0;
}


これってなんでコンパイル通んないんでしょう?
MSVC .NET使ってます。
953デフォルトの名無しさん:05/01/22 18:13:29
>>952
通らない。
http://www.fides.dti.ne.jp/%7Eoka-t/cpplab-hide-overload.html

あと、引数のない関数を定義するのに void って書くの気持ち悪いからやめれ。
あと、デフォルト引数とオーバーロードを一緒に使うのやめれ。
954デフォルトの名無しさん:05/01/22 18:14:27
out(void)がBASE::(int)を隠しているから
隠すなら private に明示的に using する
隠したくないなら public に using する
はっきり汁!
955デフォルトの名無しさん:05/01/22 18:18:42
>>952
名前解決の順序が、引数型によらず

1. まず最も内側のスコープ内 (この場合だと A クラス内部) で探す
2. 見つからなかったら、一つ外のスコープ (この場合だと BASE) で探す

でリストアップしてきて、その中から引数型が合うものを選択するため。
そうなってる理由はともかく a.out(2) で BASE::out(int)を呼び出したければ
class A1 の定義中で using BASE::out; しとけば OK。

あと BASE::out() は BASE::out(int n = 0) と BASE::out(void) どちらを呼んで
欲しいのか意図が謎。なおした方が良いと思うぞ。
956デフォルトの名無しさん:05/01/22 18:27:19
>あと、引数のない関数を定義するのに void って書くの気持ち悪いからやめれ。
エー
957952:05/01/22 18:36:27
>>953-955
ほんとありがとうございます。よーく分かりました。

>デフォ引数
色々実験してる内に付けてしまったもので、投稿前に消し忘れてました。スマソ
あいまいになる!って突っ込まれるなあと思ってました。。。
何はともあれ、明快な解答ありがとうございました!
958デフォルトの名無しさん:05/01/22 18:52:39
>>956
エー、じゃない。おまいはCプログラマか。
959デフォルトの名無しさん:05/01/22 19:07:38
extern "C" のときは書いてる >(void)
960デフォルトの名無しさん:05/01/22 20:28:54
>>950
そんなあなたにboost::thread
961デフォルトの名無しさん:05/01/22 20:33:36
>>960
使ってるけど全然だめぽ
おとなしく言語仕様に取り入れてほしい

でも時期標準のリストにはスレッドのスの字も無かったっけ…orz
962デフォルトの名無しさん:05/01/22 20:36:29
極力機種依存を避けてる以上無理だろねぇ
963デフォルトの名無しさん:05/01/22 21:02:10
実装レベルをいくつかに分けるとか、
モジュールに分けたりとかして、
実装がサポートする範囲を選べるようにできないかなぁ……

やっぱ無理かなぁ……
964デフォルトの名無しさん:05/01/22 21:07:43
せめて synchronized, wait, notify, notifyAll, join だけでもサポートして欲しい
965デフォルトの名無しさん:05/01/22 21:09:52
おとなしくjava使えよハゲの下僕ども
966デフォルトの名無しさん:05/01/22 21:13:41
>>961
何がダメなん?
967デフォルトの名無しさん:05/01/22 22:12:58
>>961
無理だろうな。D&E でも Bjarne が「並列処理を必要とするアプリケーションは
多いが、そのための唯一の支配的な方式はない」と断言してる。

C++ の用途は数値計算からオフィススイート、データベースエンジン、OS、
ゲームまで幅広い。特定のプログラミングスタイルや、目的に特化した機能は
現状の C++ の利点を殺すことになるから、まず入らん。
968デフォルトの名無しさん:05/01/22 23:04:09
>>963
実装レベルを分けるってのはいいね。
EC++の逆ね。やって欲しいな。
969デフォルトの名無しさん:05/01/23 00:33:47
質問なんですけど、

class MyString {
string *pstr;
public:
MyString(const MyString ©) {
pstr = new string;
*pstr = *copy.pstr; // ←この部分
}
string *GetString() const { return pstr; }
}

*pstr = *copy.pstr;
この記述はなんでコンパイルエラーにならないんですか?
*pstr = *copy.GetString();
じゃなきゃだめだと思うんですが。
ちなみにコンパイラは BCC5.5 です。
970デフォルトの名無しさん:05/01/23 00:37:14
>>969
クラスの定義内では自分自身と同じ型の変数はprivateでも丸見えだよ。
971デフォルトの名無しさん:05/01/23 00:40:15
C++的にOKだからココンパイルエラーにならないんだよ坊や
972デフォルトの名無しさん:05/01/23 00:50:09
落ち着け坊や
973969:05/01/23 00:54:17
( ・∀・)つ〃∩ ヘェー
どうもありがとうございました
974デフォルトの名無しさん:05/01/23 00:54:36
privateの仕様:
「メンバへのアクセスが制限され、
そのクラスのメンバ関数とフレンド以外はアクセスできなくなる。」


【クラス】とは書かれているが、【インスタンス】とは書かれていない。
詐欺的表現にも見えるが、所詮、騙される方が悪い。
975デフォルトの名無しさん:05/01/23 01:00:06
なぜ C++ は以下のように浮動乗数点数の定数を定義できない仕様にしたのでしょうか?
struct X {
static const int i = 100; // OK
static const float pi = 3.1416f; // error
};
976デフォルトの名無しさん:05/01/23 01:02:44
むしろprotectedのときに引っかかるんだな。
基底クラスのprotectedメンバに触れるのは
自分自身と同じ型を参照しているときだけってのに
気が付かないで基底グラス型を参照しながら、
「protectedメンバに触れねぇぞ、なんじゃこらぁ!」
977デフォルトの名無しさん:05/01/23 01:13:02
>>975
質問がおかしい。static constな整数型のみクラスボディで初期化可能なのであって、
それ以外の静的データメンバはクラスボディの外側で初期化しなければならない。

だからstatic const intが特別な例外なのだ。
978デフォルトの名無しさん:05/01/23 01:17:50
>>975
「なぜ Bjarne は」もしくは「なぜ WG21 は」じゃないか?
979デフォルトの名無しさん:05/01/23 01:26:15
昔はFPUがなかったりして浮動小数点の処理がいちいち関数だったりしたからじゃないか?
980デフォルトの名無しさん:05/01/23 01:32:49
不動小数点数がコンパイル時定数である必要性が無いからかな

struct X {
static const int i = 100; // OK
static const float pi;
};

const float X::pi = 3.14f; //OK

これでいいだろ。:
981デフォルトの名無しさん:05/01/23 02:11:05
>>980
ヘッダで定義できないのは嫌じゃないか?
982デフォルトの名無しさん:05/01/23 02:19:20
ヘッダとでバラバラに書くのが鬱陶しいよな
C++ FAQ ではヘッダに書けるもんはヘッダに書けばいいって書いてたけど
983デフォルトの名無しさん:05/01/23 02:59:33
float pi() {return 3.1416f;}
984デフォルトの名無しさん:05/01/23 03:02:24
>>981
定数を返す関数を淫乱にすればいい
985デフォルトの名無しさん:05/01/23 03:02:33
数値を見てそれと分かるんだから
#define PI 3.1415f
986デフォルトの名無しさん:05/01/23 03:06:54
>>985
float 限定やだ
それがたとえ long double 限定でも同じこと
987sage:05/01/23 03:39:32
Task.hで
class Task{
...
}

Task.cppで定義する
んでもって
Enemy.hで
#include "Task.h"
  class Enemy:public Task{←ここでエラー
...
}

"型名が必要" とエラーになってしまします。
どういうことでしょうか?ご助力お願いします。
BccとBccdev使ってます。
988デフォルトの名無しさん:05/01/23 03:43:36
>>987
class Task {
...
}; ←このセミコロンを忘れているというオチじゃないよね?
989デフォルトの名無しさん:05/01/23 03:44:17
そろそろ次スレの季節なの?
990987:05/01/23 03:53:40
すいません、大丈夫です・・・
書くの忘れてました
991デフォルトの名無しさん:05/01/23 04:20:57
>>990
俺の所ではエラーでないぞ。ソース全部晒してみろ。
992デフォルトの名無しさん:05/01/23 05:05:18
次スレのタイトルはスレが乱立しないように
C++相談室(STL含む) part39
でよろしく
993デフォルトの名無しさん:05/01/23 10:07:20
>>975
enumとの互換性を保つ為に、クラスボディで整数型のみ初期化可能にした
994デフォルトの名無しさん:05/01/23 10:33:05
C++相談室(STL,template含む) part39
995デフォルトの名無しさん:05/01/23 10:40:25
STLつかうと一気に実行ファイルサイズが10倍に?!
996デフォルトの名無しさん:05/01/23 10:44:32
>>992
STL含むって言うけどさ>>1
「テンプレートライブラリ(STL含む)に関する質問は専用の別スレにお願いッス。」
って書いてあるのはどうする?

templateスレの次スレのスレタイにSTLを入れてもらう方がいいんじゃないか?
997デフォルトの名無しさん:05/01/23 11:05:55
そのうち関数スレとかクラススレとか・・・・ もうアフォかとヴァカかと
998デフォルトの名無しさん:05/01/23 13:17:23
>>997
はぁ?お前が馬鹿でアホだろ。C++より長いCでもそんなスレできてねーだろタコ。




と煽ったからって自分で糞すれ立てたりするなよ。馬鹿は困るねぇ。
999デフォルトの名無しさん:05/01/23 13:18:34
999
1000デフォルトの名無しさん:05/01/23 13:19:12
rubyyyyyyyyyyyyyyyyyyyy!!!!!!!!!!!
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。