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


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

C++相談室 Part4
251 名前:デフォルトの名無しさん :02/01/06 03:59
>>250 その通り。きみのやりたいことは c = i + '0'; で実現できるね。

252 名前:デフォルトの名無しさん :02/01/06 04:03
>250
正解!!オメデトウ!

まぁお主のやりたい事は sprintf を使うのがてっとり早いかな.
# フレーム合戦はヤめような(藁 > all



253 名前:デフォルトの名無しさん :02/01/06 05:26
>>249
激しく同意

254 名前:デフォルトの名無しさん :02/01/06 08:07
>>243
data()で返される領域は、複数の string で共有してる可能性があるので、書き換えると大変なことに(だから const なんだよ、無闇に const 外すな)。

255 名前:デフォルトの名無しさん :02/01/06 08:39
>>252
> # フレーム合戦はヤめような(藁 > all
当事者その一だけど、それなりに実のある話になってるから良いじゃない。コピペ荒らしとか単調なレスの
繰り返しとかは不快なだけだが、この程度のフレームはネットの華ってことで見逃してくれ。

(もう、だいたい話は出尽くしたと思うけど)

256 名前:252 :02/01/06 11:19
>255
悪ぃ悪ぃ.そーゆー意味じゃなかったんだ.
sprintf 厨房逝って良し!
とか言い出されるとメンド臭ぇなぁって思っただけ.

257 名前:243 :02/01/06 12:34
2ch来て1.5年くらいになるが、こんなに罵倒されたのは初めてだ(w
ファイルサイズ取得して、resizeして、freadにconst_castして放り込む・・・とかやってる奴は密かに多いと思うのだが。真似しちゃ駄目よ。移植性0よ。でも面倒だよなー。

他の逝ってよしテクとしては、setでのconst_castがあるなぁ。
setVal.find()の返り値はconstのiteratorなのだけど、これはコンテナの値を書き換えるとコンテナの順番が
入れ替わってしまうので、それを阻止するためのconst。
しかし、述語関数オブジェクトでは評価されていないコンテナのフィールドを書き換えたいときがある (こ
の場合コンテナの順番は変更されない)ので、こういうときにconst_castでiteratorの constを除
去してみる。
ちなみにVCのSTLはconst_iteratorではなく普通のiteratorを返してくるのでこの逝ってよし技は
不要。というかVCユーザは無意識のうちにこの技を使っていることが多いと思われ。

258 名前:デフォルトの名無しさん :02/01/06 14:32
>2ch来て1.5年くらいになるが、
だったら適当に改行入れることを覚えろ。

>ファイルサイズ取得して、resizeして、freadにconst_castして放り込む・・・とかやってる奴は密かに多いと思うのだが。真似しちゃ駄目よ。移植性0よ。でも面倒だよなー。
勝手に思いこんでるだけだろ。
2chに来て1.5年以上になるが、basic_stringに対して
こんなふざけた扱い方をしている人間は初めて見たよ。

やるなら、vector<char>でreserve()してbegin()か&v[0]を放りこむ。
それなら(保証されていなくても)密かにやってる人間はたくさんいる。
参照カウンタの考え方を理解していれば、
basic_string::c_str()の書き換えなんか絶対やらない。
作業バッファとして用いるなら、basic_stringは効率が悪い。

259 名前:デフォルトの名無しさん :02/01/06 14:48
set.find()がconst_iteratorを返す実装ってどれ?

260 名前:デフォルトの名無しさん :02/01/06 15:12
>>259
SGI STL

261 名前:259 :02/01/06 15:33
SGIやRogueWaveは確かめたんだけど。

俺の持ってるのが古いのかと思って、http://www.sgi.com/tech/stl/download.htmlから
Ver3.3を落としてみたけど、stl_set.hでは
iterator find(const key_type& __x) const { return _M_t.find(__x); }
となっている。

262 名前:259 :02/01/06 15:35
それとも、見るべきファイルが違うかな?

263 名前:デフォルトの名無しさん :02/01/06 15:44
手元にある範囲では VC++6 のと BCC5.5 のと gcc3 のと SGI のは、
constじゃないiteratorを返すなぁ…。

264 名前:デフォルトの名無しさん :02/01/06 15:59
「243、問答無用で逝ってよし」状態

265 名前:デフォルトの名無しさん :02/01/06 16:15
>>261
それ、上のほうで

typedef typename _Rep_type::const_iterator iterator;

とか定義されてない? 俺が見てるのは gcc 2.95.3 についてくる SGI STL なんだけど、これは
find でとってきたイテレータ経由で値を書き込もうとすると、

set.cpp:9: assignment of read-only location

と怒られる。

266 名前:259 :02/01/06 16:23
確かになってた。なんでだろ?
setだと、
typedef typename _Rep_type::const_iterator iterator;
typedef typename _Rep_type::const_iterator const_iterator;
mapだと、
typedef typename _Rep_type::iterator iterator;
typedef typename _Rep_type::const_iterator const_iterator;

267 名前:259 :02/01/06 16:53
ver2.03も落としてみたけど、この頃('97.9)から
typedef rep_type::const_iterator iterator;
になってるね。
gccだと、プリミティブ型でなければコンパイルは出来るみたい(警告あり)。
もちろん、Compareに直結する要素を書きかえると順序が狂う。

268 名前::02/01/06 17:39
残念!>>243君は、まるきり逆で、「const_castすること」
がポータビリティのある書き方である。
詳しくはEffective STL Item22を見よバカチンども(゚Д゚)!
const_castを使わない方法も載ってるよ。

269 名前:デフォルトの名無しさん :02/01/06 17:51
>>268
はいはい、逝っちゃってる人はMeyersのケツの毛でも煎じて飲んでいて下さい

270 名前::02/01/06 18:13
cout<<
で出力する値の、整数部、小数部の桁数を指定するのはどうするのでしょう。

Cの
printf("%4.9lf",1234.123456789); みたいなの。

271 名前:デフォルトの名無しさん :02/01/06 18:43
>>270
マニピュレータ使え

272 名前:デフォルトの名無しさん :02/01/06 18:51
正直、そういう時はすぐにsprintfを使ってしまう・・・

273 名前:デフォルトの名無しさん :02/01/06 22:37
>>272
微妙に同意。私も strstream は使わずに snprintf してしまう方だ。

stream 使えば

1. 型安全で
2. 入出力先に依存しない汎用的な記述ができる

のは分かってるんだが、書式指定が読みにくすぎて辛いんだよなぁ。

double d;
int n;
printf("%5.1f / %d\n", d, n);
cout << setw(5) << setprecision(1) << setiosflags(ios::fixed) << d << " / " << n << '\n';

274 名前:デフォルトの名無しさん :02/01/06 23:10
昔、こんな感じの
cout << formatFix(5, 1) << d;
マニピュレータを作ろうとしたこともあったが、
sprintf 系の手軽さの前に挫折した。堕落のついでに
ostream に sprintf メソッドが欲しい今日この頃。

275 名前::02/01/06 23:54
助言ありがとうございました。無事、望んでいた動作をするプログラムができました。

I/Oストリームを使ったファイル出力法しか今は理解していないので、
ストリームを使った桁処理が知りたかったのですが、
持ってる参考書のマニピュレータの項には、setw(int x)は載ってたけど、
setprecision(int x) が未掲載で、小数部の桁を操作する関数名が分からず困ってたのです。

276 名前:デフォルトの名無しさん :02/01/06 23:57
軽量ストリームとか汎用ストリームとか、次のC++標準には入れて欲しいな。
でも何年かかることやら...

277 名前:デフォルトの名無しさん :02/01/07 00:00
>>274
cout << format(d, 5, 1);
みたいのじゃないのか。

278 名前:デフォルトの名無しさん :02/01/07 05:57
class hoge{
 private:
 foo f;
};

class foo{
...
};

こうすると型名が必要、宣言に;がないとコンパイルエラーが出てしまうの
ですが、クラスfooをクラスhogeの前に書く方法以外でできる方法はあるの
でしょうか。教えて下さいませ

279 名前:デフォルトの名無しさん :02/01/07 06:14
>>278
ない。
foo fをfoo* fにしてもよいなら
hogeの前にclass foo;と書けばよい。

280 名前:デフォルトの名無しさん :02/01/07 06:19
>>279
「前」に書かなくても

class hoge
{
  class foo* pFoo;
...
};

で OK。あと

class hoge
{
  class foo;
  foo* pFoo;
};

だと nested class である hoge::foo を宣言したことになるので注意。

281 名前:278 :02/01/07 08:05
>>279
>>280
勉強になりました。ありがとうございました

282 名前:デフォルトの名無しさん :02/01/07 08:35
>>280
わざわざ実務的に有用な方を教えてるのに、
よけいなフォロー入れないで頂戴。

283 名前:デフォルトの名無しさん :02/01/07 09:07
実務的に有用?
スタイルの問題だとおもうけど?

284 名前:デフォルトの名無しさん :02/01/07 22:19
a = b+++c; って、色々解釈できると思うんだけど、どう解釈すべきか、規格かなんかで決まってます?それかエラー?

285 名前:デフォルトの名無しさん :02/01/07 23:02
>>284
ふつー
a = b++ + c
だと思うけど、人に聞く前にとりあえずコンパイラ通せ

286 名前:284 :02/01/07 23:08
>>285
う。そうでした。
a=b+++c; は a = b++ + c; でした。
ついでに試してみると a=b++++c; とか a=b+++++c; はエラーでした。
C++Builder 5 にて。

287 名前:デフォルトの名無しさん :02/01/07 23:40
>>284
演算子の優先順位というのがあって、例にあるものだと、
「後置++」>「前置++」=「単項+」>「加算+」>「代入=」という順になる。
よって、「a=b+++c;」は「a=((b++)+c);」と評価される。

「a=b++++c;」とか「a=b+++++」だと、
「a=((b++)++)」の段階でアウトになる。
# 「b++」の結果、つまり整数はインクリメントできない

288 名前:デフォルトの名無しさん :02/01/07 23:56
VC++6.0 だと DLL の中で std::map の代入演算子が利かないってマジですか?
というか利かなかったんですけど、それってどこが悪いんですか?
ここに書いてあるようにマイクロソフトですか? それとも僕の脳ですか?

ttp://www.nantekotta.com/stl.html

289 名前:デフォルトの名無しさん :02/01/08 01:18
>>288 アプリとDLLの両方を MSVCRT.LIB リンクで統一しているか? SP5 を当ててるか?

290 名前:デフォルトの名無しさん :02/01/08 02:18
b+++c が (b++)+c になるのは、オペレータを出来るだけ長いものからマッチングする字句解析の規則から。
b の後のオペレータは + と ++ とどっちにもマッチングするけど、 ++ のほうが長いから、そう解釈される。
優先順位できまるなら b+++++c は 加算+より優先順位の高い前置++が優先されて、 b++ + ++c と解釈されるはず。
実際はそうでない。

優先順というのは a + b * c のような時 * のほうが + より優先順位が高いから a + (b * c) になるときの規則。
字句解析が終わった後の構文解析の規則。

291 名前:278 :02/01/08 13:42
class hoge{
 private:
 int h_size;
 class foo *h_foo;
 public:
 hoge(){ h_size=0; }
 void setFoo(class foo *f){ h_foo=f; }
 int get_h_size(){ return h_size; }
 void h_print(){ cout<<h_foo->get_f_size()<<endl; }
};

class foo{
 private:
 int f_size;
 class hoge *f_hoge;
 public:
 foo(){ f_size=1; }
 void setHoge(class hoge *h){ f_hoge=h; }
 int get_f_size(){ return f_size; }
 void f_print(){ cout<<f_hoge->get_h_size()<<endl; }
};

二つのクラスの関連を双方向にしたいのですが、上記だと
型が宣言されていないため 'get_f_size' は 'foo' のメンバーではない(関数 hoge::h_print() )
という、コンパイルエラーが出てしまいます。これは関連の実装が間違って
いるのでしょうか?それともアクセスの仕方が間違っているのでしょうか?
教えて下さいませ

292 名前:デフォルトの名無しさん :02/01/08 13:52
>>291
void hoge::h_print() と void foo::f_print() の実装を
書く場所がまずい。クラスの外に書け。

293 名前:デフォルトの名無しさん :02/01/08 14:17
名前と年齢を入力し、ハッシュ(チェイン法)に登録する。'-'が入力
されると登録を入力し、次に入力された年齢を、ハッシュ法で検索
し、あればその人の名前を出力するプログラムを作成せよ。ただし
ハッシュ表の大きさは9とする。

学校でこの問題を出されましたが、さっぱり分かりません。おまえら
教えてくださらないでしょうか。

294 名前:278 :02/01/08 14:18
>>291
クラスの外に書くとは
class hoge{
...
void h_print();
};
void hoge::h_print(){ ... }
という事でしょうか?これでも同じエラーが出るのですが

295 名前:デフォルトの名無しさん :02/01/08 14:42
>>293

宿題みてあげるっ
http://pc.2ch.net/test/read.cgi/tech/1007902384/

で怜のご機嫌を伺うか

[[ハッシュ法統合スレッド]] vol.1
http://pc.2ch.net/test/read.cgi/tech/1005461137/

296 名前:291 :02/01/08 15:53
>>278 クラスの外に書くとはこういうことだよ

#include <iostream>
using namespace std;

class hoge{
  private:
  int h_size;
  class foo *h_foo;
  public:
  hoge(){ h_size=0; }
  void setFoo(class foo *f){ h_foo=f; }
  int get_h_size(){ return h_size; }
  void h_print(); //{ cout<<h_foo->get_f_size()<<endl; }
};
class foo{
  private:
  int f_size;
  class hoge *f_hoge;
  public:
  foo(){ f_size=1; }
  void setHoge(class hoge *h){ f_hoge=h; }
  int get_f_size(){ return f_size; }
  void f_print(); //{ cout<<f_hoge->get_h_size()<<endl; }
};
inline void hoge::h_print(){ cout<<h_foo->get_f_size()<<endl; }
inline void foo::f_print(){ cout<<f_hoge->get_h_size()<<endl; }

297 名前:278 :02/01/08 16:32
>>291
で、できました!ありがとうございました
今やっとコンパイルエラーの意味が分かりました(汗)

298 名前:296 :02/01/08 17:21
>>297 おめでとう。
ちなみに、2chにソースを書き込む際にはインデントを、
全角スペースじゃなくて、&nbsp; に置き換え希望〜。

299 名前:284 :02/01/08 21:17
>>290
よく解る説明を有り難う。参考になります(Javaも同じなのかな?スレ違いだけど)

300 名前:デフォルトの名無しさん :02/01/08 21:20
>>298
ええーっ、面倒い〜・・・
いや言いたいことは解るけど
かちゅーしゃにそういう機能付かないかなと密かに祈りを

301 名前:デフォルトの名無しさん :02/01/08 22:14
>>300 かちゅーしゃ は使ったことがないから知らんけど、
        ここの板にスレのある 「2chブラウザ」 は、
        スペースやタブを &nbsp;に 変換する機能あるよ。

302 名前:デフォルトの名無しさん :02/01/08 22:22
同じディレクトリにある全ての.hファイルを
1度にincludeする方法ってありませんか

303 名前:デフォルトの名無しさん :02/01/08 22:28
ありません。

304 名前:デフォルトの名無しさん :02/01/08 22:43
VC6.0 だが fstream の tellp, tellg が機能しない!

305 名前:デフォルトの名無しさん :02/01/08 23:04
>>302
Makefile に、次のようなターゲットを仕込んでおけば?

all.h:
 ls -1 *.h | perl -lne 'print qq(#include "$_")' > all.h

distclean:
  rm -f all.h

306 名前:293 :02/01/08 23:13
>>295

ありがとうございます。
とりあえず統合スレの方見てみます。

307 名前:デフォルトの名無しさん :02/01/09 10:29
>>300-301
:%s/\t/&nbsp;&nbsp;&nbsp;&nbsp;/g

308 名前:304 :02/01/09 19:05
スマソ
キャストしないで printf してた。

309 名前::02/01/09 19:31
ofstream File[2];
File[0]("abc01.txt");
File[1]("abc02.txt");

↑これでエラーでたのですけど、不正な書式なのでしょうか。

310 名前:デフォルトの名無しさん :02/01/09 19:39
>>309 こうするのダ
ofstream File[2];
File[0].open("abc01.txt");
File[1].open("abc02.txt");

311 名前:デフォルトの名無しさん :02/01/09 19:41
placement newが云々、という話は関係ないかね?

312 名前::02/01/09 19:45
>>310
どうも。解決できました。

313 名前:デフォルトの名無しさん :02/01/10 00:07
質問です。
例えばclass Addressというものがあるとして、

Address a;
struct in_addr addr = a;

というのをどうしても成立させたいのですが、
class A : public in_addr {
  ...
}
というような、in_addrを直接継承する以外の方法では
可能でしょうか。

http://forums.belution.com/ja/vc/000/006/08s.shtml
のURLに同じような質問があったのを発見し、そこでは
解決策がいくつか出ているみたいですが、具体的に
どうオペレータオーバーロードすれば良いのか分からないです。

314 名前:デフォルトの名無しさん :02/01/10 00:22
void operator =(in_addr &left, const Address &right )

315 名前:デフォルトの名無しさん :02/01/10 00:30
addr = *(struct in_addr *)&a
毎回やるのが面倒だったら、operator in_addr& () でも作っとけば?

316 名前:デフォルトの名無しさん :02/01/10 00:34
>315
上のは、aがin_addrを直接継承してないと無理な気が‥‥

317 名前:デフォルトの名無しさん :02/01/10 00:52
やってみた?
C形式のキャストが嫌なら、アドレスをreinterpret_castでどーぞ

318 名前:デフォルトの名無しさん :02/01/10 01:02
>>313
>>314 が正解だろうね。でも generic programming で必要、とかいう理由がないのなら、
単純に class Address に copyAddr( in_addr& addr ) というようなメソッドを定義して
それを使ったほうがプログラムは分かりやすくなると思うな。

319 名前:315 :02/01/10 01:07
in_addrを要求するsocetAPIにAddressを渡すという話だと思ってた。違ったか。

320 名前:315 :02/01/10 01:36
言い訳すると、実際にsocket関係は、共用体じゃないのに
struct sockaddr_inで値を設定して
struct sockaddrにキャストして渡したり、ってことをするわけさ。
だから、Addressもその一種だと思ってしまったのさ。
こんな感じ。(WinSock2.0プログラミングのgethttp.cppより)
 saServer.sin_family = AF_INET;
 saServer.sin_addr = *((LPIN_ADDR)*lpHostEntry->h_addr_list);

つまり、サイズ等は一緒でそのままキャストで渡せるものが入っていると
勝手に想像してしまったわけ。
ごめんね。

321 名前:313です :02/01/10 01:36
みなさんありがとうございます。

class Address {
  public:
    operator in_addr() const;
}

Address::operator in_addr() const {
  struct in_addr addr;
  ...
  return addr;
}
のようなものを用意したらできちゃいました。なぜか。
コンパイラ(gcc-2.96)も文句を言わないし、出来た実行ファイルの
動作も期待通りになりました。

でまた質問なんですけど、なんでこれ返り値が必要無いんでしょうか。

322 名前:デフォルトの名無しさん :02/01/10 01:43
 メンバ関数をヘッダファイル外でインライン指定したときの
コードについて質問です。

// HOGE.h
class HOGE{
public:
  HOGE(){}
  virtual ~HOGE(){}
  int Boo(int);
private:
  int foo(int);
}

// HOGE.cpp
inline int HOGE::foo(int n){
  return n + 5;
}
int HOGE::Boo(int n){
  return foo(n);
}

 こう書いたとき、HOGE.hをインクルードしたソースファイルが
HOGEオブジェクトを創るときは、どうなるんでしょう?
HOGEオブジェクトは、fooを呼び出すための関数ポインタを
持っちゃうんですかね? fooがpublicだったら結果は
違ってきますかね?
 fooが有るときと無いときで、sizeof(HOGE)は違う値を
返しますか?
 どなたか、ご教授ください。m(__)m

 「コンパイラに通して調べろよ」ってのはナシで。
マシンの不都合で、1ヶ月ぐらいはコンパイルできないんす。(T_T)
あ、もしコンパイラ依存の問題なら、VC++の場合でお願いします。

323 名前:デフォルトの名無しさん :02/01/10 01:47
>>322
どこに関数ポインタを宣言してる?

324 名前:デフォルトの名無しさん :02/01/10 01:53
>>321
キミのコードは正しいよ。自信がないみたいだから、「なぜ」正しいかを
勉強しておいたほうがよいと思うけど。

ただ、型変換オペレータは、思わぬところで暗黙のうちに働いてしまう
ことがあるので注意したほうがよい。

あと、型変換オペレータに戻値の指定がないのは、まあコンストラクタと
似たようなものだから、かな。

325 名前:デフォルトの名無しさん :02/01/10 03:29
>>323
仮想関数へのポインタと思われ。

>  fooが有るときと無いときで、sizeof(HOGE)は違う値を返しますか?
仮想関数が有るか無いかで、オブジェクトのサイズは変わってくる。C++ の実装に関して詳しく知りたい
なら Inside the C++ Object Model という書籍を買ってきて読みましょう。

326 名前:デフォルトの名無しさん :02/01/10 09:33
>>314
ん? クラスのメンバーじゃない operator= って定義できたっけ?

327 名前:デフォルトの名無しさん :02/01/10 10:04
できねーな。

328 名前:デフォルトの名無しさん :02/01/10 16:58
>>278さんに便乗して質問です。

>>296のソースだと、新しいクラス(aaa)をもうひとつ追加してそれらが
相互に通信しあうとすると、各クラスにそれぞれ、
1.メンバ変数の追加
class aaa* m_aaa;
2.ポインタ登録用のメソッドを追加
void setAaa(class aaa* aaa) { m_aaa = aaa;}
3.Aaaを使用するメソッドを追加。
void aaa_print();

の3工程必要になりますよね。

もうひとつの方法として、すべてのクラス(のポインタ)をグローバルに
宣言して、共通ヘッダに押し込めてしまうという手法が考えられます。

上記の例だと
extern class foo* g_foo;
extern class hoge* g_hoge;
extern class aaa* g_aaa;

そうすると、上記工程の1、2は省略できて3の工程のみにできます。
実際はclass aaaの定義ファイルのインクルードが必要ですが。

というように、この方法は大変便利なんですが、インスタンスの変数名g_aaaが、
決めうちになってしまう辺りが、どうにも気持ち悪いと自分では思ってます。

で、双方向関連を表現するのに、上記の2つの方法以外に
何かいい方法ご存じないでしょうか?

329 名前:デフォルトの名無しさん :02/01/10 17:56
>>325

322のどこに仮想関数が?

330 名前:デフォルトの名無しさん :02/01/10 18:51
>>329
あえて言えばデストラクタ?

っつか、たぶん求めてる答えは

 仮想関数があると仮想関数へのポインタを格納した vtbl が作られ、各インスタンスには vtbl を指す
 vptr が格納される。よって仮想関数なしの場合に比べると、インスタンスのサイズは増える。

 仮想関数が無い場合には、メソッドはリンク時に静的に解決され、関数ポインタを介さずに直接呼び
 出される。

という話のような気がする。>>322 のコードに限って言えば、デストラクタが仮想なので、すでに HOGE
のインスタンスには vptr が含まれることは確定。したがって foo() があってもなくても、仮想でも非仮想
でも HOGE のサイズには影響しない。

331 名前:観筒 :02/01/10 21:47
>>325
>Inside the C++ Object Model
 amazonで探したら、洋書しか出てこなかったんですが…。和訳されてないんですかね?
へたれアマグラマなんで、「英語で読め」は勘弁してください。(T_T)

>>330
 あー、俺が勘違いしていた部分まで踏まえて、完璧な回答ありがとうございます。
 なるほどー、virtualでないメンバ関数は、インスタンスのサイズに影響はないんですね。
てっきりインスタンスがメンバ関数まで丸ごと抱えているのかと思ってました。
 あ、もしかして、メンバ関数を呼び出すときって、インスタンスのアドレスをスタックに
積んでから呼び出してるんですか? それで、メンバ関数内では、渡されたインスタンスの
アドレスをthisとして扱う…と。そういう仕組みですか?

 と。そこで、生まれてきた疑問を。

class HOGE{
public:
    int Boo(int){cout << foo();}
private:
    virtual const char* foo(void){return "ほげ";}
}

class HOGE_EX : public HOGE{
private:
    virtual const char* foo(void){return "ほげEX";}
}

int main(void){
    HOGE_EX HE;
    HE.Boo();
    return 0;
}

 この場合、表示されるのは「ほげEX」ですか? こういう風に基底クラスの
内部で仮想関数が呼ばれる場合のオーバーライドの例って、見たことがないんです
けど、上の俺の考えが合ってるなら、「ほげEX」と表示されるはずだと思うんですが…。

332 名前:デフォルトの名無しさん :02/01/10 22:21
>>331
>アドレスをthisとして扱う…と。そういう仕組みですか?

そういう仕組みです。

>この場合、表示されるのは「ほげEX」ですか? こういう風に基底クラスの

そーです。ちゃんと派生クラスのが呼ばれます。

333 名前:観筒 :02/01/10 22:50
>>332
 ありがとうございました! おかげで、クラスの実装の詳細に関する疑問が
すっきり解決しました。

334 名前:デフォルトの名無しさん :02/01/11 00:07
インスタンス生成関数内で、その戻り値と同じ型の変数に自分自身
のインスタンス生成関数を引数NULLで呼ぶとその変数の中身は
どうなるの?

335 名前:デフォルトの名無しさん :02/01/11 00:18
>>328 グローバル変数に持つ(全インスタンスで共有)のと、
メンバに持つ(各インスタンスが持つ)のではクラスとして機能が異なる。
コーディングの手間を省くために機能変更しちゃダメだよ。

336 名前:デフォルトの名無しさん :02/01/11 00:30
>>334
日本語がよくわからん。コードを書いたほうが早いかも。

C++ のコンストラクタには返り値ないよ、念のため。

337 名前:デフォルトの名無しさん :02/01/11 00:37
>>336
すまん。書いてからそう思った。
中身忘れたんで明日またソース見てくる。

338 名前:超初心者 :02/01/11 10:53
Solaris8,forteC++を使っていらっしゃるかたいらっしゃいますか?
stringを使って作ったソースでオブジェクトを作って、そのオブジェクトを
dlopen で開こうとするとエラーになってしまうのですが・・・
なにが悪いのか分かりません・・・
ご指摘お願いいたします。

意味を持たないソースだけど例えばこれのオブジェクトをdlopenで開けないということです。
#include<stdio.h>
#include<string>
using namespace std;
int main()
{
string k("test");
return 0;

}

339 名前:デフォルトの名無しさん :02/01/11 13:02
>>338
一応指摘しておくけどこういう場合はオブジェクトって
言わないでライブラリって呼ぶんじゃないかな

まずmain()はダイナミックロード出来ないと思う
あとはコンパイルオプションを確認しよう

340 名前:デフォルトの名無しさん :02/01/11 13:57
>>339
C++ と dlopen を一緒につかうなんてオトコのコです.
extern "C" について調べましょう.

341 名前:超初心者 :02/01/11 14:38
返信有り難うございます。
もうちょっと具体的にエラーの原因を書きますので
よろしかったら再びアドバイスいただけると助かります。

1 いくつかのオブジェクトファイルを使って一つの動的共有ライブラリ(仮にtest.soとしておきます)を作成します。
2 C版APIを使ったソースでtest.oを使用する。
3 2の過程でdlopen()が使われている。
4 dlopen()が失敗する原因はtest.soのなかで使用している
「std::basic_string<char,std::char_traits<char>,std::allocator<char> >::__nullref」
というシンボルが参照できないため再配置エラーとなって失敗している。

というような状態です。
で、>338で作ったものでもまったく同じエラーが出ました。
ちなみに他のOSの他のコンパイラではエラーはおきていません。

というわけでこのコンパイラ特有の何かだと思うのですが・・・
まず、(3)、(4)の条件からどのあたりに目をつけていけば良いか
アドバイスいただけたらよろしくお願いいたします。

342 名前:デフォルトの名無しさん :02/01/11 21:21
>>339
> 一応指摘しておくけどこういう場合はオブジェクトって
> 言わないでライブラリって呼ぶんじゃないかな
個人的には、ライブラリと言うと複数のオブジェクトをまとめたファイルって感じがするなぁ。単一モジュールだけ
ファイルに切り出してダイナミックローディングするというのは割と良くある。(デバイスドライバとか)

>>341
std::basic_string<char, std::char_traits<char>, std::allocator<char> >::__nullref が、処理系付属の C++ ライブラリ
かどこかで定義されてるんだと思う。

ELF オブジェクトだと依存関係を書き込むセクションがあったと思うので test.o に

 このファイルは C++ 標準ライブラリ (libc++.so とか?) に依存する

旨を書けば良いんじゃない。とりあえずリンカのコマンドラインオプションをチェック。

343 名前:デフォルトの名無しさん :02/01/11 22:23
VCでinlineをつけるとエラーがでるよー
定義の方だけつければいいんだよね?
リンクでエラーが・・・

344 名前:デフォルトの名無しさん :02/01/11 22:38
>>343
> 定義の方だけつければいいんだよね?
定義をヘッダではなく実装 (*.cpp) に書いてないか?

345 名前:343 :02/01/12 00:36
>定義をヘッダではなく実装 (*.cpp) に書いてないか?
あれ、それじゃダメ?
inline void class::method(){
return;
}
って感じじゃダメだっけ?

346 名前:デフォルトの名無しさん :02/01/12 00:54
>>345
Class hoge{
public:
&nsbp;&nsbp;inline hoge & foo (const hoge & foo) {}
}

347 名前:デフォルトの名無しさん :02/01/12 00:56
nsbpじゃなかった…nbsp

348 名前:デフォルトの名無しさん :02/01/12 00:57
inline関数って使える??

349 名前:デフォルトの名無しさん :02/01/12 00:59
つーか、どうやら使えない奴がいる。

350 名前:デフォルトの名無しさん :02/01/12 01:21
>>348
「使える?」って、どういう意味だ。

351 名前:デフォルトの名無しさん :02/01/12 02:13
>>348
そりゃ、使えるだろ。

352 名前:デフォルトの名無しさん :02/01/12 02:58
>>345
そもそも *.cpp に書いたら、どうやって

 「インライン化」

するんだよ。インライン関数利用側をコンパイルする時点で定義が見えないとインライン展開しようがないから、
インライン関数はヘッダに書く。

ヘッダで関数を定義すると、複数のオブジェクトファイルにコンパイルされた関数が含まれる可能性がある。そ
こでリンカのシンボル重複定義エラーを避けるために、inline 関数は自動的に static リンケージになる。同一
翻訳単位外からは、inline 関数は見えない。

>>346
class 定義の中にメソッドを書く場合、暗黙のうちに inline 扱いされなかったっけ? あとクラス間で相互参照
が入る場合には、どうしても宣言と定義を分ける必要があるから、class 定義の中にインラインメソッドを書け
ないケースもある。

それ以前に、本当にインライン展開する必要があるのか、プロファイラにかけて調べてみろと言いたいけど。

353 名前:観筒 :02/01/12 12:05
>>345
 その書き方がOKなのは、inline関数の展開先が同じソースファイル内の
場合だけです。しかも、展開先は、定義の後にないといけません(だったはず)。
 つまり、定義時の(.cppファイルでの)inline指定は、クラス内でしか
呼び出さない関数(private関数です)だけで有効、と覚えておけば
いいのではないかと思います。
 クラス外部から呼び出される関数(public,protected関数です)を
inline展開したい場合は、ヘッダファイル内で関数本体を記述しないといけません。
コンパイラがinline展開をしようがないからです。
 >>322で定義時のinline指定を書いてるから参考にしてください。

354 名前:デフォルトの名無しさん :02/01/12 14:49
352,353
どうもです。
わかりました。

355 名前:デフォルトの名無しさん :02/01/12 17:17
>>353
>つまり、定義時の(.cppファイルでの)inline指定は、クラス内でしか
>呼び出さない関数(private関数です)だけで有効、と覚えておけば
>いいのではないかと思います。

弊害が大きすぎるような。

356 名前:デフォルトの名無しさん :02/01/12 17:55
VC++7(VC.NETやね)ではリンク時にコード生成(?)をすることができるらしい。
これを利用して、.cppに書いたコードのインライン展開ができるんだそうな。

357 名前:観筒 :02/01/12 21:36
>>355
 どんな弊害があるんですか?

358 名前:デフォルトの名無しさん :02/01/12 22:12
>>357
その説明だと private メソッドをインライン定義された public メソッドから呼び出す場合や、friend について
考慮してない。

それより、

「inline 関数は、それを利用する各々の翻訳単位に対して定義を与える必要がある」

と規格書っぽく言っておくのが正確かつ簡潔だと思う。ま、ヘッダに書いておけば確実ではある。

359 名前:デフォルトの名無しさん :02/01/12 22:20
インラインの、のけぞるくらいステキな例。

ttp://www.geocities.co.jp/SiliconValley-Cupertino/7774/c/sub/chap12.html

calculator.h

360 名前:デフォルトの名無しさん :02/01/12 22:52
>>359
ダメダメじゃん……。

top() で return NULL は間違いだし、スタックの overflow, underflow のチェックをカプセル化してないし、
pop() インターフェースは例外安全にしようがないし。

361 名前:観筒 :02/01/12 23:32
>>358
 ああ。「語弊が大きい」と言いたかったのですね。「弊害が大きい」なんて
いわれるから、なんかとんでもない副作用が出るのかと心配しました。(^^;
 「語弊が大きい」ことに関しては、確かにおっしゃるとおりです。

362 名前:358 != 355 :02/01/13 00:48
>>361
全然本題と関係ないが

 語弊=言葉の使い方が正しくないために生じる弊害

だぞ。弊害が大きいで何ら問題ないと思われ。

363 名前:デフォルトの名無しさん :02/01/13 17:56
>>331
> >Inside the C++ Object Model0
>  amazonで探したら、洋書しか出てこなかったんですが…。和訳されてないんですかね?
邦訳はトッパンから出ている「C++オブジェクトモデル」だと思うんだが、トッパン出版部門活動停止に伴い
入手できなくなってる。cbook24.com で調べたら「絶版」だそうだ。

私は原書で読んだけど英語自体は平易だったよ。C, C++, アセンブラに関してある程度の技術的背景があ
る人間なら、楽に読めると思われ。

364 名前:デフォルトの名無しさん :02/01/13 18:31
>>560

> top() で return NULL は間違いだし

正解は、例外を投げるって事ですか?

365 名前:デフォルトの名無しさん :02/01/13 18:45
>>364
それ以前に

DATA_t top();

で return NULL はまずいんじゃ。

そもそも DATA_t の型によっては NULL からの暗黙の型変換ができないし、DATA_t が int としても「スタックトップ
に 0 が入っていたのか、それともスタックアンダーフローなのか」見分けがつかんよ。

366 名前:デフォルトの名無しさん :02/01/13 19:33
>>360>>365が言うように
push(),pop()のチェックになんでfull(),empty()を使わないの?とか、
pop()はスタックトップをもらえないの?
とか、なんでstackpos() がpublicなの?
とか、top()がNULL返すなよ、とか、いろいろツッコミ所あるけど、
CALCULATOR::Calculate(char *)みたら、そんなのふっとんじゃうよ、っていうのが俺の感覚。

367 名前:デフォルトの名無しさん :02/01/13 20:40
>>366
pop() でスタックトップを持ってこないのは正しい設計だけど (STL の stack もそうなってる)、Calculate() が
そんなに珍しい? スタックを使って LL(1) の構文解析を行うのはコンパイラ理論の書籍を紐解けば必ず載っ
ている常套手段だし。

368 名前:デフォルトの名無しさん :02/01/13 20:55
登録無料
http://sawayaka.mariansela.com
http://sawayaka.mariansela.com
http://sawayaka.mariansela.com

369 名前:デフォルトの名無しさん :02/01/14 05:19
>>367
そのCalculate()がヘッダに展開されてるの見て、なにも思わんか??
中身以前の問題だ。

370 名前:デフォルトの名無しさん :02/01/14 07:22
>>369
「ヘッダに展開」って、何? 結構長い関数だから、コンパイラがインライン化しない
可能性大だと思うんだが。こんな単にクラス宣言内に関数定義を書いただけの
何の変哲もない例をもってきて何がいいたいのかサパーリわからんが。

371 名前:デフォルトの名無しさん :02/01/14 07:27
>>370
いや、「何の変哲も無い」って思うなら、べつにいい。
あんたを説得するのが目的じゃないから。

372 名前:デフォルトの名無しさん :02/01/14 07:36
>>370はJavaモノだろうな、クラス宣言内しか書けないのだ体に染みてるから、しかたあるまいって。

373 名前:デフォルトの名無しさん :02/01/14 07:42
>>371
おれも何を問題としてるのかさぱーりわからん。
ちゃんと説明すべし。

374 名前:   :02/01/14 07:45

VC++6.0とBorland C++Builder 5 どっちがおすすめですか?

375 名前:デフォルトの名無しさん :02/01/14 08:03
宣言と定義を分離する意味がわからないやつには、サパーリわからんだろう。
わからんやつはヘッダに定義を全部押しこんどけ。

376 名前:デフォルトの名無しさん :02/01/14 08:59
>>359
stackクラス、サイズの違うのを作るとクラスが増えるのも、すごいかも。
まさか、最近のコンパイラは、こういうの最適化してくれるってこと、無いよね?

377 名前:デフォルトの名無しさん :02/01/14 09:23
>>375
なんだそんなことか(プ
そんなに大騒ぎする程の事でもないよお。

378 名前:376 :02/01/14 10:02
>>377
そんなに大騒ぎしたかな?
それよか、>>371の方が気になる…

379 名前:376 :02/01/14 10:10
>>371
ヘッダに何でも押しこんじゃったら、実行ファイルでかくなるわ、
実装を書きなおしたら呼んでるファイル全部コンパイルだわ、
インライン展開してくれるのかどうか、処理系依存になるわ、
お互いに呼び合ってるクラス同士は定義できなくなるわで、
いいところ全然無いって思うけど、そういうのは最近、問題にはならんのか?
つか、そういう書き方推奨していいもんなのか?
少なくとも、「なんの変哲も無い」は、センス無さ杉だろうな。

まあ、やっちゃだめだろうな、こういうでかい関数を宣言にいれるの。

宿題見てあげるスレにも出てきたサイトだけど、大学の授業でこういうの教えてるのが、やっぱ、一番の問題かし。

380 名前:デフォルトの名無しさん :02/01/14 11:19
>379はtemplateによるGenericProgrammingが耐えられないタイプ。
たとえば、donutのソースみて卒倒するタイプ。

381 名前:376 :02/01/14 12:17
>>380
どんなソースだって、それが必要であれば納得するよ。
チミは、必要でなくても、何かのマネをして満足するタイプかに?

382 名前:デフォルトの名無しさん :02/01/14 12:38
ハァ?
>いいところ全然無いって思うけど、そういうのは最近、問題にはならんのか?
>つか、そういう書き方推奨していいもんなのか?
への答えのつもりだが。

383 名前:デフォルトの名無しさん :02/01/14 12:54
>>382
それは「ヘッダになんでも押しこんじゃったら」で始まる文なんだが…

384 名前:デフォルトの名無しさん :02/01/14 13:09
もちろん、その文脈で書いてるが。
それ以外の文脈で評価できる、とでもいうのか?

385 名前:デフォルトの名無しさん :02/01/14 14:13
>>384
「ヘッダになんでも押しこんじゃったら」で始まる文である以上、
無計画にそうする奴の話なんじゃないの?

386 名前:デフォルトの名無しさん :02/01/14 15:17
>>379
ライブラリなんかだと template だと「使わない関数はそもそもコンパイルされない」から、逆にコンパクトに
なるかも。そうでなくとも、逐一 bridge パターンを使って実装を隠蔽したコードよりはコンパクトになるし、実
行時ではなくコンパイル時に実装を固定して良いのなら、インターフェースとして使う抽象クラスの数を減ら
すこともできる。

前に10000 行ぐらいのコードをお遊びで可能な限り template 化して、不要になった抽象クラスを削ってみ
たことがあるんだけど、VC6 のコンパイラオプション /O1 (ファイルサイズ優先) でコンパイルしてみたが

1) 6% ぐらい実行ファイルのサイズが小さくなった
2) 20% ぐらいソースコードの行数が減った
3) 実行速度は有意な差は得られず
4) エディット&コンティニューのプログラムデータベースが使えなくなり
5) 実質ひとつの .cpp から、実装込みのすべてのヘッダを include したので、一行書き直すとフルビルド
  が必要になった

ってな感じ。最近のマシンだと 10000 行ぐらいならフルビルドしても問題にならんから、中小規模のプロ
グラムなら、まぁ良いのかも。

> お互いに呼び合ってるクラス同士は定義できなくなるわで
これだけど「template 関数は実際に呼ばれるまで実体化されない」規則がある都合か、確か書き方に
よっては出来た気がする。こんな感じだったかな。

template <typename TController>
class CTaskKeyboard
{
public:
  CTaskKeyboard(const TController& con)
  {}
};

class CController
{
  typedef CTaskKeyboard<CContoller> TTaskKeyboard;
  boost::scoped_ptr<TTaskKeyboard> m_spTaskKeyboard;
  ...
};

387 名前:デフォルトの名無しさん :02/01/14 15:27
 今、各種画像フォーマットから、ベタ画像に展開したデータを保持する
クラスCGraphicを作ってます。で、その中で、画像をロードする関数は
下のような実装になってます。

bool CGraphic::Load(const string& FileName)
{
    if(LoadBMP(FileName) != ERROR) return OK;
    if(LoadPNG(FileName) != ERROR) return OK;
    if(LoadJPG(FileName) != ERROR) return OK;
    (中略)
    return ERROR;
}
 こんな感じで処理してたんですが、だんだんと各種ロード関数が
増えてきて手におえなくなってきました。加えて、動的にロード関数を
増減させたくもなりました。そこで、この各種ロード関数を
なんとか外部クラスにしたいのですが、下のようなダサい実装しか
思い付きません。

bool CGraphic::Load(const string& FileName)
{
    if(CBMP::Load(this,FileName) != ERROR) return OK;
    if(CJPG::Load(this,FileName) != ERROR) return OK;
    if(CPNG::Load(this,FileName) != ERROR) return OK;
    (中略)
    return ERROR;
}

 ロード関数にCGraphicのthisを渡さなくちゃならないところが、
すごくダサい気がします。しかも、ロード関数が増えるたびに
CGraphic::Loadも書き直してるから動的な増減は達成できてないし。
 「CGraphicクラス自体は変更しない」「CGraphicのthisはどこにも
渡さない」と言う条件で、ロード関数を自由に増やすための手段は
ないものでしょうか?(Strategyパターンでなんかいけそうな
気がしたんですけど、結局thisを渡す以外は思い付かなかった…)

388 名前:367 :02/01/14 15:42
>>371
俺も分からん。解説頼む。

389 名前:デフォルトの名無しさん :02/01/14 15:45
>>387
struct GraphicLoader
{
  virtual bool LoagGraphic(const string& FileName, GraphicBuf& buf) = 0;
};

みたいなインターフェースを用意してやって、

1. GraphicLoader を継承した JpegLoader, BitmapLoader, etc.. を用意する
2. CGraphic を構築
3. 1 で作ったクラスをインスタンス化して CGraphic に登録
4. CGraphic::Load は、登録された GraphicLoader を順次実行するだけ

とでもしておけば。これなら Loader 部分だけ DLL に切り出すとかも可能になるし。

390 名前:387 :02/01/15 09:24
>>389
 StrategyパターンとIteratorパターンを合わせたやり方ですよね。
俺もそこまでは考え付いたんですよ。けど、それだと「thisを渡す」という
記述をしているのと、変わらないんですよね。
 何が言いたいのかって言うと、ロード関数がf(A,B)になるのを避けたいのです。
f(A,B)じゃなくて、A.f(B)にしたいな〜、と。

391 名前:387 :02/01/15 12:24
 解決しましたっ!

http://www1.odn.ne.jp/synsyr/prog_cpp0.html

 に、いい方法が載ってました。

 CGpraphicから派生したクラスにロード関数を作らせて、
CGpraphicのstaticな登録リストに、そのロード関数ポインタを
登録する。CGpraphicのLoadは、

for(list<LOADFUNC>::iterator p=s_Func.begin();
    p != s_Func.end();++p){
        if((this->*p)(FileName) != ERROR) return OK;
}

って感じで、登録されたロード関数を順次使っていく。
 こうすれば、「CGraphicを変更しない」「CGraphicのthisをどこにも渡さない」
「ロード関数を動的に増減可能」を達成できます。

392 名前:デフォルトの名無しさん :02/01/15 18:18
PSエミュで音を鳴らす方法を教えてください。
ヒントだけでもいいです。
お願いします。

393 名前:デフォルトの名無しさん :02/01/15 18:36
学校の課題なんですが、、、
A,B,Cの行列が与えられていて、2A-3B+Cを計算するプログラムをつくれっていう問題なんですが。
サッパリわかりません。
どなたか教えてください。

394 名前:デフォルトの名無しさん :02/01/15 18:41
>>391
>CGraphicのthisをどこにも渡さない
そっか、よかったね。

395 名前:デフォルトの名無しさん :02/01/15 19:26
>>366
> pop()はスタックトップをもらえないの?

例外安全って勉強しろよ。Exceptional C++でな。

>>360は、int pop();をスタックトップのデータ返すと勘違いしたな。
(まあ、今時アンダーフロー例外投げるだろうから無理もないが)

396 名前:デフォルトの名無しさん :02/01/15 19:39
>>395
>>366がどこまで考えてるかわからんが、俺はそもそもpop()って名前使うなって気がする。
>スタックトップのデータ返すと勘違いしたな。
な勘違いもわからないでもない。

397 名前:デフォルトの名無しさん :02/01/15 20:04
inlineの話がこういうことになるのか、掲示板っておもしろいのお

398 名前:デフォルトの名無しさん :02/01/15 22:32
>>396
> 俺はそもそもpop()って名前使うなって気がする。

つーか、例外安全を勉強しろって。
STLがなんでvoid pop(void);なのかさ。

399 名前:デフォルトの名無しさん :02/01/15 22:56
>>398
スタックポインタずらすのとスタックトップを返すのを両方やると例外セーフを保証できないのは知ってるよ。
pop()がスタックトップをくれないならtop()とremoveTop()とかにすればええやんって話だ。

400 名前:デフォルトの名無しさん :02/01/15 22:57
つーか「勉強しろ」だけ言ってないで、さわりだけでも説明すればいいのに…

401 名前:デフォルトの名無しさん :02/01/15 23:20
> >>360は、int pop();をスタックトップのデータ返すと勘違いしたな
そのとおり。

> つーか「勉強しろ」だけ言ってないで、さわりだけでも説明すればいいのに…
じゃあ、俺が責任を持って。

T pop();

と pop() で値を返すと、T の型によっては「コピーコンストラクタの実行に失敗」して、例外が飛んでくる
可能性がある。その場合に、

 スタック内部のインデックス値は更新したのに
 pop したインスタンスをどこでも受け取れない

ということで、例外安全じゃなくなるわけだ。Exceptional C++ とか GotW で検索すると詳しい記事が見つかる
と思われ。

402 名前:デフォルトの名無しさん :02/01/15 23:28
すみません。教えてください。(ガイシュツならすみません。)
次のような簡単プログラムなんですが、

#include <iostream>
#include <string>
using namespace std;

int main()
{
string s;
getline(cin, s);
cout << s << endl;
}

getlineで何か文字列を入力してエンターを1度押すと、それが出力されると
思うのですが、VC++ではエンターを2回押さなければ出力になりません。
BorlandC++では、1回で出力になります。
これだけはっきりしているとバグレポートでもあるかとも思うのですが、どうも
わかりません。VCとBCどちらが正しいのでしょうか?
それとも私が何か勘違いしてるでしょうか?

よろしくお願いいたします。

403 名前:デフォルトの名無しさん :02/01/15 23:47
>>399
そんな議論は10年近く前に終って、void pop(void);になった。

404 名前:デフォルトの名無しさん :02/01/15 23:51
>>402
ほんとだ。どうなってんだ?

405 名前:デフォルトの名無しさん :02/01/15 23:56
399>>403
10年? まぁいい。
STLがvoid pop(void);を採用したことと、ワタシがスタックトップを返さないpop()がきらいなのは、どう関係が?

406 名前:デフォルトの名無しさん :02/01/16 00:00
>>405
どうでもいい。もうその話題は終わってくれ。

407 名前:デフォルトの名無しさん :02/01/16 00:05
例外安全の話は、もっと聞きたいage

408 名前:デフォルトの名無しさん :02/01/16 00:05
for (wp = start; wp->next != NULL; wp = wp-> next)

(wpは変数)
どういう意味ですかね?

409 名前:デフォルトの名無しさん :02/01/16 00:08
>>402
Boarland C++が正しいです。cygwin/g++でももちろん一回。

410 名前:デフォルトの名無しさん :02/01/16 00:08
>>408
連結リストで検索

411 名前:デフォルトの名無しさん :02/01/16 00:09
>>408 リンクリストを末端直前までたどるってことだろ?
何が聞きたいの?

412 名前:デフォルトの名無しさん :02/01/16 00:11
>>402
VC+STLPortでは1回。
VCのライブラリが腐ってるに100まんこ。

413 名前:デフォルトの名無しさん :02/01/16 00:12
リンクリストって何ですか?今、勉強中の厨房ですみません。

414 名前:デフォルトの名無しさん :02/01/16 00:14
>>413
google いけ

415 名前:デフォルトの名無しさん :02/01/16 00:16
>>413
1回、調べたんですけど良くわかりません。教えてください。

416 名前:デフォルトの名無しさん :02/01/16 00:18
>>415
連結リストで検索すると、詳しいサイトがいくつか出てくるだろ? それを見ても分からないなら、
ここで聞いても分かるとは思えないので、諦めてください。

417 名前:デフォルトの名無しさん :02/01/16 00:22
そうか、リンクって連結って意味もあるんだったな・・・

どうりで、リンカエラーを連結エラーでいってる奴がいるわけだ

418 名前:デフォルトの名無しさん :02/01/16 00:30
連結エラーなんて始めて聞いた。そんな言葉聞いてもわからん。

419 名前:デフォルトの名無しさん :02/01/16 00:47
スタティックリンク→性的連結

420 名前:デフォルトの名無しさん :02/01/16 01:36
>>407

何でもかんでも例外安全がどうのと書かれてるとまた誤解を生むな。
再利用しないアプリケーションコードまでジェネリックにするこたあない。
ジェネリックにこだわるなら例外投げないオブジェクトの場合だけテンプレート
を特殊化したり特性ヒントを与えたりしてパフォーマンスを改善するとか
その辺まで言及しないと今時な感じがしない。

421 名前:デフォルトの名無しさん :02/01/16 02:00
C見習い中のものです。
ある関数の中で求めた値を
別のファイルの別の関数に渡すにはどうすればいいんでしょうか?
returnだと値は一つしか渡せないみたいだし、で息詰まっております。

422 名前:デフォルトの名無しさん :02/01/16 02:05
>>421
スレ違い
C 言語スレで聞きましょう

(C++ だとデザインパターンが、とか言い出すぞ。俺が)

423 名前:デフォルトの名無しさん :02/01/16 02:05
構造体を return すれば?

424 名前:デフォルトの名無しさん :02/01/16 02:06
>>420
任せた

Modern C++ Design ネタっぽい気がするが。

425 名前:弱気な名無しさん :02/01/16 02:08
あ、C++だったか。だったら
関数にデータをやりとりするんじゃなくて
データをいじる関数を追加するんです。
…違うかも

426 名前:デフォルトの名無しさん :02/01/16 02:08
std::pair<int,int>とかで返すというやつだな。
TypeListがどうこう、って話だが。

427 名前:デフォルトの名無しさん :02/01/16 02:13
>426
おぃおぃ,たしかに TypeList には pair 使ってるけど
ここでは TypeList は関係無いのでは・・・
# pair は確かに「複数 return」には使えるけど

428 名前:デフォルトの名無しさん :02/01/16 02:20
なんでさ?複数returnするなら、typelistは必須やん。

Loki::tuple< TYPELIST_4(int,long,double,float> > somefunc( );

429 名前:デフォルトの名無しさん :02/01/16 02:25
同じファイルの別の関数でも、構造体をreturnしたほうがいいとおもうな。

430 名前:デフォルトの名無しさん :02/01/16 02:25
>>420
> 再利用しないアプリケーションコードまでジェネリックにするこたあない。

「ジェネリック」→「例外安全」という意味か? それなら、この後の文章は冗長では。
人には大げさだと言っておいて、自分はもっと過激な事を同じレスの中で言う。
知識ひけらかし君か?

431 名前:デフォルトの名無しさん :02/01/16 02:38
>「ジェネリック」→「例外安全」という意味
んなわきゃない。
じぇねりっく、ってのは、型に対して汎用性がある、っちゅう意味さね。
誤解を恐れず云えば、templateつかう、ちゅうことさね。

432 名前:デフォルトの名無しさん :02/01/16 02:47
>>431
今、俎上にあがってるのはスタックだから じぇねりっく にするのは妥当と思われ。
そういえば結局 >>371 は何だったんだろう。単なる勘違い?

(それならそうと書いて欲しかったけど。どうせ名無しさんなんだから、恥かくわけでもなし)

433 名前:デフォルトの名無しさん :02/01/16 02:52
>>390
>  何が言いたいのかって言うと、ロード関数がf(A,B)になるのを避けたいのです。
> f(A,B)じゃなくて、A.f(B)にしたいな〜、と。
これって、何が嬉しいの?

個人的には CGraphic と個別の画像フォーマット対応ローダクラスの間に、継承という「むちゃくちゃ強力な」
関係を持ってしまうからイマイチなデザインという気がするんが、見落としてる利点があるなら教えて欲しい。

434 名前:デフォルトの名無しさん :02/01/16 05:11
>>431
じゃあ、なんで「例外安全」から「ジェネリック」に話変わってるのだろう。
>>420の1行目から、2行目で。

435 名前:371 :02/01/16 05:44
CALCULATOR::Calculate(char *)がヘッダに入ってるのにびっくりしたっていうのが、言いたかったこと。
ヘッダに入れる理由が思いつかない。
でも、これが「なんの変哲も無い」っていわれたら、あとは、言うことないよ。
pop()については、STLがvoid pop()なの知らなかった。俺の感覚が古かったんだね。

こんなんで、いいですか?

っていうか、話があっち行っちゃったのに、なんでいまさら呼ばれるの?

436 名前:デフォルトの名無しさん :02/01/16 05:47
>>432

スタックの話というか、わけのわかんないインライン関数のサンプルの
例で皆が混乱したのが発端?

>>434

そこで、>>401の説明が
>T pop();
> と pop() で値を返すと、T の型によっては「コピーコンストラクタの実行に失敗」して、例外
> が飛んでくる
> 可能性がある。その場合に、

という説明だったから、>>420のような話になったのでわ。

437 名前:デフォルトの名無しさん :02/01/16 06:04
>>436
いや、その>>401の説明は、inlineには全く関係ないが、
>>366に対する、pop()が要素を返さない理由としては全く正しい。

438 名前:421 :02/01/16 08:06
pairとかTypeListって持ってる本に載ってないので
構造体を使うことにしました。
早速試してるんですけど、なぜかエラーが・・・。
構造体の変数をreturnで返す関数の型はstructでいいんですよね?
struct関数のtypeに対してエラーが出てしまいます。
どうすればよいのでしょう?

439 名前:デフォルトの名無しさん :02/01/16 08:15
関数の戻り値の型には、構造体の名前も書いてる?

440 名前:デフォルトの名無しさん :02/01/16 09:22
>>437
http://www.geocities.co.jp/SiliconValley-Cupertino/7774/c/cpphtml/calculator_h.html
のは、確かにテンプレートではあるが、スタックの中身にせいぜい組み込み型か
そのバリエーションしか入れないっぽいので、わざわざ例外安全を持ち出して
くるまでもない気はする。脇が甘いと突っ込まれればそれまでなんだけどね(藁

441 名前:デフォルトの名無しさん :02/01/16 10:11
>>393
大学の課題だとはいえ、計算の内容は高校2年レベルの算数だぜ。
たぶん高校の授業で代数学を選択しなかったから行列を難しいと
思うんだろうけど、いくらなんでも簡単すぎ。

「2a-3b+c」と「2d-3e+f」と…を計算するプログラム、なんて、
どこをどう悩めばいいんだろうか。

442 名前:387 :02/01/16 11:22
>>433
>>  何が言いたいのかって言うと、ロード関数がf(A,B)になるのを避けたいのです。
>> f(A,B)じゃなくて、A.f(B)にしたいな〜、と。
>これって、何が嬉しいの?
 C++のオブジェクト志向らしい記述が出来るのが嬉しいのです。

>個人的には CGraphic と個別の画像フォーマット対応ローダクラスの間に、
>継承という「むちゃくちゃ強力な」関係を持ってしまうからイマイチなデザイン
>という気がするんが、見落としてる利点があるなら教えて欲しい。
 見落としてる利点は特にないと思います。ただ、A.f(B)なのをf(A,B)にして
「継承ではない」としたところで、CGraphicと一緒に提供せざるを得ない以上、
CGraphicの構成要素であるのは同じですから。「強力な関係」であることに
変わりはありません(この根拠はExceptional C++の項目32)。つまり、
どちらにしても特に利点や欠点はありません。
 ですから、後は記述スタイルの好みで、A.f(B)ができる方法を探してたのです。

443 名前:デフォルトの名無しさん :02/01/16 11:41
>>392
意外にも誰もレスしてやらんので俺が・・・

ゲ製作技術板に逝け。

                            以上

444 名前:デフォルトの名無しさん :02/01/16 14:46
>>442
俺なら

1. 画像データ格納用のバッファクラスを用意して、CGraphic に集約。それを Loader 側に提供する
2. 画像データ操作用の手続きをまとめた抽象クラスを用意し、CGraphic はそれを継承。Loader には
  抽象クラスのインターフェースを提供する。

とするかなぁ。

> CGraphicの構成要素である
こうやって、CGraphic 自身とインターフェースを分離する。一例だけど。

445 名前:Ruby厨な人(802) :02/01/16 18:37
いまだにC++だってさ。 ヴァカ炸裂(ぷっ

446 名前:デフォルトの名無しさん :02/01/16 18:40
このプログラムをVC++6.0sp5、bcc5.5.1、mingw g++2.95.3-5
でコンパイルして実行すると
VC: ABC4E6G\n
bcc: ABCDEFG4
g++: ABCDEFG\n
となりました。main()4行目のseekpの指定のやり方がいけないのでしょうか。

#include <iostream>
#include <strstream>
#include <Iomanip>
using namespace std;
int main(void)

   char ch[130];
   strstream cStrStrm (ch, 128, ios::out);
   cStrStrm << "ABCDEFG" << endl << ends;
   cStrStrm.seekp(-(128 - 7 + 2), ios::end);
   cStrStrm << '6';
   cStrStrm.seekp(-3, ios::cur);
   cStrStrm << '4';
   cout << ch;
   return 0;


447 名前:デフォルトの名無しさん :02/01/16 19:16
>>444
CGraphic に仕様変更が入った場合に、個別の画像対応の Loader をコンパイルしなおす必要があるかを
考えれば、どっちが良いかは言うまでもない。

そもそも >>391 の方法だと

 派生クラスは Is-A 関係を満たしてるのか?

という疑問がある。this を渡さないで済むというのは、継承によって暗黙の this が一致しているからだし、
それが OO 的なコードってわけでもない。Exceptional C++ 持ってるみたいだから、項目 24 を読み返すと
得るものがあると思うよ。

448 名前:デフォルトの名無しさん :02/01/16 19:34
>>446自己レス
実験したところ
mingw g++2.95.3-5の場合std::ios::endはstd::ios::curと同じ
bcc5.5.1の場合std::ios::endは終端文字のある場所からの移動
clの場合std::ios::endはstd::strstreamのコンストラクタの第2引数
みたいでした。
もうしかして同じコンパイラでもライブラリのバージョンが違うと
std::ios::endは違う結果になるのでしょうかね。

449 名前:デフォルトの名無しさん :02/01/16 20:17
息詰まってますのでよろしくお願いします。

例えば
main(){
function1(a,b);
function2(b,c);


main(){
function1(a,b);


main(){
function2(b,c);

で変数Cの値の結果が違ってくるのはどういう理由なんでしょう?
a,b,cは整数型の二次元配列です。
デバッグすると後の方はきちんとbの値が渡されてるんですけど、
最初のはbがfunction2でおかしな値になってしまって渡されてるみたいなんです。
255が66になってたり。わけわかりません。
わかる方お願いします。

450 名前:デフォルトの名無しさん :02/01/16 20:19
>449
a,b,c の型を書いたほうがよいとオモワレ。

451 名前:デフォルトの名無しさん :02/01/16 20:19
>>449
省略しすぎ、せめて各関数のプロトタイプと
呼び出し側の変数宣言&初期化くらい書けよ。

452 名前:デフォルトの名無しさん :02/01/16 20:20
プログラムはあまり詳しくないのですが
3ケタの数字をランダムに0.3秒間隔で10回表示させる
プログラムはどう記述したらよいでしょうか?
わかりやすく言うと次々と現れる3ケタの数字を記憶するゲームを
作りたいと思っています。
最後に答えを表示できれば完璧なのですが。
わかる方いらっしゃいましたら、ご教授よろしくお願いします。

453 名前:デフォルトの名無しさん :02/01/16 20:24
>>452
プラットホーム依存。

Win32 なら SetTimer() とか見てみるといいと思われ。

454 名前:387 :02/01/17 00:11
>>444
>1. 画像データ格納用のバッファクラスを用意して、CGraphic に集約。それを Loader 側に提供する
>2. 画像データ操作用の手続きをまとめた抽象クラスを用意し、CGraphic はそれを継承。Loader には
>  抽象クラスのインターフェースを提供する。
 じっくり、じっくり、じっくり考えました。
 考えに考えて、結局、どこにも異議申立てできる部分がない、と言う結論に達しました。
1.で提案されたデザインにしようと思います。

>>447
 言われたとおり、Exceptional C++ の項目24をじっくり読み返してみます。

 あー、前回「オブジェクト志向」って書いちゃってる…。恥ずかスィ。

455 名前:デフォルトの名無しさん :02/01/17 00:46
>>454
447は2.がいいって言ってるんじゃないの。その辺はどうなん?

456 名前:デフォルトの名無しさん :02/01/17 00:49
初歩的な質問なのですが
Visual C++
C++
Bacic
などいろいろあり、どれがどう違うのかさっぱりわかりません。
プログラミングを勉強し始めるとしたら、どれから覚えていったほうが
よいのでしょうか?

457 名前:デフォルトの名無しさん :02/01/17 00:53
Ruby!

458 名前:デフォルトの名無しさん :02/01/17 00:59
>>456
Visual C++はC++の開発環境、というか商品名。
勉強ならとりあえずCが無難だろうが、スレ的にはC++勧めんと駄目かな。
というか激しくスレ違いだ。

459 名前:デフォルトの名無しさん :02/01/17 00:59
>456
VisualC++は、Microsoftが出してるC++っていうだけ。
どの言語から始めたほうがいいかは目的によって違う。

460 名前:447 :02/01/17 01:16
>>455
私は 1 が良いか 2 が良いかは、もうちょい詳細な設計見てみないと良く分からんです。

461 名前:デフォルトの名無しさん :02/01/17 01:39
>>456
まず英語から覚えましょう。

462 名前:デフォルトの名無しさん :02/01/17 03:17
質問があります。
GameProgrammingGemsの自動シングルトンユーティリティ
というところを読んだのですが…。

int offset=(int)(T*)1-(int)(Singleton<T>*)(T*)1;
ってところがよくわかりませんでした…。
Singletonクラスのthisから、
派生したTクラスのthisを求めてるみたいなんですが。
なぜキャストするだけでoffsetが出てくるのか…?

うーん。。いまいち良く分かってないんですけど、
良かったら教えてほしいです。。。

463 名前:デフォルトの名無しさん :02/01/17 03:35
多重継承してるのでは?

464 名前:デフォルトの名無しさん :02/01/17 03:51
とりあえず、ソースくらいはろうや。
http://www.cs.utah.edu/~justino/cs3500/doxygen/Singleton_8h-source.html
で、class Sample , class test2, Singleton<Sample>とか適用するわけやな。
|test2   |
|singleton |
|sample  |
メモリイメージはこんな感じか。sample, test2ではthisは
このメモリの先頭を指してるわけ(sampleはtest2、singleton
両方しっているから、問題にならない)。
test2*からsingleton*にキャストする場合、singletonはtest2
なんかしらへんから、この位置補正が当然あるわけや。
せやから、キャストでポインタがずれる。おわかりか?

465 名前:デフォルトの名無しさん :02/01/17 04:17
>>464
細かいことだけど、 SampleとSingleton<Sample>のあいだに
test2が挟まってるから、そのぶんずれるってことだよね?

466 名前:デフォルトの名無しさん :02/01/17 04:21
>465
class Sample : class test2, Singleton<Sample> {...};
の書き間違いで、その通り。

467 名前:デフォルトの名無しさん :02/01/17 04:26
ところで
これシングルトンになるの?

468 名前:467 :02/01/17 04:34
すいません、僕がバカでした。
実行時にエラーになるのね。

469 名前:469 :02/01/17 08:21
C++暦1ヶ月の消防です,よろしくお願いします

template <typename T = double>
class hogehoge
{
---
}

とクラステンプレートにデフォルトの型を定義していますが
このクラスのオブジェクトを作るときに

hogehoge<> hogeobj;

と "<>" をつけなくてはいけないのが非常に面倒です
デフォルトの型でいい場合には "<>" を省略できるように
する方法はないでしょうか?

470 名前:469 :02/01/17 08:24
例えば別の名前のクラス hoge2 に
hogehoge<> と同等の機能をもたせて

hoge2 hogeobj;

とすることはできませんでしょうか

471 名前:デフォルトの名無しさん :02/01/17 08:30
class hogeDefault : public hogehofe<>{} ;
ってのは、ど?

472 名前:デフォルトの名無しさん :02/01/17 08:36
typedef hogehoge<> hoge2;
じゃいかんのか。

473 名前:デフォルトの名無しさん :02/01/17 08:38
#define hoge2 hogehoge<>
でもええやん。

474 名前:473 :02/01/17 08:39
あ、おそ、しかもカコワル

475 名前:469 :02/01/17 08:57
素早いレスありがとうございます^^

ところでどれが一番よさそうですか^^;

476 名前:デフォルトの名無しさん :02/01/17 09:09
typedef が一番

477 名前:デフォルトの名無しさん :02/01/17 09:16
今まで Java と C# で遊んでいたのですが、
漢はやっぱり C++ だろ!と思い立ち、今更ながらに C++ を勉強している者です。

で、ちょっと質問なのですが、いままで
「 共通のスーパークラスを継承しているクラスを多重継承すると、
オーバーライドしないメンバーは、どれが呼び出されるかわからない」
んだと思っていたのですが、これって継承の度合い
(っていうのかな? public 継承とか protected 継承とか)
を使えば実は済む話なのでしょうか?

Java厨でありC#厨でもある私は、
幼少の頃から、多重継承=悪 と教えられて育ったのですが
本当に必要な場合は多重継承もアリなのかなぁ…とか
微妙に思い始めています。どうなんでしょうか?

478 名前:387 :02/01/17 09:21
>>455
 実は2.の設計はよくわからないのです。(^^;「Loader には抽象クラスのインターフェースを
提供する」って、どういうことなんでしょう? ローダークラスは、抽象クラスを
private継承するってことでしょうか?
 >>444さん、よければ解説お願いします。


479 名前:デフォルトの名無しさん :02/01/17 09:25
>>477
仮想継承つかえ



480 名前:456 :02/01/17 10:29
>>458-459-461
レスありがとうございます。
目的は画像処理などのソフトウェアを作りたいと考えています。
いろいろ種類があるみたいで、どれから手をつけてよいのか
わかりませんでした。兄が「Visual Studio 6」を持っているので
C++から始めてみようとも思っています。やはり参考書は必要でしょうか?

481 名前:デフォルトの名無しさん :02/01/17 10:36
>>480
そのまえに、VisualStudio6のライセンスが必要でしょう。
つか、うそでも自分で買ったって家。

482 名前:ぱふーん ◆BEVSNet2 :02/01/17 12:04
>多重継承=悪

メソッド名がかぶるような多重継承は悪というか
頭をかかえるだろうけど、どういう理由で悪とされているか
知っておくべきよ。単なる教条主義に陥るから。
多重継承を上手に活用しているクラスライブラリも
あるけど、それは少数派で、ほとんどは多重継承で
ふりまわされるから、悪としとけ、ってなってると思う


483 名前:456 :02/01/17 13:04
>>481
「ライセンス必要」というのはどういう意味でしょうか?

>つか、うそでも自分で買ったって家。
スミマセン。そういうものでしたか。
兄の物では駄目ということですね。

484 名前:デフォルトの名無しさん :02/01/17 15:29
>>478
良いクラス名が思いつかなくて鬱なんだけど、たとえばこんな感じ。

struct IGraphicBuffer
{
  virtual void WriteRawData(char *data, size_t size) = 0;
};

struct IGraphicLoader
{
  virtual bool Load(IGraphicBuffer& obj, const string& file) = 0;
};

class CGraphic : public IGraphicBuffer
{
  vector<IGraphicLoader*> m_pLoaders;
  typedef vector<IGraphicLoader*> TLoaderIterator;

  // こいつは public でも private でも、好きなように
  void WriteRawData(char *data, size_t size);

public:
  bool LoadGraphic(const string& file)
  {
    for (TLoaderIterator i = m_pLoaders.begin(); i != m_pLoaders.end(); ++i)
      if (i->Load(*this, file))
        return true;
    return false;
  }
};

class CBitmapLoader : public IGraphicLoader
{
  bool Load(IGraphicBuffer& obj, const string& file);
};

Concrete Loader に対して CGraphicLoader 自身ではなく、CGraphicLoader の内で公開したいメソッド
だけまとめた IGraphicBuffer を渡しておくのがミソ。

IGraphicBuffer, IGraphicLoader はがっちり結びつくけど、実装である CGraphic, CBitmapLoader
の間は公開インターフェースを通してのみの緩い結びつきになる。こうしておけばインターフェース
を変えない限りは CGraphic, CBitmapLoader は独立に拡張できるのが利点。

事例
 XXX という画像フォーマットでは、最終的に必要なデータのサイズがファイルを最後まで読んでみ
 ないと分からない。でも、とりあえず読めた分から CGraphic のバッファに書き込んでしまいたい。
 (たとえばブラウザの画像表示に使うとかの理由で)

 そこで、CXXXLoader にはバッファサイズを最初に確定する IGraphicLoader ではなく、バッファに
 追加書き込みが出来る IGraphicLoader2 という別のインターフェースを提供する必要がある

みたいな要求が出てきたときに、その IGraphicLoader2 を CGraphic に実装して CXXXLoader に公開
すれば、これまでの Loader には一切影響を与えずに済むでしょ。

485 名前:デフォルトの名無しさん :02/01/17 19:21
for(int s=0; s<4; s++){
for(int t=s+1; t<5; t++){
if(test[t] > test[s]){
int tmp = test[t];
test[t] = test[s];
test[s] = tmp;
で、
for(int t=s+1; t<5; t++){
のt=s+1; の所をt=1;にするとなぜだめなのでしょうか?

486 名前:晒しage :02/01/17 20:49
>>485
> なぜだめなのでしょうか?
シ・ル・カ・ヨ!
“目的”と“求める結果”と“現状”ぐらい書け!

487 名前:デフォルトの名無しさん :02/01/17 20:56
>>485
0-sまでの要素は、すでにソート済みだから。
あと、t==sのときは、並べ替えの必要無いよね。

488 名前:デフォルトの名無しさん :02/01/17 22:03
>>477
> 「 共通のスーパークラスを継承しているクラスを多重継承すると、
> オーバーライドしないメンバーは、どれが呼び出されるかわからない」

具体的にコード書いてくれると理解の助けになるんだけど。
class A{
public:
 f():
};
class B:public A{};
class C:public A{};
class D:public B,public C{};
d;
d.f();
こんな場合だとエラーです。
d.B::f(); とか書けば良かったかと思いまふ。
それか仮想継承するとか。

仮想継承しても
class A{
public:
 virtual f():
};
class B:virtual public A{
public:
 virtual f();
};
class C:virtual public A{
0public:
 virtual f();
};
class D:public B,public C{};
これはエラーかと。Dの中で改めて f(); を定義すれば良し。

> 幼少の頃から、多重継承=悪 と教えられて育ったのですが
> 本当に必要な場合は多重継承もアリなのかなぁ…とか

本当に必要な場合はね。

489 名前:462 :02/01/17 22:42
レスどうもです。
ええと、、継承関係のある型同士でのキャストでは、
そのずれを調節してくれる…ということであってますか?

あと、メモリ配置はインスタンス毎ですべて同じなのでしょうか?
コードでは、0x1にある仮想のオブジェクトからoffsetを求めていますよね。
offsetは一定じゃないとうまくいかないかと…。

490 名前:デフォルトの名無しさん :02/01/17 22:52
メモリ配置がインスタンス毎に違ったら、メンバ関数は
うまく機能しないのでは、とかおもいませんかね?

491 名前:デフォルトの名無しさん :02/01/17 23:39
>>489
多重継承じゃないと、ずれないけどね。
それから、0やNULLをキャストしてもだめだじょ。

492 名前:デフォルトの名無しさん :02/01/17 23:52
みなさんは無限ループを使うとき
for(;;)とwhile(1)とwhile(true)のどれを使っていますか?

493 名前:デフォルトの名無しさん :02/01/17 23:56
>>492
for (;;)

他の形式だと

 条件文が定数です

とか警告出るのが鬱陶しいから。

494 名前:デフォルトの名無しさん :02/01/18 00:01
>>493
どんなコンパイラ使ってんのよ?
うちでは最大レベルの警告でも出ないよ

495 名前:デフォルトの名無しさん :02/01/18 00:35
ふつうはfor(;;)だと思うよ。
whileだといちいちチェックする可能性があるから。

496 名前:デフォルトの名無しさん :02/01/18 00:56
while(1)のチェックがパフォーマンスに影響するような場面は、そんなに無いだろうな。
つか、定数との比較がパイプライン乱すようなコード吐くコンパイラつかうな。

おれは自分一人で書いてるならwhile(1)、同じプロジェクトにfor(;;)使う人がいればfor(;;)を使う。

497 名前:デフォルトの名無しさん :02/01/18 00:58
494は紙!

498 名前:デフォルトの名無しさん :02/01/18 01:11
なんの為にコピーコンストラクタが
あるのか分かりません。
必要なものですかね?
どなたか、どんな時に必要なのか教えてくださいませんか?

499 名前:デフォルトの名無しさん :02/01/18 01:12
>>498
コピーコンストラクタを private で宣言してみ。どこで使われてるか分かるから。

500 名前:デフォルトの名無しさん :02/01/18 01:14
>>498
一例、コンストラクタでリソースを確保しデストラクタで解放するようなクラス。
コピーコンストラクタが無いと単純なビットコピーとなり、デストラクタで二重解放が起きる。
つーか、本読め。


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