■過去ログ置き場に戻る■ 1- 前250 次250 最新50


[memo] "9999999999_00.html#R20" という感じで、URLの最後に "#RレスNo" を追加すると幸せになれます。

C++相談室 part50
251 名前:243 == 248 :2006/06/14(水) 14:31:50
間違えましたOrz

252 名前:デフォルトの名無しさん :2006/06/14(水) 15:56:02
みんなすげーな、おれわけわからん。

253 名前:デフォルトの名無しさん :2006/06/14(水) 17:13:13
>>247
friendとtemplateは、
規格票の14.5.3.1-10の例を眺めておいた方がいいと思う。
規格票の例はすごくいけてる。悩んだときは一読お奨め。

といってもJISのは高いが。
http://www.webstore.jsa.or.jp/webstore/Com/FlowControl.jsp?lang=jp&bunsyoId=JIS+X+3014%3A2003&dantaiCd=JIS&status=1&pageNo=1




254 名前:デフォルトの名無しさん :2006/06/14(水) 17:22:55
>>253
眺めるだけなら無料のPDFも悪くないと思うよ。
http://www.jisc.go.jp/
JIS検索→規格番号 X3014

255 名前:デフォルトの名無しさん :2006/06/14(水) 18:06:18
自動生成されるcopy constructorって、
memberのcopyにはoperator=が使われるんですか?
それとも、copy constructorが使われるんですか?

256 名前:デフォルトの名無しさん :2006/06/14(水) 18:26:58
>>255
コピーコンストラクタに決まっているだろ。

257 名前:デフォルトの名無しさん :2006/06/14(水) 18:47:01
>>255
operator=を定義しておけば自動生成のコピーコンストラクタで使ってくれるのか、という問いなら、
「そんな気の利いたことはやってくれない」が答えだな

258 名前:255 :2006/06/14(水) 19:20:23
>>256-257
あざっす

259 名前:デフォルトの名無しさん :2006/06/15(木) 04:50:05
相談させてください。

class base {
virtual base* this_p(void) = 0;
};

class derived : public base {
derived* this_p(void) { cout << "derived called" << endl; return this; }
};

class derived2 : public derived {
int value;
derived2* this_p(void) { cout << "derived2 called" << endl; return this; }
};

で、

base* p = new derived2;
p->this_p(); // これは"derived2 called"を出力
p->this_p()->value; // これはエラー

となる理由を教えてください・・・。


260 名前:デフォルトの名無しさん :2006/06/15(木) 05:02:50
>>259
derived::this_p()にvirtualを付けないと、それ以上探してくれない。

261 名前:259 :2006/06/15(木) 05:21:37
>>260
ゴメンなさい。259のコードはvirtualが抜けてました。
derived* this_p(void)にvirtual付けても結果は同じであります('A`)


262 名前:デフォルトの名無しさん :2006/06/15(木) 05:37:46
pがderived2*じゃなくてbase*だから。

263 名前:デフォルトの名無しさん :2006/06/15(木) 05:39:23
RTTIというのは、文字通り実行時に働くからじゃないのかな。
pの型は、class base *なわけで、これにはとvalueはない。
たとえばこんなコードだったら

void f( base & p )
{
  std::cout << p->this_p()->value ;
}

int main()
{
  derived d ;
  //dにはvalueがない
  f( d ) ;
}

C++

264 名前:デフォルトの名無しさん :2006/06/15(木) 05:58:24
間違えた。

p.this_p()->value

メンバ変数のアクセスへRTTIは働かないから、
こういう使い方は間違いなのではないかと思う。

265 名前:243 :2006/06/15(木) 06:33:38
あれから考えていたのですが、Barton and Nackman Trickも捨てがたいです。
前方宣言も必要ないし。
多少面倒でも、>>244のようにすべきなのでしょうか。

template < int X >
class Foo
{
  //Barton and Nackman Trick
  friend std::ostream & operator << ( std::ostream & out, Foo<X> const & val )
  {
    val.print(out) ;
    return out ;
  }

//こっちは厳密に言うとBarton and Nackman Trickじゃないかもしれないけど、よりジェネリックに。
/*********
* template < typename CharType >
* friend std::basic_ostream<CharType> & operator << ( std::basic_ostream<CharType>, Foo<X> const & val) ;
* { val.print(out) ; return out ;}
*************************/

private :
  //実際の出力は、このメンバ関数が行う。
  void print( std::ostream & out ) const { out << "private!" ; };
} ;

266 名前:デフォルトの名無しさん :2006/06/15(木) 10:37:32
>>265
俺もこのやり方の方が好きだな。

267 名前:デフォルトの名無しさん :2006/06/15(木) 11:04:38
>>265
そっちだと ADL でしか見つからないことになる。それで問題なければそっちでいい。
ダメなケースを探してみたけど、あんまり思い当たらない。おおかた問題無いと思うよ。

268 名前:259 :2006/06/15(木) 11:17:25
>>264
> メンバ変数のアクセスへRTTIは働かないから、

納得しました。
どうもありがとう〜。


269 名前:243 :2006/06/15(木) 12:21:12
>>267
ADLでしか解決できないのは知っていますが、
演算子のオーバーロード、特にストリーム入出力のためのシフト演算子に対して、
ADL経由でない使い方というのが思い浮かばなかったので、
特に問題ないだろうと思っています。

しかし、なぜNontype Template Parameterのときだけ曖昧になるのか理解できず。


270 名前:デフォルトの名無しさん :2006/06/15(木) 12:36:57
ちなみにvirtual methodはRTTI抜きでも働くから
その辺誤解のないように。

そう言う意味では、>>264のレスはおかしい。

271 名前:デフォルトの名無しさん :2006/06/15(木) 12:44:18
>>269
g++では問題なくコンパイルが出来るから、VCのバグかね

272 名前:デフォルトの名無しさん :2006/06/15(木) 13:12:23
>>269
つ friend std::ostream & ::operator << ( std::ostream & out, Foo const & val ) ;
「<>」と「::」のことか?

273 名前:272 :2006/06/15(木) 13:47:05
ごめん、勘違いしていた。

結論はnontype template parameterの時はADLがうまく働かないだけ

274 名前:243 :2006/06/15(木) 13:53:45
すると、VC8のバグであると認識していいのでしょうか。
だからといって、どうしようもないのですが。
結局、workaroundということで対処するしかないのかな。

275 名前:デフォルトの名無しさん :2006/06/15(木) 14:56:17
規格上はnon-type駄目ってことはないみたい。

276 名前:デフォルトの名無しさん :2006/06/15(木) 16:36:37
class MyClass {
private:
OtherClass* mP;
public:
SetP(OtherClass* p) { mP = p;]
};

みたいにメンバーにポインタを渡したい場合、
OtherClass* p = new OtherClass;
SetP(p);
delete p;
のように外でdeleteされてしまうと困るときってあると思うんですが、
pが外でdeleteされない、もしくはdeleteされても対処出来るようにするには、
どういう風にすればいいんでしょうか。

277 名前:デフォルトの名無しさん :2006/06/15(木) 17:17:43
ポインタを使っている以上諦めるしかない。

278 名前:デフォルトの名無しさん :2006/06/15(木) 17:18:29
>>276
OtherClassのコピーではだめ?

同じOtherClassの「あるオブジェクト」を参照したいのだったら、
スマートポインタ的なことをしたほうがいいかと

279 名前:デフォルトの名無しさん :2006/06/15(木) 17:19:19
>>276
MyClassの中でも外でも一貫してboost::shared_ptrを使え。
場合によってはstd::auto_ptrで十分かもしれないが。

280 名前:276 :2006/06/15(木) 18:04:11
>>277-279
ありがとうございます。
自分の場合でどれがいいかを検討してみます。

>>276
実はOtherClassは固有の名前をcharで持っていて、
単純にコピーすると名前もコピーされて重複するのが嫌なので、
ポインタで渡す事を考えていました。
コピー後に名前を変更するのを手動でするのも面倒だし、
だからと言って関数内に記述して自動で名前が変えられてしまうのも気持ち悪いしと思って。
そういう場合は、やはりポインタで渡してやって、
固有の名前を必ず持つようにしておくもんでしょうか?

281 名前:276 :2006/06/15(木) 18:05:09
×実はOtherClassは固有の名前をcharで持っていて
○実はOtherClassのインスタンスは固有の名前をcharで持っていて


282 名前:デフォルトの名無しさん :2006/06/16(金) 00:02:36
>>280-281
> 実はOtherClassは固有の名前をcharで持っていて、
ここ以下さっぱり意味がわからん。

283 名前:デフォルトの名無しさん :2006/06/16(金) 00:06:12
よくわからんが
名前をコピーしないコピーコンストラクタなりを書けばいいんじゃね?

284 名前:デフォルトの名無しさん :2006/06/16(金) 00:10:23
VC++6.0使ってるんですけどDIRECTXSDKのバージョンによっては(最新?)
SDKが使えないようなことをどっかで見たようなきがするんですけど
最新のやつでも問題ないですか?MSのページ見たけどよくわからん

285 名前:デフォルトの名無しさん :2006/06/16(金) 00:13:10
>>284
すれ違い。 DirectX でスレタイ検索しろ。

286 名前:284 :2006/06/16(金) 02:05:03
わかりましたー

287 名前:デフォルトの名無しさん :2006/06/17(土) 19:34:03
C++の言語仕様はいくらかマスターしてきたように感じます(60%くらい?)

しかし、標準ライブラリがまだまったく勉強できていません。(Cの標準ライブラリは一応ひととおり勉強しました)

C++標準ライブラリについて勉強できる良質なサイトや標準ライブラリのリファレンス的なサイトを紹介して下さい。

MSDNライブラリCDを持っていますが、これは一応Visual Studio.NET用文書中に標準ライブラリの部分もあるのですが、かなりおざなりです。(C標準ライブラリの方も・・・)
ARMには何も載ってないし・・・

288 名前:デフォルトの名無しさん :2006/06/17(土) 19:35:47
>>287
本買ったほうがいいよ。マジで。

289 名前:デフォルトの名無しさん :2006/06/17(土) 21:06:51
日本語のリファレンスなら俺はここを使っている。
Microsoftのはドラフトを基にしているらしいが大体問題なく使える。
http://www.wakhok.ac.jp/~sumi/stl/
http://www.microsoft.com/japan/developer/library/vclang/stdlbhm.htm
あとは、関数名が見たいだけとか引数を確かめたいとかそういうときはMSDNライブラリも使う。

290 名前:デフォルトの名無しさん :2006/06/17(土) 21:29:36
ttp://www.scl.kyoto-u.ac.jp/scl/appli/appli_manual/SUNWspro/WS6U2/ja/manuals/stdlib/user_guide/loc_io/index.htm

他にも何箇所か転がってるが。ロケール周りとかの貴重な日本語ドキュメントが読める。
いや、公開してちゃマズいだろって気はするが。

291 名前:デフォルトの名無しさん :2006/06/17(土) 22:03:51
半日例外について学んでいたのですが、結局C++では、
stlのexceptionだけ無難に使っておけばOKみたいな感じなんでしょうか

と、わざとアホっぽく書きましたが、いや実装よりの話となると、どれも(どこも)曖昧で…

292 名前:デフォルトの名無しさん :2006/06/17(土) 22:08:54
>>291
作るものによるが、レイヤーがはっきりしている様な場合(例えばフレームワークとビジネスロジックとか)は、
ちゃんと例外クラスを作って、誰がどのレイヤーの例外をキャッチするかなどを決めておかなと、
困ったことになるかもねー。

293 名前:デフォルトの名無しさん :2006/06/17(土) 22:10:27
もちょっと書くと、通信クラスの例外がアプリケーション層まであがってきても困ったりする。
そんな感じかな。

294 名前:291 :2006/06/17(土) 22:29:20
>>292-293
レスありがとうございます

今までentityの例外は、boundaryやcontrollerが処理する(entityはエラーとか気にしない)みたいな意識でした。
つまりentityの例外はentityで処理しろ、みたいな認識で良いのでしょうか。

それなら狭い範囲で収まるわけで、独自の例外クラスが多くても混乱無さそうですね。

295 名前:デフォルトの名無しさん :2006/06/17(土) 22:45:17
はい、そんな感じです。
基本は、受け取っても処理できない場所まで例外を上げるな、です。致命的な例外で、アプリケーションを
終了するしかないようなクリティカルなものは別ですが。

私も例外に関しては今でも試行錯誤で、それほどえらそなことは言えないのです。
お互いに頑張りましょうね。

296 名前:291 :2006/06/17(土) 22:58:24
いやー、適当にstd::exception投げまくって、最悪、エントリーで一つcatchしとけば
良いかなぁとか思ってました。危ない危ない。

お付き合い感謝、丁寧にありがとうございました。

297 名前:デフォルトの名無しさん :2006/06/17(土) 23:03:01
ClassNameがクラス名で、そのクラスはintを引数にとるコンストラクタをもつとして

ClassName c(1);

ClassName c=ClassName(1);

って全く同じ意味なんだっけ?

298 名前:デフォルトの名無しさん :2006/06/17(土) 23:04:01
例外クラスを継承するといいことがあるかもよ。

FooExceptionとDerivedFooExceptionがあったときに、それをキャッチする層で同じ処理するなら
FooException&でうけて、別々に処理するならそれぞれキャッチするとか。

ただ、これが「良い」やりかたなのかどうかは俺は知らない(無責任)

299 名前:デフォルトの名無しさん :2006/06/17(土) 23:10:41
>>297
前者はコピーコンストラクタ要らない。

300 名前:デフォルトの名無しさん :2006/06/17(土) 23:13:57
>>293
ユーザーには通信でエラーが発生したことを伝える必要があることを考えると、
通信クラスの例外がアプリケーション層まであがってこないと困る、とも言えないか?

301 名前:デフォルトの名無しさん :2006/06/17(土) 23:19:34
うん、そういう場合は、上位が理解できる例外クラスを再送出するようにしてる。
なんて言ったらいいかなー、「生」の例外はあげちゃだめってこと。そうしないと、上位レイヤーが
下位レイヤーの詳細を知ってなんらかのアクションを起こさないといけないから。

302 名前:デフォルトの名無しさん :2006/06/17(土) 23:37:49
>>299
それどういう意味?
どっちの場合もコピーコンストラクタは呼ばれないみたいだけど?

#include<iostream>
using namespace std;

struct myClass {
int p;

myClass(int i){p=i;}

myClass(const myClass & m){
cout<<"COPY CONSTRUCTOR IS CALLED"<<endl;
p=m.p;
}
};


int main(){
myClass mc1(1);
myClass mc2=myClass(2);

cout<<mc1.p<<endl;
cout<<mc2.p<<endl;

}

というプログラムで、出力は
1
2
で、COPY CONSTRUCTOR IS CALLEDっていう文字列は出力されなかったけど。

303 名前:デフォルトの名無しさん :2006/06/17(土) 23:40:03
>>301
それをするには、下位レイヤー自身がすべての実装を知っていることが必要だが、
インターフェースを規定して実装を置き換えることができるようなモジュールでは
そうはいかないよね?

304 名前:デフォルトの名無しさん :2006/06/17(土) 23:42:21
>>302
後者では意味上はコピーコンストラクタが呼ばれるが、
コンパイラがコピーを省略することを許されている。
コピーコンストラクタが private になってたりすると差が出る。

305 名前:デフォルトの名無しさん :2006/06/17(土) 23:51:01
>>304
なるほど!ありまd!

306 名前:デフォルトの名無しさん :2006/06/17(土) 23:55:40
>>303
すみません、質問の意味が良く分かりません。
下位レイヤー自身は、自分が直接使用するものの詳細は当然知っていますが、誰から呼ばれるかは
知りません。

307 名前:デフォルトの名無しさん :2006/06/18(日) 00:03:40
>>306
あーごめんよ。コールバック関数とか、そういうのの話ね。

ostream に対して汎用的なモジュールを作ったとして、
そこにファイルが渡されるかネットワークストリームが渡されるか
さらには未知のデバイスが渡されるかわからないとき
再送出をどうするかってこと。

308 名前:デフォルトの名無しさん :2006/06/18(日) 00:10:22
>>307
んー、コールバックは関係ありません。
その例でいえば、ストリームを処理するクラスがあるときに、それを呼び出すレイヤーに、ファイル系や
ネットワーク系の例外を直接なげちゃ(あるいはキャッチせずにそのままじゃ)駄目ですってことです。
何のために「ストリーム」という抽象化をしたのかわからなくなります。
どうもうまく話がかみ合わない気が・・・。

309 名前:デフォルトの名無しさん :2006/06/18(日) 00:17:22
ああ、やっと>>303の意味がわかりました。
あるinterfaceには(あるいはそれと同じレイヤー全部のinterfaceには)、それ専用の例外クラスを定義し、
そのinterfaceを実装するコードが使用するところから上がってきたexceptionは、必ずcatchし、
その専用の例外クラスをthrowするようにする、ということです。

310 名前:デフォルトの名無しさん :2006/06/18(日) 00:43:48
>>309
やっぱりそうなるかね。面倒だからそのまま外まで飛んでいくようにしたほうが
コーディングも文書化もとっても楽なんだけどね。
発生したエラーの詳細が失われないように工夫も要りそうだ。

面倒だけど、ここらへんが妥協点だと言われれば納得もできそう。
今度なんか作るときはそんな感じに設計してみるよ。つきあってくれてありがとう。

311 名前:デフォルトの名無しさん :2006/06/18(日) 02:26:14
いえいえ、こちらこそありがとうございました。
私も日々勉強です。システム全体の例外・エラー処理って本当に悩ましいですよね。ではー。

312 名前:デフォルトの名無しさん :2006/06/18(日) 04:19:29
例外処理と抽象化は無関係だ

313 名前:デフォルトの名無しさん :2006/06/18(日) 04:39:52
>>312
それは >>301>>309 に対する反論かな?
根拠も無しに言い切られても困る。是非詳しく聞いてみたいね。

314 名前:デフォルトの名無しさん :2006/06/18(日) 12:09:51
>>312
読解力のない奴

315 名前:デフォルトの名無しさん :2006/06/18(日) 13:12:06
確かにストリームライブラリがFTP対応になって
stream->open("ftp://ftp.hoge.com/");
ってやってFTPの例外が上がってくるようになったら困る品

316 名前:デフォルトの名無しさん :2006/06/18(日) 13:25:09
そういう考え方もあると思うが、
ftpstream f("ftp://ftp.hoge.com/");
としてftpの例外をアプリ側で積極的に使いたいこともある。


317 名前:デフォルトの名無しさん :2006/06/18(日) 13:32:26
個々の事例を挙げてしまうと、結局ケースバイケースってなことになるな。
どっちが優れてるとか、どっちが劣っているとかないから、好きなようにしる。

318 名前:デフォルトの名無しさん :2006/06/18(日) 13:54:11
言語c++
文字列xの中に文字aが含まれる個数(含まれない場合は0)を返す関数
int abc(const char x[], int a)
を作るという問題なんですがわかる方よろしくお願いします。

文字列にaが何個入っているかを表示するプログラムです。

319 名前:デフォルトの名無しさん :2006/06/18(日) 14:04:27
>>318
丸投げ氏ね。
宿題は宿題スレへ。

320 名前:デフォルトの名無しさん :2006/06/18(日) 14:05:57
そもそも問題がCで十分だし……。

321 名前:デフォルトの名無しさん :2006/06/18(日) 14:08:21
>>318
int abc(const char str[], int a) { return static_cast<int>(std::count(str, str+strlen(str), a)); }

322 名前:デフォルトの名無しさん :2006/06/18(日) 14:11:50
int abc(const char x[], int a){
return std::count(&x[0], &x[std::strlen(x)], char(a));
}

323 名前:デフォルトの名無しさん :2006/06/18(日) 14:12:25
ケコン

324 名前:デフォルトの名無しさん :2006/06/18(日) 14:17:32
セクス

325 名前:デフォルトの名無しさん :2006/06/18(日) 17:36:25
ニンシン

326 名前:デフォルトの名無しさん :2006/06/18(日) 20:47:55
ハラキリ

327 名前:デフォルトの名無しさん :2006/06/18(日) 22:07:15
ダタイ

328 名前:デフォルトの名無しさん :2006/06/18(日) 22:17:51
イシャリョウ

329 名前:デフォルトの名無しさん :2006/06/18(日) 22:40:29
ナリキン

330 名前:243 :2006/06/19(月) 12:06:48
流れを変えてみる。
VC8はこれでコンパイルが通る。不思議……。

template < int Parameter >
class Foo
{
public :
  //これでは通らない。
  //template < int AnotherParameter >
  //friend std::ostream & operator << ( std::ostream & out, Foo<AnotherParameter> const & val ) ;

  //template < int AnotherParameter > //もしくは単純に
  template < int >
  friend std::ostream & operator << ( std::ostream & out, Foo<Parameter> const & val ) ;

private :
  //これは言うまでもなくprivateなメンバ関数
  void print( std::ostream & out) const
  { out << "Private!" ; }
} ;
template < int AnotherParameter >
std::ostream & operator << ( std::ostream & out, Foo<AnotherParameter> const & val)
{
val.print(out) ;//友達なのでおkらしい
return out ;
}

int main( )
{
Foo<1> f ;
std::cout << f << std::endl ;
}

331 名前:デフォルトの名無しさん :2006/06/19(月) 17:55:13
本当に初心者な質問ですいません。
class A
{
const char *buf;
public:
A():buf("buffer"){};
};

この"buffer"はクラス変数になるのでしょうか?
コンストラクタ終了後、死んだスタック上にある。とかそのようなこと無いですか?

332 名前:デフォルトの名無しさん :2006/06/19(月) 18:02:15
ならない。

333 名前:デフォルトの名無しさん :2006/06/20(火) 12:28:24
http://sourceforge.net/forum/forum.php?forum_id=583545
> * STL containers implementation now correctly handle allocators with state. This kind
> of allocator has to overload swap method if any specific action has to be made when
> swaping 2 instances.

ウホっ

334 名前:デフォルトの名無しさん :2006/06/20(火) 12:29:56
STLportか。

335 名前:デフォルトの名無しさん :2006/06/20(火) 21:25:20

strstream Str;

などと宣言したStrに

Str << "ABC";

などと文字列を格納したあと、このABCをクリアしてバッファを初期状態(pcount()が0を返す)ようにしたいのですが、どのような手順を踏めばよいのでしょうか?
ご存じの方いらっしゃったらご教示ください。


336 名前:デフォルトの名無しさん :2006/06/20(火) 22:06:22
stringstream使いなよ。strstreamはobsolete。

Str.str("");

337 名前:デフォルトの名無しさん :2006/06/20(火) 22:21:08
ありがとうございます。
使っているライブラリ関数がstrstreamを引数に要求するので仕方なくつかっているのです(^^;


338 名前:デフォルトの名無しさん :2006/06/20(火) 22:27:23
じゃ、使っているstrstreamに独自拡張がない限り諦めるしかない。

339 名前:デフォルトの名無しさん :2006/06/20(火) 22:50:05
酷いライブラリだな。
それはともかく、streastreamをnewするようにして、
初期状態に戻したくなったら、新しいのをnewし、
それから古いのをdeleteするようにしたらどうだろう。

それとももしかしてboost.optionalはコピー不可の型にも使えた?

340 名前:デフォルトの名無しさん :2006/06/20(火) 23:04:24
引数に取るならiostreamの参照かポインタで事足りると思うんだけどなぁ。
どういう設計してるんだか。

341 名前:デフォルトの名無しさん :2006/06/20(火) 23:15:43
>>339
こちらのアイデアでいこうと思います。
ありがとうございます。


342 名前:デフォルトの名無しさん :2006/06/21(水) 00:16:54
しつもーん

#undef LABEL
#define LABEL (1)

をマクロ関数とか使ってLABELを一回しか書かないで実現することできる?

343 名前:デフォルトの名無しさん :2006/06/21(水) 00:35:41
実装依存じゃね?
#undef が要らなくて #define で上書きできる実装もあった気がする。

344 名前:デフォルトの名無しさん :2006/06/21(水) 02:30:43
class A {
public:
  A(){}
  A(int n) {}
};

class B {}

int main(void) {
  B b(3);
}

このコードをコンパイルすると
const int から class Bに変換することはできません
とエラーになりますが
C++ではコンストラクタは継承されないの?

345 名前:デフォルトの名無しさん :2006/06/21(水) 02:42:31
>>344
仮にAのコンストラクタが使われてしまったら、
B固有の初期化が出来なくなっちまう罠

346 名前:デフォルトの名無しさん :2006/06/21(水) 02:42:27
されないよ

347 名前:デフォルトの名無しさん :2006/06/21(水) 02:44:14
C++”では”っていうか、コンストラクタが継承される言語なんてあったか?

348 名前:デフォルトの名無しさん :2006/06/21(水) 02:49:23
>>344
継承されない。C++には多重継承があるから、
どの基底クラスのコンストラクタを呼べばいいか決められない。

349 名前:デフォルトの名無しさん :2006/06/21(水) 02:53:08
>>348
多重継承は関係ない希ガス

350 名前:デフォルトの名無しさん :2006/06/21(水) 02:55:51
B でコンストラクタを定義してないから、

B() : A() { } // デフォルトコンストラクタ
B(const B& b) : A(b) { } // デフォルトコピーコンストラクタ

が自動的に作られる。
それ以上は自分で書かないといけない。

そういうエラーが出るのは、
B(int) がないのでコピーコンストラクタを呼ぼうとしてるから。

351 名前:デフォルトの名無しさん :2006/06/21(水) 03:53:30
>>350
コピーコンストラクタを呼ぼうとしてるわけじゃないよ。

352 名前:デフォルトの名無しさん :2006/06/21(水) 04:18:11
AとBに何の関連もない様に見えるのは気のせい?

353 名前:デフォルトの名無しさん :2006/06/21(水) 05:50:00
class B に B::B(int hoge) がないですね。コンパイラも困っているみたいです。

354 名前:デフォルトの名無しさん :2006/06/21(水) 08:45:15
幻の継承を見た!

355 名前:デフォルトの名無しさん :2006/06/21(水) 09:06:46
新しいC++の仕様なのかもね
「直後に定義されたクラスは直前のクラスを暗黙的に継承する」とか


356 名前:デフォルトの名無しさん :2006/06/21(水) 09:21:19
>>351
ということは、
>const int から class Bに変換することはできません
は B(int) がないよというエラーなのか?
変な書き方するもんだな。

357 名前:デフォルトの名無しさん :2006/06/21(水) 11:32:03
>>356
暗黙の型変換を考えれば自然なエラーメッセージだと思うが

358 名前:デフォルトの名無しさん :2006/06/21(水) 12:40:58
const HOGE& hogeとHOGE const& hogeはどう違うのか教えて下さい。
constスレで調べようと思ったけど、ぐぐってもスレタイ検索しても見つからないorz

359 名前:デフォルトの名無しさん :2006/06/21(水) 12:51:03
>>358
書き方の違い
意味は同じ

360 名前:343 :2006/06/21(水) 16:24:25
なんかいろいろ勘違いしてたみたいです。
あざっした!

361 名前:デフォルトの名無しさん :2006/06/23(金) 13:01:48
int ((* a) [10]);
int * (b[10]);
a=b;
とすると
error: cannot convert `int*[10]' to `int (*)[10]' in assignment
というコンパイルエラーになるんだけど、
int ((* a) [10]);

int * (b[10]);
ってそれぞれどういう意味なんでしょう?

362 名前:デフォルトの名無しさん :2006/06/23(金) 13:19:00
>>361
a は int の配列(要素数 10 )へのポインタ。
b は int へのポインタの配列(要素数 10 )。

363 名前:デフォルトの名無しさん :2006/06/23(金) 13:27:30
>>361
int*[10] は(intへのポインタ)の配列
int(*)[10]は(intの配列)へのポインタ

int *a[10];      
int (*b)[10];
int x =123;      // int
int y[10] = {456};  // intの配列
a[0]=&x;       // intへのポインタを格納
b=&y;         // intの配列へのポインタを格納
printf("%d,%d", (*a[0]),(*b)[0]);

結果
123,456

364 名前:363 :2006/06/23(金) 13:28:29
遅かったか orz

365 名前:363 :2006/06/23(金) 13:30:28
しかもaとbが逆だ orz

366 名前:デフォルトの名無しさん :2006/06/23(金) 14:45:22
>>362-365
なるほろありがとん!

367 名前:287 :2006/06/24(土) 15:53:22
>>289, >>290
有り難うございました。m(_ _)m
勉強します。

368 名前:358 :2006/06/24(土) 16:20:35
>>359
亀レスですが、どうもありがとうございました。

369 名前:369 :2006/06/24(土) 17:11:37
>>369
亀レスですが、どうもありがとうございました。

370 名前:370 :2006/06/24(土) 17:54:01
>>371
亀レスですが、どうもありがとうございました。

371 名前:デフォルトの名無しさん :2006/06/24(土) 17:57:22
>>370
どう見ても兎レスです。
本当にありがとうございました

372 名前:デフォルトの名無しさん :2006/06/25(日) 02:57:56
void traverse_queue(queue *q, int (*callback)(void *)){
list *l;
for (l = q->head; l; l = l->cdr) callback(l->car);
}

とあるところでこんなコードみかけたんですが
callbackって何でしょうか?
上記はコード全体の一部なんですが、コード全体を見渡しても
callback型に関する定義はどこにも見当たらないのです
そのコードは
string.h
stdio.h
stdlib.h
をインクルードしてましたがその中にも当然そんな定義ないし・・・


373 名前:デフォルトの名無しさん :2006/06/25(日) 03:01:53
schemeのソースっぽいね。

型はint (*)(void *)じゃん。
「intを返し、引数がvoidポインタの関数」
という型でしょ

374 名前:デフォルトの名無しさん :2006/06/25(日) 03:03:02
>>372
ttp://www.google.co.jp/search?hl=ja&q=%E3%82%B3%E3%83%BC%E3%83%AB%E3%83%90%E3%83%83%E3%82%AF%E9%96%A2%E6%95%B0&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=lang_ja


375 名前:デフォルトの名無しさん :2006/06/25(日) 03:08:28
callbackは型じゃなくて仮引数名だね。
型は>>373さんの通り。


376 名前:デフォルトの名無しさん :2006/06/25(日) 03:11:35
>372
そのソースのcallbackは、その関数を書いた奴がつけた引数の名前。
引数の型は>373、じゃちょっとおかしいな
「intを返し、引数がvoid*の関数、へのポインタ」

377 名前:デフォルトの名無しさん :2006/06/25(日) 03:11:53
>>373
「……」へのポインタである引き数callback

378 名前:デフォルトの名無しさん :2006/06/25(日) 03:13:49
(*callback)()って呼び出すもんだと思ったら
普通の関数形式で呼べるんだな...

379 名前:デフォルトの名無しさん :2006/06/25(日) 04:54:14
すいません、クラスのことで少し質問させてください。
たとえば以下のようなクラスをつくったとします。
class abc{
private:
int a;
public:
void xyz(abc k){
int i = a;
int j = k.a;
}
}
この場合、関数xyz内でのaへのアクセスは問題なく、k.a は引数のprivate変数なので
アクセスできないものと思っていたのですが、コンパイルも問題なく通りました。
メンバ関数が自身のクラスを引数にした場合、
そのprivate変数にはアクセスできるものなんですか?

380 名前:デフォルトの名無しさん :2006/06/25(日) 05:00:11
>>379
できるものなんです

381 名前:デフォルトの名無しさん :2006/06/25(日) 10:18:03
すいません。どなたか教えて頂きたいのですが、
class A
class B

を定義したとして、
classAの中で、メンバ変数として、
@ B b
A B* b

@とAのどちらかで定義したとします。
これらの違いがはっきり判りません。

Aの定義方法の場合、
class A のメソッドの中で、
b = new B();
と定義する事で、右辺で確保されたメモリ空間のアドレスが、
bに代入され、その後、bはアドレス参照により、
class B のメンバ変数やら、メソッドなどを使用できる(アロー演算子を使って)、
と思うのですが、
@の定義方法の場合、
b.メンバ変数 = メンバ変数の値 b.メンバ関数 などで、new しなくても使えると
思います。

そうすると、@の定義方法の方が簡単でよいと思うのですが、一般的には、
あるクラスが、あるクラスをメンバ変数としてもつ場合、Aの方法が正解
だと思います。この違いは一体なんなのでしょうか?

382 名前:デフォルトの名無しさん :2006/06/25(日) 11:01:03
>Aの方法が正解だと思います。この違いは一体なんなのでしょうか?
正解だと思った根拠を聞こうか。

383 名前:デフォルトの名無しさん :2006/06/25(日) 11:10:10
>>382
Aの方が正解というのは、他の方のソースを拝見すると、
クラスの中で他のクラスを持つような場合、
ポインタ変数として宣言し、コンストラクタで、new
デストラクタで、deleteしているので、こちらが
一般的なのかな?と思っています。
もし、Aのようにポインタ変数ではなく、@のような
宣言方法ですと、どのようなタイミングで、メモリ確保
が行われるかも判りません。ポインタ変数ですと、
new されたときに確保できるのは判るのですけれども。
説明が分かりにくくて申し訳ありません。


384 名前:デフォルトの名無しさん :2006/06/25(日) 11:13:31
些細な質問で申し訳ありませんが
while (n!=i)
のような文の!とはどんないみなのでしょうか?

385 名前:デフォルトの名無しさん :2006/06/25(日) 11:25:34
>>384
そこで"!"だけ抜き出すな。"!="で1つの演算子だ。

386 名前:デフォルトの名無しさん :2006/06/25(日) 11:59:29
>>383
二つのクラスが一蓮托生なら1でもいいんじゃないの。
AとBの寿命が違うならポインタにしとくべきだとは思う。
間違ってたら突っ込みヨロリ。

387 名前:デフォルトの名無しさん :2006/06/25(日) 12:07:30
俺も寿命の問題(確実に分かりやすい)が一番重要だとは思うけど、
でかいプロジェクトが多いもんだから、ヘッダ重ねてコンパイル時間が長引くのがいやで、常に(2)を採用しているな
これはこれで定型文書くのが面倒なんだが

388 名前:デフォルトの名無しさん :2006/06/25(日) 12:15:30
>>384
!は否定の意味。Notね。
!=だと、not equal

389 名前:デフォルトの名無しさん :2006/06/25(日) 12:17:36
>>383

俺はメンバクラスにするのならば@だけど。deleteし忘れると困るし、
極力使わないですむような実装にしてる。


390 名前:デフォルトの名無しさん :2006/06/25(日) 12:18:27
>>386
回答の方ありがとうございます。

確かに、>>381 で@の宣言方法ですと、deleteしなくても、class A のインスタンスが、
スコープから外れると、class A のデストラクタ→ class B のデストラクタ
という風になり、同じタイミングでメモリから解放されるということですね。
もし、class Aが保持する、class B のインスタンスを自分の好きなタイミング
で開放したい時などは、Aの宣言の方がよいということですね。

あと一つ疑問なのですが、皆さんは、あるクラスで、別クラスの
インスタンスを持ちたい時は、どのような判断で、@、Aの宣言を
使い分けているのでしょうか?また、@、Aの各宣言の、長所、短所
など教えて頂けたらありがたいです。

391 名前:デフォルトの名無しさん :2006/06/25(日) 12:21:45
>>387
ちなみにコンパイル時間変わる?
Bがインターフェースでない限り同じな気がする・・が、良い方法があるのだろうか。

392 名前:デフォルトの名無しさん :2006/06/25(日) 12:23:26
>>387
うちの場合はコンパイル時間よりもバイナリコンパチビリティが保てることの方が重要だな。

今のバイナリに変更部分だけコンパイルして開発作業ができれば
全体のビルドは時間がかかっても平行でやっておけばいいのだ。


393 名前:デフォルトの名無しさん :2006/06/25(日) 12:26:02
@の欠点は、class Aがclass Bの定義に依存してしまうということ。
具体的には、class_a.hはclass_b.hをincludeしなくてはならず、class Aには
全く変更が無くてもclass Bが変更されるとコンパイルの必要が出てくる。

Aの形式にしておけば、そのような依存関係を断ち切ることが出来る。
具体的には次のようにやる。
class B;
class A {
...
B *b;
};

なぜ依存しないほうがいいかというのは、そのうちわかってくると思う。

394 名前:デフォルトの名無しさん :2006/06/25(日) 12:28:11
>>387 >> 389
質問を書き込んでる間に、回答してもらいありがとうございました。
なるほど、やはり、deleteのタイミングさえ気を付ければ、@、A
であまり変わらないということですね。
大変勉強になります。

>>387 さんに回答して頂いた内容で、
「でかいプロジェクトが多いもんだから、
ヘッダ重ねてコンパイル時間が長引くのがいやで、
常に(2)を採用しているな
これはこれで定型文書くのが面倒なんだが

とありますが、私もプロジェクトがかなり大きいので、
お聞きしたいのですが、上記の意味は、
クラスをメンバ変数で宣言する際に、ポインタ変数で宣言
するとコンパイル時において、何か利点などあるのでしょうか?


395 名前:393 :2006/06/25(日) 12:31:57
>>393は、class Bが標準のクラス(というと語弊がありそうだが)以外の場合の話。
STLのクラスを使う場合などは@の形式を使う場合が多い。

396 名前:デフォルトの名無しさん :2006/06/25(日) 12:37:00
>>392
ヘッダのコメント修正されただけで、全コンかかってむかつくことないの?w

397 名前:デフォルトの名無しさん :2006/06/25(日) 12:41:58
>>391 >>392 >> 393
またまた、質問を書いている時に回答して頂いて、
ありがとうございました。

以下のようにポインタ変数で宣言すると、

class B;
public class A{

B* b;

}

bはもともとクラスBのアドレスを入れる変数なので、
クラスBの処理の内容までは知る必要がなく、Bの型さえ知って
おけばメモリ空間へどれだけメモリを確保すれば良いのかが
判る。というような感じですね。

しかし、もし以下のような宣言方法だと、

class B;
public class A{

B b;

}

B自体のクラスの中身をしらないと、メモリ空間を確保できない
ので、class A はclass B に依存してしまうということですね。

何か頭がすっきりしました。
本当に皆さんありがとうございました。

398 名前:デフォルトの名無しさん :2006/06/25(日) 12:43:19
>>391
class Aのヘッダでclass BのヘッダB.hをインクルードせずに>393のようにする。
実際にBにアクセスするA.cppでB.hをインクルードすれば、AはBにアクセスできる。
Aを使うCモジュールでは、B.hがインクルードされないので、
class Bの変更でCは再コンパイルされない。←これが>393の言うソース依存関係を断ち切ると言うこと。
その必要もない。←これが>392の言うバイナリコンパチビリティ


399 名前:デフォルトの名無しさん :2006/06/25(日) 12:46:23
>>391-392
実装段階じゃあまり効果はないが、宣言を良く弄る段階ならもう劇的に変わる。
要するに波及を一切シャットアウトできるわけだ。

最初からある程度完璧な設計を捻出できたり、
あるいはヘッダの依存をきっちり区切れる自信があるなら、必要ないかもな。

って、もう皆が詳しく書いてくれてるな。

400 名前:デフォルトの名無しさん :2006/06/25(日) 12:52:40
private部分をpublic部分と分離しない(実装仕様もひとつのヘッダに宣言する)ところじゃ、
そりゃもう天と地の違いがありますな。

401 名前:デフォルトの名無しさん :2006/06/25(日) 13:05:07
>> 398 >> 399 >> 400
回答ありがとうございました。

皆さんは、どのようにしてそのような知識を得るのでしょうか?
私はまだC++を仕事で使うようになり、1年ですが、まだ、本などを
読んだりして勉強しながら仕事を進めているのですが、
今回、皆さんに回答して頂いたような事は本には載っていません。
もしかして、実際に、VC++などで、デバックを行い、メモリウィンドウ
などで、値を確認しながら、勉強されているのでしょうか?

本当に質問が多くて申し訳ありません。

402 名前:382 :2006/06/25(日) 13:16:37
>>401
取り敢えずEffectiveC++くらいは読んだと思っていいのかな?
だとしたら後は実践あるのみだろ。

ちなみに漏れは、>381だけでは一概に言えないので適材適所で使い分けているとしか言えない。

403 名前:379 :2006/06/25(日) 13:31:32
>>380
どうもありがとうございます。

404 名前:デフォルトの名無しさん :2006/06/25(日) 14:01:56
C++でメンバ関数をメソッドとかいう呼び方をするのはちとどうかと。

405 名前:デフォルトの名無しさん :2006/06/25(日) 14:18:50
別に問題ない。
言語によって呼称が違うだけで、意味するところは同じ。
つまんないことにこだわらない方がいいよ。


406 名前:デフォルトの名無しさん :2006/06/25(日) 14:24:37
仮想関数がメソッドだよなぁ。
普通のメンバ関数はメンバ関数だ。

つまんないことってw
C++作った人がそう言ってるのに、
それを知らずに我を通すのも何だかな、と思う。

まぁ日本人的にどうなのかは知らんがw

407 名前:デフォルトの名無しさん :2006/06/25(日) 14:24:37
>>404
public methodとか普通に言うけどなぁ。
パブリックなメンバ関数っていちいち言ったりしてる?

408 名前:デフォルトの名無しさん :2006/06/25(日) 14:25:53
意味が通じれば何でもいい

409 名前:デフォルトの名無しさん :2006/06/25(日) 14:26:58
>>406
仮想関数は、virtual functionだけど。
まぁ日本人的にはメソッドなのかも知らんがw

410 名前:デフォルトの名無しさん :2006/06/25(日) 14:31:31
>>401
いや、載ってる。よく見かける話。
君がまだそのような本を読んだことが無いってだけの話だから、
そのうち読むことになるだろう。

411 名前:デフォルトの名無しさん :2006/06/25(日) 14:36:14
>>409
仮想関数はvirtual member functionでしょ。
methodはあくまで別名。

ちなみにソースは↓ねttp://www.research.att.com/~bs/glossary.htm

まぁ基本的に>>408に同意だけど。

412 名前:禿 :2006/06/25(日) 14:44:07
俺、サブとスーパーじゃ意味がわからんから、
ディライブドとベースにした。

413 名前:デフォルトの名無しさん :2006/06/25(日) 14:50:17
別名がメソッドならそれでいいじゃない。

414 名前:デフォルトの名無しさん :2006/06/25(日) 14:54:29
>>411
英語を話す人としゃべったことないみたいだね

415 名前:デフォルトの名無しさん :2006/06/25(日) 15:06:01
>>411
厳密に言うと、C++の文脈で言うメソッドとメンバ関数・仮想関数では
レイヤーが違うということであって、仮想関数のことをメソッドと呼ぶ
のではない。

416 名前:デフォルトの名無しさん :2006/06/25(日) 15:31:19
>>415
それはあなたの常識?
それとも日本の常識?
それとも世界的な?

正直どこの馬の骨とも知れない匿名の個人の意見より、
どこかのサイトに書いてあることの方が信用できます。
なのでソースを貼って頂けると。もちろん書籍でも可です。

417 名前:デフォルトの名無しさん :2006/06/25(日) 15:34:15
http://e-words.jp/w/E383A1E382BDE38383E38389.html

418 名前:415 :2006/06/25(日) 15:43:10
>>416
常識かどうかは知らない。

C++ではメソッドをメンバ関数という手段で実現するのだが、仮想関数を使う場合には、
あるオブジェクト(インスタンス)のメソッドがメンバ関数で実現されているかどうかは
わからない。その意味で、>>411のURLには、
A virtual member function is sometimes called a method.
と書かれている。

何が真実か知りたければ、調べてください。

419 名前:デフォルトの名無しさん :2006/06/25(日) 16:02:03
メソッドが概念で、C++ではその概念がメンバ関数で実装されてるって意味じゃないか?
メソッドがオブジェクト指向用語だとすると仮想関数じゃなきゃメソッドって言わないのかも

>仮想関数を使う場合には、 あるオブジェクト(インスタンス)のメソッドが
>メンバ関数で実現されているかどうかはわからない。

この説明はよく分からんけど。
メンバ関数以外で実装されたメソッドってどんなんだ?

420 名前:415 :2006/06/25(日) 16:15:15
>>419
>メソッドが概念で、C++ではその概念がメンバ関数で実装されてるって意味じゃないか?
そうです。それを私は「レイヤーが違う」と表現しました。

>メソッドがオブジェクト指向用語だとすると仮想関数じゃなきゃメソッドって言わないのかも
どのような論理でそうなるのですか?

>この説明はよく分からんけど。
メンバ関数とは、あるクラスで定義された関数のことです。>>411のURLには
>member function - a function declared in the scope of a class. A member function
>that is not a static member function must be called for an object of its class.
と説明されています。

また、あるオブジェクトから見たときのメソッドが、そのオブジェクトのクラスで定義された
メンバ関数ではない場合があるという意味です。

421 名前:415 :2006/06/25(日) 16:21:08
とまぁ、どこの馬の骨ともわからない私と会話しても、意味が無いのでしょうね。

Netには、member functionとmethodについて、C++の黎明期に議論された痕跡などが
ころがっているはずなので、真実が知りたいのならお調べになってください。

422 名前:デフォルトの名無しさん :2006/06/25(日) 16:26:26
http://www.open-std.org/jtc1/sc22/wg21/
News 2006-06-24: The C++ Standard Library Issues List (Revision 43) is available (.tar.gz)
News 2006-06-24: C++ Standard Core Language Issues List (Revision 42) is available, also committee version

423 名前:デフォルトの名無しさん :2006/06/25(日) 16:27:39
知らないうちに
 friend T;
が有効になる予定になってた。

424 名前:デフォルトの名無しさん :2006/06/25(日) 16:27:59
しょうもな。
通称メソッド、正しくはメンバ関数。
それ以上でも以下でもない。

425 名前:デフォルトの名無しさん :2006/06/25(日) 16:31:15
規格ではmember functionの事をmethodとは一切呼んでおりません。

426 名前:デフォルトの名無しさん :2006/06/25(日) 16:36:23
要するに

class A { public: virtual void hoge() {...}; };
class B :public A { public: virtual void hoge() {...}; };

Aにとってのhogeは「メソッド」で、Bにとってのhogeは「メンバ関数」ってことか?
クラスCがBを継承してhogeをオーバーライドしたら、Bにとってもhogeは「メソッド」に変わるわけかw
バカじゃねーの?w


427 名前:デフォルトの名無しさん :2006/06/25(日) 16:42:01
>>426
馬鹿はお前。
仮想メンバ関数の別名がメソッドだなんて、どこから沸いた話だ

428 名前:デフォルトの名無しさん :2006/06/25(日) 16:43:52
元凶は>>406
かまってちゃんはほんと困る。

429 名前:デフォルトの名無しさん :2006/06/25(日) 16:45:23
>>426

 ま た お 前 か

430 名前:デフォルトの名無しさん :2006/06/25(日) 16:45:33
関数なんて全部メソッドで十分ですよ。

431 名前:デフォルトの名無しさん :2006/06/25(日) 16:48:21
>>429

 ま た お 前 か

432 名前:デフォルトの名無しさん :2006/06/25(日) 16:52:49
なんつったっけこーゆーのは。
骨髄反射?

433 名前:デフォルトの名無しさん :2006/06/25(日) 16:53:07
  ┏┳┳┓              ┏┳┳┓
┏┫┃┃┃ スレ違い雑談は┃┃┃┣┓
┃┃┃┃┣┓   ここまで.┏┫┃┃┃┃
┃      ┃┃┏━━━┓┃┃      ┃
┃スレ違い ┣┫ ・∀・ ┣┫  END ┃
┗━━━━┛┗┳━┳┛┗━━━━┛
            ┏┻┓┃
        ┏━┛  ┣┻┓
        ┗━━━┫  ┗━┓
                ┗━━━┛

434 名前:デフォルトの名無しさん :2006/06/25(日) 16:55:58
>>425
Bjarne Stroustrupはvirtual member functionのことをmethodだと言ってますが。

435 名前:デフォルトの名無しさん :2006/06/25(日) 16:56:47
このグダグダな展開、もう見飽きたよ

436 名前:デフォルトの名無しさん :2006/06/25(日) 17:04:49
英語よく読めないからわかんないけど
海外のメーリングリストでもこんな議論ってやってるの?w

437 名前:デフォルトの名無しさん :2006/06/25(日) 17:05:21
>>434 だからどうした?

438 名前:デフォルトの名無しさん :2006/06/25(日) 17:06:08
>>436
あっちは匿名がほとんどないから、ここまで恥ずかしい展開にはならない。

439 名前:デフォルトの名無しさん :2006/06/25(日) 17:07:11
くだらんことで議論すんなよ。

440 名前:デフォルトの名無しさん :2006/06/25(日) 17:11:57
メーリングリストで匿名って日本人も普通やらないと思う。
というかメールではやらないだろ。

441 名前:デフォルトの名無しさん :2006/06/25(日) 17:33:51
cppll での類似した趣旨のスレ。
ttp://www.tietew.jp/cppll/archive/7159
互いの認識を確認してお終い。

442 名前:デフォルトの名無しさん :2006/06/25(日) 17:41:20
>>437
はぁ?C++作った奴が仮想関数をメソッドと呼ぶっていてるんだろうが

443 名前:デフォルトの名無しさん :2006/06/25(日) 17:42:43
>>442
>呼ぶっていてるんだろうが
餅搗け。さもなくば帰れ。

444 名前:デフォルトの名無しさん :2006/06/25(日) 17:49:52
つまり、こういうくだらないことに自分の知識を披露せずには
いられない馬鹿が多いってことですな。

445 名前:デフォルトの名無しさん :2006/06/25(日) 17:56:13
>>434
それが規格に何か関係あるのか?

446 名前:デフォルトの名無しさん :2006/06/25(日) 18:10:17
最近、巧妙な釣りがはやってるみたいだな。
さっきも宿題スレで「低レベル関数を使えという指示がありました」という
コメントに「関数にレベルなんかあるかw」とつっこみを入れた奴がいたけど、
みごとに数人が釣られてた。

俺は最近はやってるこの手の釣りは、だれか一人がやってるんじゃないかと睨んでる。
そういうわけで、困ったチャンは相手にしないほうがいいんじゃないかといいたいわけだ。

447 名前:デフォルトの名無しさん :2006/06/25(日) 18:13:31
>>445
規格が何の関係があるんだよw

448 名前:デフォルトの名無しさん :2006/06/25(日) 18:14:57
議論してる奴らのどいつも結局自分の言葉で説明できてないな。

449 名前:デフォルトの名無しさん :2006/06/25(日) 18:16:14
>>445
>>425 が、わざわざ「規格では」って断ってるだろ。
あと、 stroustrup が何故 "sometimes" と挟んでいるのか考えろ。

君は都合の悪いところを読み飛ばす癖があるみたいだな。

450 名前:449 :2006/06/25(日) 18:16:51
あ、アンカーミスった >>449>>447 宛てね。

451 名前:デフォルトの名無しさん :2006/06/25(日) 18:36:54
おまいら近頃カルシウムが足りてないようですよ


452 名前:デフォルトの名無しさん :2006/06/25(日) 18:41:29
禿げに電話して聞いてみたら?

453 名前:デフォルトの名無しさん :2006/06/25(日) 19:45:10
規格の話なんか誰もしてないのに規格を持ち出す規格厨ウザス

454 名前:デフォルトの名無しさん :2006/06/25(日) 19:54:49
ここはム板で言語系スレ。
規格になじめない人さようなら〜。

455 名前:デフォルトの名無しさん :2006/06/25(日) 20:00:22
そうそう、だから、VCつこてるやつは今すぐ捨てようなw

456 名前:デフォルトの名無しさん :2006/06/25(日) 20:05:19
>>455
VC捨てたら、ICCがうごかんやんけ!

457 名前:デフォルトの名無しさん :2006/06/25(日) 20:08:50
規格厨はうざいよなー
いつも規格では、規格ではでんでん言ってるのに
実際のコーディングはうんこ


458 名前:デフォルトの名無しさん :2006/06/25(日) 20:13:23
>>457
それは規格を持ち出すのがうざいんじゃなくて
うんこなコーディングがうざいだけ。うんこ厨とでも呼べ。

459 名前:デフォルトの名無しさん :2006/06/25(日) 20:23:13
禿の記述の意図は、
従来の多くのオブジェクト指向言語、例えばsmalltalk, Objective-Cでは、
virtual member functionと同等のものがmethodと呼ばれていた、
くらいのことだと思います。

以前からclass method/object methodと言われた時期があったから、
禿の書き方はちょっとどうかと思うんですが、まあいいじゃないですか。

460 名前:デフォルトの名無しさん :2006/06/25(日) 20:51:07
>>459
>>444

461 名前:デフォルトの名無しさん :2006/06/25(日) 20:59:01
>>458
規格を知らない奴とは仕事をしたくないな

462 名前:デフォルトの名無しさん :2006/06/25(日) 21:04:01
ここで議論してる奴はリアルで自分の周りの奴に説法してくれよ
多分ウザがられると思うけど

463 名前:デフォルトの名無しさん :2006/06/25(日) 21:06:12
俺は規格を尊重するし、たまには規格書を読んだりもするが
>>461 みたいなことを言う奴は、理想論ばかり言って
現実からかけ離れたコードを書きそうだから、
一緒に仕事をしたくないな。

464 名前:デフォルトの名無しさん :2006/06/25(日) 21:06:44
つい最近C++の言語的な話をしているときに、同僚が「メソッド」と言ったの
で、サクッと無視して自分は「メンバ関数」と言ったのを思い出しました。一
瞬微妙な空気が流れた。どっちでもいいよ……。

465 名前:デフォルトの名無しさん :2006/06/25(日) 21:17:44
ウィキペディアでの検索
http://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89

466 名前:デフォルトの名無しさん :2006/06/25(日) 21:18:42
コミュニケーション能力のない奴だなぁ。
俺は相手が「ワーニング」と言えばそう言うし、「ピング」と言えばそう言うよ。

467 名前:デフォルトの名無しさん :2006/06/25(日) 21:21:17
>>465
メンバ関数のことは別にどうでもいいが、そのWikiページの説明はアレだな。
「右手:左手の反対の手のこと」
「左手:右手の反対の手のこと」
みたい?

468 名前:デフォルトの名無しさん :2006/06/25(日) 21:33:32
>>464
メソッドでも間違いではない。

469 名前:デフォルトの名無しさん :2006/06/25(日) 21:39:23
>>468
C++の言語的な話をしてる時はメンバ関数だろ。

470 名前:デフォルトの名無しさん :2006/06/25(日) 21:47:13
>>469
メソッドでも間違いではない。

471 名前:デフォルトの名無しさん :2006/06/25(日) 21:48:41
みんな呼称のレベルで話してるけど、
結局両者の本質的な違いってなに?
それがないなら不毛な議論だと思うけど。


472 名前:デフォルトの名無しさん :2006/06/25(日) 21:53:05
>>471
>結局両者の本質的な違いってなに?

「俺は」視点の違いだと思ってる。

メンバ関数→C++用語
メソッド→OO用語

473 名前:デフォルトの名無しさん :2006/06/25(日) 21:53:24
>>471
あるけど、ここまでのスレの中に答えはもう出てる。

474 名前:デフォルトの名無しさん :2006/06/25(日) 22:04:51
お前らどんだけ話をるーぷさせれば気が済むんだよ

475 名前:デフォルトの名無しさん :2006/06/25(日) 22:06:08
>>471
C++の用語には「メソッド」は無い。

以上。

476 名前:デフォルトの名無しさん :2006/06/25(日) 23:29:59
私、勘違いしてました。

・オブジェクト指向においてオブジェクトの振る舞いを定義するのがメソッド
・C++ ではオブジェクトの振る舞いをメンバ関数として記述する

ってところなのかな?


477 名前:デフォルトの名無しさん :2006/06/25(日) 23:33:12
お前が勘違いしてようがどうしようが関係ない。
いつまで話をループさせれば気が済むんだ。

478 名前:デフォルトの名無しさん :2006/06/26(月) 01:06:00
>>476
お前は馬鹿か?
virtual member function == method
つってんだろ

479 名前:デフォルトの名無しさん :2006/06/26(月) 01:54:36
>>472
ちょっとちがう。

メンバ → C用語
仮想 → Simula用語
メソッド → Smalltalk用語

ちなみに、C++は仮想関数の概念をSimulaから拝借している。
で、C++の仮想メンバ関数は、Smalltalkのメソッドに相当するってそれだけの話なような…。
ちなみにJavaはSmalltalkの用語(メソッドとか、スーパー/サブクラスとか)を拝借している。

OOはあまり関係ない(ストラウストラップのオブジェクト指向なのにメソッドなJavaの例もあるし…)。
強いて言えば、メソッドはケイのオブジェクト指向、仮想関数はストラウストラップのオブジェクト指向。

ttp://d.hatena.ne.jp/sumim/20040525/p1

480 名前:デフォルトの名無しさん :2006/06/26(月) 02:18:04
for (int i = 0 ; i < 3 ; ++i) {}
みたいな感じでループ変数の加算時の記述を
「++i」
としているソースばかりですが、
これは
「i++」
でも同じですよね?どうして皆そろいもそろって
++i
と統一しているのでしょうか?
単なる慣習?
それとも明確な理由があるの?

481 名前:デフォルトの名無しさん :2006/06/26(月) 02:20:02
>>479
お前こそ、ちょっと違わないか?
「メンバ関数→C++用語」は結局のところ、お前の定義でも正しんだろ?
メソッドだって、由来がどうあれ、C++のことで議論してる時にメソッドって言ったら
普通はOO用語としてのそれであって、Smalltalk用語のそれじゃないだろ。

482 名前:デフォルトの名無しさん :2006/06/26(月) 02:33:36
>>480
C言語プログラマは習慣的に i++ って書くけど、
C++プログラマは意識的に ++i って書く。
↓理由はこのへんでも見れ。
ttp://www.tietew.jp/cppll/archive/233

483 名前:デフォルトの名無しさん :2006/06/26(月) 02:40:04
>>482
馬鹿?

484 名前:デフォルトの名無しさん :2006/06/26(月) 02:40:09
へえ、だからC++プログラマは無駄が多いんだ、納得。

485 名前:デフォルトの名無しさん :2006/06/26(月) 02:53:09
>>483
(´・ω・`) 君、大丈夫?

486 名前:デフォルトの名無しさん :2006/06/26(月) 02:58:20
++i の理由については、Effective C++にも書いてあるだろ。

487 名前:デフォルトの名無しさん :2006/06/26(月) 03:16:18
じゃi++と++iって書いたときの違いは何?

488 名前:デフォルトの名無しさん :2006/06/26(月) 03:23:59
T &operator ++() とT operator ++(int)の違い

489 名前:デフォルトの名無しさん :2006/06/26(月) 03:29:36
効率だよ効率!最適化コンパイラなら同じコードを吐くかもしれんけど。

490 名前:デフォルトの名無しさん :2006/06/26(月) 03:32:31
>>488-489
アホ

491 名前:デフォルトの名無しさん :2006/06/26(月) 03:41:27
揃いもそろって読解力ない奴ばかりだな。
>>480をもう一度ちゃんと嫁

492 名前:デフォルトの名無しさん :2006/06/26(月) 03:49:50
まさかとは思うけど
演算子の前置・後置による実行順序のこと言ってんの?

493 名前:デフォルトの名無しさん :2006/06/26(月) 04:09:14
>>492
お前は>>480を読めていない。読んだ気になっているだけだ。
最初の2行を100回嫁

494 名前:デフォルトの名無しさん :2006/06/26(月) 06:54:49
むしろ>>491=493が
皆の言ってる意味を理解していないんだよ。

495 名前:デフォルトの名無しさん :2006/06/26(月) 07:18:41
>>480
全員が全員、同じ理由ってわけではないだろうけど、たとえば・・・

C++には演算子オーバーロードがあるから、自作のクラス(イテレータとかね)に
独自のインクリメント演算子の動作を実装するという経験をしている人間も多い。
で、++hogeは通常「何らかの意味で"自身をインクリメント"して"自身の参照を返す"」のに対し、
hoge++には「"自身のコピーを作って"から"自身をインクリメント"して、"コピーを値で返す"」
という動作をさせることが多く、これは前置と比べると明らかにコストがかかっている。

そういうコーディングを経験していると、「前置でも後置でも意味的には変わらない」状況下では、
ほとんど手癖として「前置を選んでおく」習慣が身に付く。
別の言い方をするなら、operator++(int)の実装を経験すると、前置と後置を「同じようなモノでしょ」
と抽象的に同一視する気が(完全にとは言わないけど)失せてしまう。
ちなみにこの習慣の結果、「後置は後置でなければならない理由が無い限り登場しない」
という法則がソースコード内に生まれるので、ほんの僅か可読性も上がるかもしれず、
そっちの理由でも習慣はより強固なものになっていく。

・・・なんて背景が考えられるね。いやまぁ要するにこれ、俺のケースなのだけど。

496 名前:デフォルトの名無しさん :2006/06/26(月) 07:51:26
漏れも漏れも

497 名前:デフォルトの名無しさん :2006/06/26(月) 07:59:41
固定概念って恐いな

498 名前:デフォルトの名無しさん :2006/06/26(月) 08:14:32
自分も前置を可能な限り使っているけれど、
興味本位で、VC8のコンパイラの吐くコードを見てみたら、

Hoge x ;
++x ;
x++ ;

どちらもインライン展開すると、同じコードになっていた。
まあ、戻り値を使っているわけではないし、
後置インクリメントは、単に自分自身のコピーをとっておいてから、
前置インクリメントを呼び出すという実装だったから、当然かもしれないけど。

でもやはり、前置を使う。
Cで後置が多かった理由は何だろう。
K&Rのコードに、主に後置が使われているからかな。

499 名前:デフォルトの名無しさん :2006/06/26(月) 11:32:40
>>498
スタックについて考察してみればわかるよ。

500 名前:499 :2006/06/26(月) 11:58:09
ちなみに>>495 のような解釈は、演算子のオーバーロード自体を
C++で記述するからこそ発生する矛盾というか、要は後置インクリ
メントと前置デクリメントは、C/C++の性質によるものじゃないという
ことだね。


■過去ログ置き場に戻る■ 1- 前250 次250 最新50
DAT2HTML 0.33f Converted.