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


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

C++相談室 part27
1 名前:v(^・^)v :04/01/19 04:37
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
また、テンプレートライブラリ(STL含む)に関する質問は
専用の別スレへどうぞ。

過去スレ、関連スレ、関連リンクなどはこちら>>2-7

2 名前:v(^・^)v :04/01/19 04:39
■過去スレ■
 1 http://mimizun.mine.nu:81/2chlog/tech/piza.2ch.net/tech/kako/980/980175292.html
 2 http://pc.2ch.net/tech/kako/996/996640937.html
 3 http://pc.2ch.net/tech/kako/1003/10038/1003832761.html
 4 http://pc.2ch.net/tech/kako/1009/10090/1009071535.html
 5 http://pc.2ch.net/tech/kako/1014/10142/1014217496.html
 6 http://pc.2ch.net/tech/kako/1018/10184/1018454705.html
 7 http://pc.2ch.net/tech/kako/1021/10217/1021787032.html
 8 http://pc3.2ch.net/tech/kako/1025/10250/1025010364.html
 9 http://pc3.2ch.net/tech/kako/1027/10273/1027347982.html
 10 http://pc3.2ch.net/tech/kako/1029/10293/1029315669.html
 11 http://pc3.2ch.net/tech/kako/1032/10323/1032345774.html
 12 http://pc3.2ch.net/tech/kako/1035/10350/1035005882.html
 13 http://pc3.2ch.net/tech/kako/1038/10380/1038031395.html
 14 http://pc2.2ch.net/tech/kako/1041/10413/1041328679.html
 15 http://pc2.2ch.net/tech/kako/1043/10436/1043605481.html
 16 http://pc2.2ch.net/tech/kako/1045/10457/1045746245.html
 17 http://pc2.2ch.net/tech/kako/1047/10475/1047560042.html
 18 http://pc2.2ch.net/tech/kako/1050/10501/1050177746.html
 19 http://pc2.2ch.net/tech/kako/1052/10526/1052625846.html
 20 http://pc2.2ch.net/tech/kako/1055/10551/1055162298.html
 21 http://pc2.2ch.net/tech/kako/1057/10575/1057580107.html
 22 http://pc2.2ch.net/tech/kako/1060/10603/1060361082.html
 23 http://pc2.2ch.net/test/read.cgi/tech/1062690663/
 24 http://pc2.2ch.net/test/read.cgi/tech/1066546387/
 25 http://pc2.2ch.net/test/read.cgi/tech/1067949669/
 26 http://pc2.2ch.net/test/read.cgi/tech/1070164402/

3 名前:v(^・^)v :04/01/19 04:39
■基本■
[C++ FAQ]
 http://www.parashift.com/c++-faq-lite/
 http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
  Cとその仕様を比較しながらの解説なので分かりやすい。
  ***** 質問の前に必ずこの二つに目を通してください *****

[禿 Stroustrup]
 http://www.research.att.com/~bs/
[C++ International Standard]
 http://www.kuzbass.ru/docs/isocpp/
 http://www.kuzbass.ru/docs/ansi_iso_iec_14882_1998.pdf
 http://www.iso.org/iso/en/CatalogueDetailPage.CatalogueDetail?CSNUMBER=38110&ICS1=35&ICS2=60&ICS3=
[JTC1/SC22/WG21 - C++]
 http://std.dkuug.dk/jtc1/sc22/wg21/

[C/C++ Users Journal]
 http://www.cuj.com/
[cppll (ML)]
 http://www.trickpalace.net/cppll/ (日本語)

4 名前:v(^・^)v :04/01/19 04:40
■Books■
amazon.com C,C++関連書籍
 http://www.amazon.com/exec/obidos/tg/browse/-/3956/ref=br_bx_c_1_3/

The C++ Programming Language
 http://www.amazon.com/exec/obidos/ASIN/0201700735/
 http://www.amazon.co.jp/exec/obidos/ASIN/475611895X/ (翻訳)
C++ Primer (3rd Edition)
 http://www.amazon.com/exec/obidos/ASIN/0201824701/
 http://www.amazon.co.jp/exec/obidos/ASIN/4756140068/ (翻訳)
The C++ Standard Library
 http://www.amazon.com/exec/obidos/ASIN/0201379260/
 http://www.amazon.co.jp/exec/obidos/ASIN/4756137156/ (翻訳)
Effective C++
 http://www.amazon.com/exec/obidos/ASIN/0201924889/
 http://www.amazon.co.jp/exec/obidos/ASIN/4756118089/ (翻訳)
More Effective C++
 http://www.amazon.com/exec/obidos/ASIN/020163371X/
 http://www.amazon.co.jp/exec/obidos/ASIN/4756118534/ (翻訳)
Exceptional C++
 http://www.amazon.com/exec/obidos/ASIN/0201615622/
 http://www.amazon.co.jp/exec/obidos/ASIN/4894712709/ (翻訳)
More Exceptional C++
 http://www.amazon.com/exec/obidos/ASIN/020170434X/
Effective STL
 http://www.amazon.com/exec/obidos/ASIN/0201749629/
 http://www.amazon.co.jp/exec/obidos/ASIN/4894714108/ (翻訳)
Modern C++ Design
 http://www.amazon.com/exec/obidos/ASIN/0201704315/
 http://www.amazon.co.jp/exec/obidos/ASIN/4894714353/ (翻訳)
C++ Templates
 http://www.amazon.com/exec/obidos/ASIN/0201734842/

5 名前:v(^・^)v :04/01/19 04:41
■Libraries■
[Boost]
 Boost http://www.boost.org/
 (日本語) http://user.ecc.u-tokyo.ac.jp/~s31552/wp/boost/
 (日本語) http://www.kmonos.net/alang/boost/
[STL]
 STLport http://www.stlport.org/
 SGI-STL http://www.sgi.com/tech/stl/
 STLFilt http://www.bdsoft.com/tools/stlfilt.html
 (日本語) http://www005.upp.so-net.ne.jp/episteme/html/stlprog/
 (日本語) http://www.wakhok.ac.jp/~sumi/stl/
[Loki]
 http://www.moderncppdesign.com/
 LokiPort-MSVC7 http://www.geocities.com/rani_sharoni/LokiPort.html
 LokiPort-MSVC6sp5 http://fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport
[他]
 ACE http://www.cs.wustl.edu/~schmidt/
 Blitz++ http://www.oonumerics.org/blitz/
 flex++ Bison++ http://www.idiom.com/free-compilers/TOOL/BNF-15.html
[他ライブラリリンク集]
 http://www.trumphurst.com/cpplibs/cpplibs.phtml
 (日本語) http://www.kmonos.net/alang/cpp/lib.html

6 名前:v(^・^)v :04/01/19 04:49
■関連スレ■
[C++】template 統合スレ]
 http://pc2.2ch.net/test/read.cgi/tech/1066493064/l50
[ぼるじょあがC/C++の宿題を片づけますYO! 19代目]
http://pc2.2ch.net/test/read.cgi/tech/1073566342/l50
[初心者にVisual C++を教えるスレ★ Part9]
http://pc2.2ch.net/test/read.cgi/tech/1068983609/l50
[■ VisualC++(MFC限定)相談室 MFC10.dll■]
http://pc2.2ch.net/test/read.cgi/tech/1074104008/l50
[ATL 相談室]
 http://pc2.2ch.net/test/read.cgi/tech/1029029882/l50
[C/C++でのWindowsPrograming議論スレ(質問お断り)]
 http://pc2.2ch.net/test/read.cgi/tech/1049790146/l50
[COMの世界を斬る!]
 http://pc2.2ch.net/test/read.cgi/tech/981823340/l50
[managed C++ やろうぜ!!]
 http://pc2.2ch.net/test/read.cgi/tech/1014486422/l50
[C++Builder相談室 Part8]
http://pc2.2ch.net/test/read.cgi/tech/1070222674/l50
[タダで使えるBorland C++ Part3]
http://pc2.2ch.net/test/read.cgi/tech/1054390397/l50
[Borland C++ BuilderX]
 http://pc2.2ch.net/test/read.cgi/tech/1065260556/l50
[Code of the Nerds" Digital Mars C/C++]
 http://pc2.2ch.net/test/read.cgi/tech/1044210976/l50
[GCCについて part3]
http://pc2.2ch.net/test/read.cgi/tech/1072484422/l50
[OpenWatcom C++]
 http://pc2.2ch.net/test/read.cgi/tech/1033433728/l50
[タダで最強!フリーC/C++コンパイラ]
 http://pc2.2ch.net/test/read.cgi/tech/1035882599/l50

7 名前:デフォルトの名無しさん :04/01/19 04:50
こんなもんかにゃ〜
後何かあったら付け足してください。

8 名前:デフォルトの名無しさん :04/01/19 04:52
>>1
乙++

9 名前:デフォルトの名無しさん :04/01/19 04:54
■過去ログ訂正。かなりhtml化してた。

23 http://pc2.2ch.net/tech/kako/1062/10626/1062690663.html
24 http://pc2.2ch.net/tech/kako/1066/10665/1066546387.html
25 http://pc2.2ch.net/tech/kako/1067/10679/1067949669.html

10 名前:デフォルトの名無しさん :04/01/19 05:49
小津>>1

11 名前:デフォルトの名無しさん :04/01/19 11:30
c++の本家とその最先端の動向が良く判るサイトを晒して下さい

12 名前:デフォルトの名無しさん :04/01/19 11:54
cujを読むのがいいんじゃないの?

13 名前:デフォルトの名無しさん :04/01/19 12:37
>>999の続きキボン

14 名前:デフォルトの名無しさん :04/01/19 13:00
>>13
1000

15 名前:デフォルトの名無しさん :04/01/19 15:01
変な質問なのかもしれないけど
ソースファイルの内容をまったくいじってないのに
「コンパイルの際にさっきはエラーが出てなかったのに今度は出る」
(あるいはその逆でもいいけど)
なんてことってある?ってゆうか何度かそういう事態に遭遇してるんだけど
なんなんすかこれは

16 名前:デフォルトの名無しさん :04/01/19 15:59
>>15
俺の場合エラーじゃなく警告が出るけど内容をチェックした後は無視を決め込んでる。

17 名前:デフォルトの名無しさん :04/01/19 16:02
>>15
1. コンパイルオプションが変わった。
2. ファイルの日付が変わったが、make ファイルがおかしい所為で
  中途半端にビルドされた。
3. 悪い小人さんがいる。
4. いじめにあっている。

18 名前:デフォルトの名無しさん :04/01/19 16:22
>>17
5. 内容をいじっていないというのは勘違いで、ちょっと書式を変えたつもりが変になってた。
6. ハッキングされている。
7. ファイルが壊れている。
8. >>15の日頃の行いが悪いので天罰がくだっている。

19 名前:デフォルトの名無しさん :04/01/19 16:28
単に二重人格なだけでしょ?

20 名前:デフォルトの名無しさん :04/01/19 16:36
(1)本当は正しくコンパイル出来るのにエラーが出る
(2)本当はエラー(深刻なものではなく)なのにたまたま正しく見えるようにコンパイルされた

(1)は無くても(2)は有り得る?

21 名前:デフォルトの名無しさん :04/01/19 16:44
何もやってないのにおかしくなった、という奴の半数以上は、何かやってるわけだが。

22 名前:デフォルトの名無しさん :04/01/19 17:08
コンピュータは人間が指示したとおりに動く機械だからね。

こんなバグ出るはずねえよムキー!とかいちいち切れるヤツほど
プログラミングが上達しません。

23 名前:デフォルトの名無しさん :04/01/19 17:10
ハードウェアにバグがある場合はどうすればいいのでしょうか?

24 名前:デフォルトの名無しさん :04/01/19 18:35
全スレ最後のvectorとdequeの比較や乱数の話しでvolatileをつけていたのは
最適化しないようにしてCPU依存の話しにならないようにするため……
という認識でよろしいのでしょうか?
当方volatileを一度も使ったことないものなり。

25 名前:デフォルトの名無しさん :04/01/19 18:45
STLつかうと一気に実行ファイルサイズが10倍に?!

26 名前:デフォルトの名無しさん :04/01/19 18:47
>>24
VC7.1でvolatile使わないと、加算演算が一切がっさい削除される。
結局結果を残さなくてもいいな・・・・とコンパイラが判断して無駄な
処理はばっさり切り落とすからだろう。

volatileにするとマルチスレッドで他のスレッドからも読むかも・・・
と判断して最適化しないと思わるる。

27 名前:デフォルトの名無しさん :04/01/19 19:12
>>25
環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。

28 名前:デフォルトの名無しさん :04/01/19 19:14
>>27
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。

29 名前:デフォルトの名無しさん :04/01/19 19:21
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?

30 名前:デフォルトの名無しさん :04/01/19 19:22
>>29
#include "stdafx.h"

後死ね。

31 名前:デフォルトの名無しさん :04/01/19 19:23
>>30
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。

32 名前:デフォルトの名無しさん :04/01/19 19:28
ねぇねぇ。みんなコピペってコレクションしてるの?
それとも毎回探してくるの?

33 名前:デフォルトの名無しさん :04/01/19 20:37
地鎮祭状態だな(笑)

34 名前:24 :04/01/19 20:47
>>26
なるほど。
ありがd。

35 名前:デフォルトの名無しさん :04/01/19 20:57
IDでないからコピペを一人で書き込んでるか、そうでないのか素人の俺にはわからんよ。

36 名前:デフォルトの名無しさん :04/01/19 21:08
>>13
俺漏れも!

37 名前:デフォルトの名無しさん :04/01/19 21:09
>>34
折角C++のスレなんだから、もう少し書いておくね。
volatileの意味はC++では拡張されて、クラスやメンバ
関数にも付けられる。
もしvolatileと宣言されたオブジェクトがあると、それは
volatileメンバ関数だけを呼び出せる。この点const
修飾子と似ている。
const と volatileの両方がつけられたオブジェクトは、
やはりconst と volatileの両方がつけられたメンバ関数
しか呼び出せない。マルチスレッドやマルチプロセスの
プログラムをC++で書く場合はしばしば関数のオーバー
ロードがこのために面倒な場合がある。

38 名前:デフォルトの名無しさん :04/01/19 22:45
関数についてる「const」のことなんだけど
あるクラスXで関数を定義するときに

void func() const
const X func()

こういうふうにconstをつけているのを見るのだけど、これの意味って
一つ目は「クラスのデータメンバを変更しないという意味のconst」で合ってる?
これにより定数オブジェクトからもアクセスできるようになるってことかな。
で、次がよくわからないんだけど、戻り値にconstをつけるのはなんでなの?
これをつけると何がどう変わるんでしょーか?
基本的な質問でごめんちゃい


39 名前:デフォルトの名無しさん :04/01/19 22:54
>>38
戻値がconstということ。const Obj func() とかだと、const Objが戻される。

40 名前:デフォルトの名無しさん :04/01/19 22:54
const X func(); は意味がない。
const X& func(); なら意味がある。


41 名前:40 :04/01/19 22:56
訂正。
使いようによっては意味があるか。
func().somemethod(); が呼べたり、呼べなかったり。


42 名前:デフォルトの名無しさん :04/01/19 22:58
>>39がObjと書いてるのが悪い

43 名前:デフォルトの名無しさん :04/01/19 23:03
>>38
前に付けるconstと後ろに付けるconstじゃ意味が違うからね。
後ろにconst付ける時はその関数があるクラスのメンバ関数
でないと付けられない。

44 名前:デフォルトの名無しさん :04/01/19 23:06
そうすると例えば
int& func() なら
func()=適当な整数 とできるけど
const int& func() だと
func()=適当な整数 のような代入はできないってこと?
こんなことするかどうかは別にして。

45 名前:デフォルトの名無しさん :04/01/19 23:07
>>44
メンバ関数ならわりとありうるが。

46 名前:デフォルトの名無しさん :04/01/19 23:10
>>44
const_castと同じような意味で使えるかもしれないが。

47 名前:デフォルトの名無しさん :04/01/19 23:14
>>44
const_castすると代入できるわけだが。(当たり前)

#include <iostream>

const int& func(const int& i)
{
return i;
}

int main()
{
int i = 9999;

const_cast<int&>(func(i)) = 1;

std::cout << i << std::endl;
}

48 名前:デフォルトの名無しさん :04/01/19 23:15
実はconst char *だったりして

49 名前:デフォルトの名無しさん :04/01/19 23:35
みなさんどうもです!
自分でも色々やってみます

50 名前:デフォルトの名無しさん :04/01/20 01:47
>>44

まさにそのとおり。
とりあえず、EffectiveC++の21項あたりを読むことを勧める。

51 名前:デフォルトの名無しさん :04/01/20 12:00
WM_KEYDOWNのlParamの30ビットを見て1なら処理しないっていう記述はどう書いたらいいでしょうか?


52 名前:デフォルトの名無しさん :04/01/20 12:29
論理演算とかビット演算とかで調べれ

53 名前:デフォルトの名無しさん :04/01/20 23:29
最近ネタないね。

54 名前:デフォルトの名無しさん :04/01/21 03:11
int a=1;
int& r=a+1;
という表現は文法的に正しいですか?
一応私の環境ではエラーは出ないのですが。また

int& f()
{
static int x=1;
return x;
}

main()
{
cout<<f();
}

これはエラーにならないのですが
関数fの return x を return x+1 にすると
『参照は 'int' で初期化されているが 'int' 型の左辺値が必要』
というエラーが出ます。int& r=a+1 という表現が許されるのに
どうしてこういうエラーが出るのかいまいちわからないです。
それともそもそも int& r=a+1 という表現自体がおかしいのでしょうか。
それならむしろ納得がいくのですが・・・


55 名前:デフォルトの名無しさん :04/01/21 03:40
>>54
正しくない。
a + 1 は式の結果だから、
規格上は普通の参照には渡せない。
(できるように拡張されたコンパイラもあるけど)

int a = 1;
const int& r = a + 1;

なら OK 。
const な参照の場合は
そういう式の結果でも入れれる。
その場合、式の結果を入れたテンポラリオブジェクトができて
それへの参照で初期化される。
もっとも、最適化されるとどうなるかは分からんけど。

あと、こういう風な束縛は関数の戻り値には適用されない。
テンポラリオブジェクトを作ろうとしても、
すぐ関数を抜けてしまうからね。

56 名前:デフォルトの名無しさん :04/01/21 06:01
ちょっと困ったことがありまして、Cで書かれた某APIをC++でラップしようとしてうるのですが、

setcallback((関数ポインタ型*)foo);

という関数にクラスのメンバ関数を与えてやりたいんですが…。
static メンバ関数を使えというのは無しで…。

これってどうやったらいいんでしょうかね?
 識者のご意見頂きたいです、はい。

57 名前:デフォルトの名無しさん :04/01/21 06:17
>>56
thisポインタが関連付けられないので、無理。

> static メンバ関数を使えというのは無しで…。
じゃぁ普通の関数でも使えば。

58 名前:デフォルトの名無しさん :04/01/21 06:32
>>56

そのAPIがユーザー定義の引数を取るならそこにオブジェクトのポインタを渡し、
それをオブジェクトへのポインタにキャストしてメンバ関数を呼ぶコールバックを使う。

なんか、この質問FAQだな。

59 名前:デフォルトの名無しさん :04/01/21 07:43
ユーザー定義の引数で渡すのが基本だけど一応不可能でもないかも。(不可能ではないというだけ)
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=999294620&res=128
ただしかなり無理してるので何をしてるか分からないなら使わない方が吉。
関数の引数をtemplate引数にするつもりだったけど面倒なんで。
これ以上は実行時にコードを生成する以外に思いつかないけど。


60 名前:デフォルトの名無しさん :04/01/21 08:03
>>59
呼んだだけで、動かしてないんですけど、
Alloc の戻り値 obj.functions[index] には、いつ値が入るんですか?

61 名前:60 :04/01/21 08:03
s/呼んだ/読んだ/

62 名前:60 :04/01/21 08:05
すいません、見つけました。Impl::Initですね。

63 名前:デフォルトの名無しさん :04/01/21 08:08
>>60
Func_Dispatch<>::Init()を呼んだとき。
よく考えたらコンストラクタで初期化すればいいだけなことに気が付いたけど(^^;
ただまともに実用することは考えてないんで(作ってみただけ)
あと、引数や戻り値などをテンプレート引数にするつもりだったなごりでtemplateクラスになってるけど実質templateクラスの意味なくなってる(^^;


64 名前:60 :04/01/21 08:09
お詫びにいいものオシエマース
http://lists.boost.org/MailArchives/boost/msg35037.php

65 名前:54です :04/01/21 13:30
>>55
非常に丁寧な解説ありがとうございます。
助かりました。

66 名前:デフォルトの名無しさん :04/01/21 17:35
テスト

67 名前:デフォルトの名無しさん :04/01/21 17:53
/ ヘッダファイル
#ifndef head_H
#define head_H

class Test { プロパティ メンバ関数 など }; // ここを5行目とする

グローバル関数
int function();
void set(); などなど

#endif

// ソースファイル
#include "head.h"
メンバ関数の定義
グローバル関数の定義

// main関数
いろいろ

↑このような状態でmakeすると
「 head.h 5: { が必要」とゆうエラーが出るのですが、どう見ても"{"は書いてあるので
どこを直して良いやら……
ちなみに以前はグローバルにできる関数をフレンド関数にしていて
それをグローバルにしたのが上記のものなんですが
その以前のバージョンではちゃんとmakeとコンパイルはできていました。
どなたかお導きを……

68 名前:デフォルトの名無しさん :04/01/21 17:54
>>67の一行目はもちろん
// ヘッダファイルです


69 名前:デフォルトの名無しさん :04/01/21 18:02
>class Test { プロパティ メンバ関数 など }; // ここを5行目とする
ここ

70 名前:デフォルトの名無しさん :04/01/21 18:04
そこをどうしたらいいのでしょうか?

71 名前:デフォルトの名無しさん :04/01/21 18:11
そこの中身を書いてくれないと誰も答えられんと思う。

72 名前:デフォルトの名無しさん :04/01/21 18:15
>>70
クラス定義の中で { が足りないとしか思えませんよ。

73 名前:デフォルトの名無しさん :04/01/21 18:26
一行にクラスの宣言(定義?)を書くのが問題あり

74 名前:67 :04/01/21 19:10
#ifndef Heimen_H
#define Heimen_H

class Heimen
{
private:

int x;
int y;

public:

Heimen(int u=0,int v=0);

int get_x() const {return x;}
int get_y() const {return y;}
void set_x(const int& u);
void set_y(const int& v);
const Heimen operator-() const {return (-1)*(*this);}

// ******************** フレンド関数 ********************

friend ostream& operator<<(ostream& output,const Heimen& X);
friend istream& operator>>(istream& input,Heimen& X);
};

グローバル関数
const Heimen operator+(const Heimen& X1,const Heimen& X2);
以下いくつかグローバル関数の定義がある

#endif

75 名前:67 :04/01/21 19:14
メンバ関数など、だいぶ端折りましたが
こんな感じです。あと当然検索で "{" や "}" を探しましたが
一箇所多い(少ない)ということはありませんでした。

76 名前:デフォルトの名無しさん :04/01/21 19:22
>>75
そこまで削った結果でもまだ出ることは確認してあるんだよね?
で、それだけではやはりコンパイルできないので
(たとえばostreamにstd::を付けていないのは、その前に#include <iostream>と
using namespace stdがあるはずであることを示唆している)
includeする側も最小限にして、問題が再現する全体を提示してほしい。


77 名前:67 :04/01/21 19:27
わかりました。
とにかく問題の起こる最小限のソースにしたいと思います。
少々時間がかかると思いますが、今から作業をして再びソースを書きます。

78 名前:デフォルトの名無しさん :04/01/21 20:18
>>74
どう見ても必要なセミコロンがないように見えるんだが?
単なるコピペ間違いか、それともネタかね?

79 名前:デフォルトの名無しさん :04/01/21 20:32
>どう見ても必要なセミコロン
どれ?

80 名前:デフォルトの名無しさん :04/01/21 20:53
というかコメントくらいまともに書けよ・・・と

81 名前:67 :04/01/21 21:03
どうやってもエラーが消えないと思っていたのですが
#ifndef Heimen_H
#define Heimen_H
#endif
この3行を消したらエラーが出なくなりました。
(まだ他のエラーはあるのですが……)
エラーの出た理由はなんだったのでしょうか?


82 名前:デフォルトの名無しさん :04/01/21 21:20
今日は寝ろ

83 名前:デフォルトの名無しさん :04/01/21 23:56
test

84 名前:56 :04/01/22 00:43
勉強になりました、57-60
やっぱりこんな感じになるんでねぇ今ひとつ自信がなかったのですが、
これで逝ってみます。ありがとございますた!!

void CallBack(CHoger* hoge)
{
hoge->Hage();
}

class CHoge {
void SetCb()
{
SetCbApi(CallBack, this);
}
virtual void Hage();
};

85 名前:デフォルトの名無しさん :04/01/22 11:14
ブーツ・オン・ザ・グランドを果たしても、
結局アメリカは全頭検査しないんだな。
イラクから自衛隊全面撤退してもいいんじゃないか。

86 名前:デフォルトの名無しさん :04/01/22 16:14
>>85
狂牛病ぐらいでびびってんなよ。いつかは死ぬんだ。

87 名前:デフォルトの名無しさん :04/01/22 20:29
誤爆にマジレスすんなよ。自作自演か?
まぁ、ヨシ牛食えなくなるのは痛いがナ。

ところで吉牛嫌いなC++プログラマーとかいるんかの?


88 名前:デフォルトの名無しさん :04/01/22 20:42
嫌いじゃないがあまり食わないな
簡単に済ませるときはマックでフィレオフィッシュ

89 名前:デフォルトの名無しさん :04/01/23 12:18
質問です。 new(std::nothrow) を使用して確保したメモリを解放する際には、
普通の(placementでない) operator delete() を使用してもよろしいのでしょうか。

void operator delete[](void*, const std::nothrow_t&) throw();
↑newヘッダファイルに std::nothrow を引数に取る operator delete() が定義されていますが、
使い方がわかりません。

よろしくお願いします。

90 名前:89 :04/01/23 13:06
定義じゃなくて宣言ですね。

91 名前:デフォルトの名無しさん :04/01/23 14:16
少なくともoperator delete()は、operator new()と対になったもので
malloc()/free()に例外とnew_handlerを加えたような動作をする。
new演算子やdelete演算子とは異なり、メモリの確保/解放をするだけ。

92 名前:89 :04/01/23 15:29
>>91
回答ありがとうございます。すいません。私の書き方が悪かったです。
  char *buf = new(std::nothrow) char[1024];
として確保したメモリを、
  delete[] buf;
として解放してもよいのかを聞きたかったんです。
ヘッダファイルを見ると std::nothrow を引数に取る delete がありますが、
この delete を呼ぶ必要はあるのでしょうか。

93 名前:デフォルトの名無しさん :04/01/23 22:37
>>92
そのnewは旧式のnew(メモリが確保できないとstd::bad_allocを
投げないで0を返す)だからもちろんdelete[] buf; は必要だよ。

俺はまたplacement_newについて聞いているのかと思った。

94 名前:デフォルトの名無しさん :04/01/23 23:06
>>93
回答ありがとうございます。
  operator delete[](buf, std::nothrow);
としなくてはならないのかと混乱していたのですが、普通に
  delete[] buf;
でよいということですね。placement deleteは謎です……。

とにかく、ありがとうございました。

95 名前:デフォルトの名無しさん :04/01/23 23:13
placement deleteって何?
placement newに対するデストラクタ呼び出しは
デストラクタの直接起動だよ

96 名前:デフォルトの名無しさん :04/01/24 00:04
>>94
おいおい、deleteは全部nothrowだぞ。それから>>95も言ってるけど
placement deleteなんて物は存在しないぞ。

97 名前:デフォルトの名無しさん :04/01/24 00:17
new/delete new[]/delete[] new(std::nothrow)/delete(t, std::nothrow)
のペアがあって
new(std::nothrow)[]の対になるdeleteは何かという話じゃないの?

98 名前:デフォルトの名無しさん :04/01/24 00:18
placement new と ただのnewって何が違うの?
後、return hogeとreturn(hoge)の違いは何?


99 名前:デフォルトの名無しさん :04/01/24 00:21
operator delete[](buf, nothrow); で呼べるけど、
多分 delete[] buf; でも同じことだと思う。
規格上はどうなのかな?

100 名前:デフォルトの名無しさん :04/01/24 00:22
>>98
> 後、return hogeとreturn(hoge)の違いは何?
同じ。
a = 0; と a = (0); で違いがないのと同じようなもの。

101 名前:デフォルトの名無しさん :04/01/24 00:27
>>95
それでもいいけど、
operator delete(p, NULL); でもいい。
new/delete の対応がないのが気持ち悪い人用。

102 名前:デフォルトの名無しさん :04/01/24 00:43
>>101
それだけだと、デストラクタが呼ばれないんじゃない?

103 名前:デフォルトの名無しさん :04/01/24 01:19
ほんとだ。呼ばれない。
じゃぁ、オーバーロードした delete って
どうやって呼ぶんだ?

104 名前:デフォルトの名無しさん :04/01/24 01:25
Elements of Reusable Object-Oriented Software CD
ダウンロードしたぜ。(w
URLは・・・・秘密。ぐぐれ。必死に。

105 名前:デフォルトの名無しさん :04/01/24 01:27
>>98

returnに()をつけるかどうかは結構宗教論争の種。
つけない派の主な理由は、
「タイプミスしてretrun (foo);とした時に、コンパイルエラーにならない。
 こういう場合、やっぱりコンパイラで落としてほしい」
というもの。要するにretrunという(外部)関数とみなされて、
リンカでやっとチェックが入る。

C++だったらエラーにしてくれるような気もするが、
俺は上記理由をきいて以降つけない派なので確認してない。

どっちかというとC++じゃなくてCの内容だ。
すれ違いすまん>スレ住人。

106 名前:デフォルトの名無しさん :04/01/24 01:45
>>103
placement new が成功した後、コンストラクタから例外が飛んだとき呼ばれる。

placement new ってのは、引数つきの new を総称する用語、
だったとおもう。

107 名前:デフォルトの名無しさん :04/01/24 03:06
大抵のエディタならreturnなどの予約語は色付けされるから
パッと見てtypoに気付くと思うのだが…

108 名前:105 :04/01/24 09:31
それはWindowsなんかで統合環境が出来てからの話。
というか、今、ジェネレーションギャップを感じた俺。

109 名前:デフォルトの名無しさん :04/01/24 09:59
無駄な括弧は書かないだけだな。
括弧がないからってどこまでがreturn式なのかわからなくなることもないし(笑)

110 名前:デフォルトの名無しさん :04/01/24 10:03
俺は普段は括弧を書かないけど、
return に続くものが 2/3 項演算子を含むときは
括弧で囲んだ方が見栄えがいいので括弧で囲むな。
まぁ、趣味の世界だな。

111 名前:デフォルトの名無しさん :04/01/24 11:35
>108
しかし今となっては107が全て。
カードにfortranのコードを書いてた時代の常識など誰も覚えちゃいないのと同じ事。

112 名前:デフォルトの名無しさん :04/01/24 11:43
エディタでもC++予約語、MS予約語なんかは
色がついてないと気持ち悪いよな。

113 名前:デフォルトの名無しさん :04/01/24 11:45
MS の予約語はどうでもいいや。


114 名前:デフォルトの名無しさん :04/01/24 11:57
主にモノクロ vi でプログラムしてるので
たまに VC++ でプログラムすると
色やインテリセンスのありがたみを
ひしひしと感じる。

115 名前:デフォルトの名無しさん :04/01/24 13:55
>>111

だから括弧を書けというのかあんたは?

116 名前:デフォルトの名無しさん :04/01/24 14:00
カッコつきは return を関数か何かと勘違いしてるように見えてダサい。

117 名前:デフォルトの名無しさん :04/01/24 14:06
>>114
> 主にモノクロ vi でプログラムしてるので
vim(gvim)使えば?

118 名前:デフォルトの名無しさん :04/01/24 14:28
>>117
正直 UNIX ではgvimをつかっても何もいいことがないような気がする。
vim + color terminal のほうが便利。

119 名前:デフォルトの名無しさん :04/01/24 16:16
>>89
IS 3.7.3.2の3より。
>...Otherwise, the
>value supplied to operator delete(void*) in the standard library shall be one of the values returned
>by a previous invocation of either operator new(size_t) or operator new(size_t, const
>srd::nothrow_t&) in the standard library, and...

というわけで、問題なし。

120 名前:デフォルトの名無しさん :04/01/24 18:11
しょうもない質問でもうしわけないのですが、
if(obj != NULL && obj->data > 100)
  std::cout << obj->data - 100 << std::endl;
のように obj != NULL の評価が false の時、
obj->data > 100 は評価されないことが保証されているのでしょうか?
今まで、前の結果に関係なく全てが評価されると思い込んでいたもので。

121 名前:デフォルトの名無しさん :04/01/24 18:16
>>120
C / C++ では、保証されている。
短絡評価でググルべし。

同様に、a || b なら、a が真 (と評価される) なら、b は評価されない。

122 名前:デフォルトの名無しさん :04/01/24 18:16
>>120
基本的には保証されてるけど、
operator&&() を自前で実装した場合は逆に必ず評価される。

123 名前:デフォルトの名無しさん :04/01/24 18:29
>>121-122
レス有難うございます。
ついさっきまで全て評価されると思い込んでいて、
if(obj != NULL)
  if(obj->data > 100)
    std::cout << obj->data - 100 << std::endl;
と、 obj->data に不正アクセスされまいと if 文を分けていました。
いつもこれが嫌だったんですがこれですっきりします。
でも operator&&() だけが評価方向(結合規則?)が違うのも
ちょっとすっきりしないですね。
もう少し調べて見ます。ありがとうございました。

124 名前:デフォルトの名無しさん :04/01/24 18:32
>operator&&()
演算子に見えるけど実体は関数/メンバ関数だから、
関数の引数の評価規則に準じるという意味では自然かと。

125 名前:デフォルトの名無しさん :04/01/24 18:40
>>123
ttp://www.tietew.jp/cppll_novice/archive/93

126 名前:デフォルトの名無しさん :04/01/24 18:43
間違えた
ttp://www.tietew.jp/cppll/archive/93

127 名前:123 :04/01/24 18:59
>>122,124
a && b && c && d
とやったら d, c, b, a と評価されるのかと勘違いしてました。
おっしゃる通り自然でした。

>>126
三項演算使う場合も b ? f() : 0; なんてやってたもんですから、
今から全てそういう形式に書き直そうかなぁと考えてます。

templateの再帰だのなんだのやる前に基本的なことがわかっていなかった・・・。
長いことc/c++やってるけど意外と知らないことが多すぎ。


128 名前:デフォルトの名無しさん :04/01/24 19:16
本当に長いことやってそれだったらやばすぎ。
他人のソースをまともに理解できてないことだってあっただろうに。

129 名前:123 :04/01/24 20:05
>>128
常識ってことですか…。今まで引っかかりすらしなかった…。
あまり他人のソース見てないと言われれば見てないかも。
ちなみに本職ではないのであまりつっこまんでくだせぇ。

130 名前:Addicted to C++ ◆cpp/Sz/v02 :04/01/24 23:22
>>122
ちょい待ち。関数呼び出しの引数評価の順序は不定。

from More Effective C++ 項目7:「&&,||,,をオーバーロードしない」

131 名前:デフォルトの名無しさん :04/01/24 23:36
>>130
引数評価の順序が不定なことと、引数がすべて評価されることは何も矛盾しないぞ。

132 名前:Addicted to C++ ◆cpp/Sz/v02 :04/01/24 23:39
>>122
お、読み違え。スマソ
>>131
指摘ありがd

133 名前:89 :04/01/25 01:06
>>119
なるほど!やっと理解できました。

みなさんどうもありがとうございました。

134 名前:デフォルトの名無しさん :04/01/25 02:09
struct Hoge {
 template < typename T > operator T () const;
};

というクラスがあるとき、

Hoge hoge;
if(hoge) { ... }

と使った場合に、Hoge::operator T() の T は bool 型として呼ばれることは保証されているのでしょうか?

135 名前:デフォルトの名無しさん :04/01/25 02:34
>>134
boolが明らかに必要な場所だから hoge.operator<bool>();
として呼び出される。

136 名前:134 :04/01/25 03:23
>>135
お答えありがとうございました。bool なのですね。

C++だと、int や void* でも if の判定に使えてしまうので、
もしかしたら〜と心配になっていました。

137 名前:デフォルトの名無しさん :04/01/25 03:45
つーかこんな危ないテンプレート作るなよ。
型ごとに個別に定義しとけ。


138 名前:デフォルトの名無しさん :04/01/25 09:36
サブクラス = スーパークラス;

の形で代入された場合にサブクラス固有のメンバを初期化したいと思っています。
そこで

class foo { protected: int foo_value; };

class bar : public foo
{
private: int bar_value;
public: bar & operator =( const foo & f )
{ foo_value = f.foo_value; bar_value = foo_value * 2; return *this; }
};

のように書くと「protected メンバにアクセスできません」とコンパイラに怒られてしまいました。
foo_valueをprotectedにしたままこれを実現するにはどうしたらいいのでしょうか。

また、実際には

サブクラス<hoge> = スーパークラス<piyo>;

のような変換も目的としています。

139 名前:デフォルトの名無しさん :04/01/25 10:19
>>138

 foo::operator=(f);

でいいんじゃないかな?
オーバーライドした時に
スーパークラスのバージョンのやつを呼ぶことがあるのと
同じようなこと。

140 名前:138 :04/01/25 10:33
>>139
すみません。
言っている意味が良く分からないのですが、

foo::operator=(f);

はどこに書くのでしょうか。
それともfoo::operator=(f)をfooクラスに作るという意味ですか?
そうするとbarクラスの初期化をどうやるのかが分かりません。

141 名前:デフォルトの名無しさん :04/01/25 10:35
>>140

 foo_value = f.foo_value;

の代わりに

 foo::operator=(f);

ってこと。
今の状態だと foo で = 演算子を定義してないから、
デフォルトの = 演算子(メンバ全部代入して移す)が適用される。

もしこれがいやなら、代わりに
適当な protected メンバ関数でも作って、
それ呼べばいいんじゃないかな?

142 名前:141 :04/01/25 10:41
あぁっと、
> もしこれがいやなら、代わりに
> 適当な protected メンバ関数でも作って、
> それ呼べばいいんじゃないかな?
は、foo に作るのね。

class foo {
protected:
 int foo_value;
 void copy_value(const foo& f) {
  foo_value = f.foo_value;
 }
};

class bar {
 int bar_value;
public:
 bar& operator=(const foo& f) {
  copy_value(f);
  bar_value = foo_value * 2;
  return *this;
 }
};

143 名前:138 :04/01/25 11:09
>>141
おぉ、成る程!
ありがとうございます。

しかし、barはfooを継承しているのに
外から来たfooのprotectedメンバ変数にアクセスできないというのが納得いかないのですが。

class baz {
private:
int my_value;
void copy( const baz & b )
{ my_value = b.my_value; }
};

はb.my_valueが外から来たbazのprivateにも関わらずちゃんとアクセスできるのに。

144 名前:デフォルトの名無しさん :04/01/25 11:28
だよなぁ。
でも、何らかの危険性を回避するために
そうしてるんだろうなぁ。
それが何かはパッとは思いつかないけど。

145 名前:デフォルトの名無しさん :04/01/25 14:34
>>143>>144
同じクラスのprivateメンバ、protectedメンバはアクセス
出来ても、継承したらもう外部からはアクセスできない
というルールが見つかればいいんだよね。

146 名前:デフォルトの名無しさん :04/01/25 16:44
Javaでthis.x = x;とするように、インスタンス変数とメソッドのパラメータを
同じ名前にして、値を受け渡す様なことは出来ないでしょうか。

class hoge{
 int value;

 public void method(int value){
  this.value = value;
 }
}
こんな感じで。

147 名前:デフォルトの名無しさん :04/01/25 16:46
(*this).value = value;
ではだめ?

148 名前:デフォルトの名無しさん :04/01/25 16:46
できますよ

149 名前:デフォルトの名無しさん :04/01/25 16:46
this->value = value;

150 名前:147 :04/01/25 16:46
this->valueでもいいかな?

151 名前:147 :04/01/25 16:47
うお、かぶったーーーーースマソ

152 名前:デフォルトの名無しさん :04/01/25 16:51
メンバ変数にプリフィクスでも付けた方が
タイプ数減ると思うんだけどなぁ。

153 名前:デフォルトの名無しさん :04/01/25 16:52
あぁ、そうか。
他のところで増えるんか。

154 名前:146 :04/01/25 17:48
どうもありがとうございました。

155 名前:デフォルトの名無しさん :04/01/26 16:38
for文でcinから入力された文字がAかBかCかDならforから抜け出すという
条件を書きたいのですが…何回も書いても上手くいきません。。
教えていただきたい…。

156 名前:デフォルトの名無しさん :04/01/26 16:44
>>155
とりあえずうまくいかないコード見せないと、なんとも。

157 名前:デフォルトの名無しさん :04/01/26 20:06
VC++でSTLのVectorコンテナをいろいろ試してるんですが、
erase()メソッドで要素を一部削除しても、サイズが減少しません。
これはどのコンパイラでも同じなんでしょうか?
それとも要素である構造体にデストラクタを実装しろということなんでしょうか。



158 名前:デフォルトの名無しさん :04/01/26 20:19
>>157
自己レスです。
vector<int>で試してみるとやっぱり減ります。

struct item
{
string name;
string type;
int size;
};

vector<item> vitem;

の最初のstringだけが削除されているようです。
デストラクタでname.clear()かなんかしろということなんでしょうね、きっと。




159 名前:デフォルトの名無しさん :04/01/26 20:23
erase する部分のコードも欲しいな。

160 名前:プログラム初心者 :04/01/26 21:20
こんにちわ。現在、USBハブ経由で複数のUSBケーブルをPCに繋いで
それらのケーブルに接続した携帯電話同士でデータ転送を行いたいと
考えております。
OSによっては毎回USBケーブルに割り振られるポートが変わってしまう
ようなのですが、これを回避する為にケーブル毎に割り振られるポート
をプログラム的に指定したいと考えております。
例えばC++を使用した場合どういった実現方法があるでしょうか?
ポートを指定できるようなオブジェクトが標準で提供されている
でしょうか?
どなたか御存知の方がいらしたら宜しくお願いします

161 名前:デフォルトの名無しさん :04/01/26 21:36
>>160
>>ポートを指定できるようなオブジェクトが標準で提供されているでしょうか?
C++言語ではそういったライブラリは用意されていません。
ご使用になる OS の API 等をご確認ください(「このスレッドで質問する」以外の方法で)。


162 名前:デフォルトの名無しさん :04/01/26 23:59
>>157-159
むしろ、サイズ・削除されているorいない、をどうやって確認しているかの方が怪しいな。


163 名前:デフォルトの名無しさん :04/01/27 00:19
>>157
swap技法(Effective STL日本語版P76)
std::vector<item>.swap(vitem);

164 名前:デフォルトの名無しさん :04/01/27 01:36
>>163
括弧が抜けてるYO
std::vector<item>().swap(vitem);

165 名前:デフォルトの名無しさん :04/01/27 07:57
キャパシティじゃなくてサイズって言ってるし

166 名前:デフォルトの名無しさん :04/01/27 09:53
>>164
うぉ、コンストラクタを呼び出す()を忘れた。
>>165
よく読んでみるとそうでした。

std::vector::erase(itr)はイテレータが指す要素を削除し、次の
要素を指すイテレータを返しますが、サイズは変化しません。
サイズを変化させる(切り詰める)には明示的にstd::remove()
を呼び出す必要があります。

167 名前:デフォルトの名無しさん :04/01/27 12:36
>>166
ん? サイズは減るでしょ。減らないのはキャパシティ。

168 名前:デフォルトの名無しさん :04/01/27 14:11
ちょいと初歩的かもしれないが質問させてちょ
#include <iostream>
using namespace std;

class CClass_A
{
public:
 CClass_A() { cout << "A Construct" << endl; }
 ~CClass_A(){ cout << "A Destruct" << endl; }
};

CClass_Aa;
int main(){ return 0; }

上のソースだと CClass_A のコンストラクタは呼び出されるけど、
デストラクタが呼び出されない。
これって永遠にデクトラクタ呼び出されないコース?
CClass_A a の有効範囲からして終了時に呼び出されるから画面にはでないだけで
実は呼び出されているとか?
hoge.exe >> hoge.txt でテキストに落としたけど
やっぱりデストラクタは呼び出されていないんだ
素直に new して delete しろってことかい?

169 名前:デフォルトの名無しさん :04/01/27 14:20
CClass_Aのデストラクタより先にstd::coutのデストラクタが呼ばれてるので、
CClass_Aのデストラクタが呼ばれるときにはすでにstd::coutが無効になっている。
ただそれだけ。

170 名前:デフォルトの名無しさん :04/01/27 14:36
>>169
なるほど std::cout が先に無効になるんだ
デストラクタで最終的にログを取りたかったからデストラクタの部分に
テキストファイルとして出力するように改良してみたらうまく呼び出されてたよ

これで謎も解けたしログも取れたしC++はおもしろいや

171 名前:デフォルトの名無しさん :04/01/27 20:10
>>166
もうちょっと落ち着いて、確認してから書き込んでください。

172 名前:デフォルトの名無しさん :04/01/27 21:41
157です。
サイズってのはsize()という意味ではなく、実メモリ領域の大きさを
いいたかったんですが、結局のところ、erase()すると開放されるんでしょうか?

まあ、end()のイテレーターは確かに削除後の最後の要素を指しているようなので
気にしないでとっととコーディングを進めることにします。

みなさんありがとうございました。


173 名前:デフォルトの名無しさん :04/01/27 21:55
>>172
> erase()すると開放されるんでしょうか?
されない。どうしても解放しなければならない理由が
あるのなら、>>163の方法を使う。

174 名前:sage :04/01/27 21:55
>>169
コンストラクタの逆順でデストラクトされるってルールに従えば
CClass_A aの構築前にcoutが構築されているなら大丈夫な気がするんだけど……

って、これが保証されるのは同じ翻訳単位内だけだっけ?


175 名前:デフォルトの名無しさん :04/01/27 23:30
>>168
規格違反と思われ。
現象が発生する環境キボン。

176 名前:デフォルトの名無しさん :04/01/27 23:32
>>172
いや、std::vector::erase()は配列に0を書き込むようなもの。もちろん
そこに入ってるものがクラスならデストラクタも呼び出してくれる。
しかしポコッと穴が開くだけ。

開放するという意味とキャパシティが減少するという意味を取り違え
なければわかるはず。

177 名前:デフォルトの名無しさん :04/01/27 23:37
>>176
いや、だからvectorのeraseは詰めるって
それでsizeが減少するんだって

178 名前:デフォルトの名無しさん :04/01/27 23:41
>>176
いままであんたの作ったコードにstd::vector::erase()がなかったことを祈るよ。

179 名前:デフォルトの名無しさん :04/01/28 00:19
clear が erase で実装されてるのを見たことがある希ガス

180 名前:デフォルトの名無しさん :04/01/28 00:24
とどのつまりは、std::vector::erase()は要素を削除し、詰めるが、
capacity()は変化しないという事でOK?

#include <iostream>
#include <vector>

class Test {
int t;
public:
Test(int i = 0) : t(i) {}
};

int main()
{
std::vector<Test> abc(100);

std::cout << "size = " << abc.size() << ", capacity = " << abc.capacity() << std::endl;
std::vector<Test>::iterator iv = abc.begin() + 50;
abc.erase(iv);
std::cout << "size = " << abc.size() << ", capacity = " << abc.capacity() << std::endl;
}


181 名前:デフォルトの名無しさん :04/01/28 00:28
おk

182 名前:デフォルトの名無しさん :04/01/28 00:29
OK

183 名前:デフォルトの名無しさん :04/01/28 00:42
ちなみにswap技法の書き方も間違っている。

×std::vector<Test>().swap(abc);
↑こう書くと、空のvectorと交換するため、空のvectorが出来上がる
ので駄目。

○std::vector<Test>(abc).swap(abc);
↑capacity()を切り詰めたいならこう書く事。

184 名前:デフォルトの名無しさん :04/01/28 01:42
>>183
用途が違うだけで間違ってるとは言えない気がする。

185 名前:デフォルトの名無しさん :04/01/28 06:11
0では駄目でNULLが必要なのはどういう場面でしょうか?

C FAQ5.5の中で
http://www.catnet.ne.jp/kouno/c_faq/c5.html#5
「キャストのついてない0がポインターを必要とする場所にあらわれた場合に、
コンパイラは、そのマシンに適切なヌルポインターを作り出すことができなければならない」
という記述があります。
これをわたしは

char *pt;
if ( pt == 0 )

というソースがあれば

if ( pt == (char *)0 )

とコンパイラーに解釈されることが保証されているという意味だと(わたしが)解釈して
「型にあわせてキャストしてくれるならNULLという表現はどうしてあるのか?0でいいのでは?」
と考えたわけです。

NULLがはびこっている以上、この類推のどこかの時点で間違ってると思うのですがどこでしょうか?
つっこみお願いします。

186 名前:デフォルトの名無しさん :04/01/28 06:39
希望の形を選択し、大きさを入力すると、*で丸、正方形、長方形を描きます。
授業になかなか着いて行けないので困っています。
事情のわかる方よろしくお願い致します。

http://up.isp.2ch.net/up/2e6bb62a6ceb.exe
C++ の初級授業で出された宿題なのですが、
これと同じ機能を持つプログラムを組まなければ成りません。

187 名前:デフォルトの名無しさん :04/01/28 08:00
>>185
その類推はあってるんだけど、C++ では

 #define NULL 0

とのみ定義される。
従って、 可読性を高める ために NULL を使うだけであって、
実際の動作で 0 と異なる点は一切ない。

C では int 変数とかに代入できないよう

 #define NULL ((void*)0)

という定義も許されてたから可読性以上の意味があったけど、
C++ では void* から任意のポインタ型への暗黙のキャストが廃止されたため、
この定義が使えなくなった。

どうせなら null キーワードでも作ってくれれば良かったんだけどね。
NULL 使わずに 0 を使う人もいるから導入しなかったのかな...。

188 名前:デフォルトの名無しさん :04/01/28 08:32
>>187
禿自身が0派だからね(笑)

189 名前:168 :04/01/28 10:33
>>174,175
OS win98 VC++6.0 コンパイルオプション デフォルトです。

オブジェクト脳内構築順番では std → CClass_A だから
起動して実際にコンストラクタが呼ばれるのは std → CClass_A
デストラクタはその反対で CClass_A → std
だから std が先に無効になるのはちょっと疑問は残っていたんだ

やっぱり規格違反なのかな

190 名前:デフォルトの名無しさん :04/01/28 11:38
式の中で一時オブジェクトのポインタを使用したら
警告を受けました。

foo( &String("hello") ); ←こんな使い方で
warning: taking address of temporary ←警告でました

横着しないでオブジェクトを確保すべきでしょうか?

191 名前:デフォルトの名無しさん :04/01/28 11:48
>>190
ya

192 名前:デフォルトの名無しさん :04/01/28 11:57
もしくはfooの引数を定数参照にするかだな。
本当にアドレスが欲しいのでなければ

193 名前:デフォルトの名無しさん :04/01/28 11:58
>>190
ttp://www.tietew.jp/cppll/archive/9104

194 名前:190 :04/01/28 12:11
>>191,192,193
ありがとうございます!勉強になりました。

195 名前:デフォルトの名無しさん :04/01/28 12:44
>>189
どちらにしろ、たまたま CClass_A → cout になっただけで
動かなくなるプログラムは組むべきではない。

196 名前:崖っぷち :04/01/28 13:12
誰か助けてください!
大学でレポートが出されまして、これが明日までに出来ないと留年してしまいます!
どなたか宜しくお願いします・・・・(T_T)

配列Aのデータをソートせよ。ただしAの入力は Void getdata(int *n,double *a)
を呼び出せば入力できるものとする。

っていうものです。このままでは本当に留年が確定してしまうのでどなたか助けてください・・・・・

197 名前:デフォルトの名無しさん :04/01/28 13:16
#include <algorithm>
#include <vector>
int main()
{
std::vector<double> a; int n;
getdata(&n,NULL); a.resize(n); getdata(&n,&a[0]);
std::sort(a.begin(), a.end() );
}

198 名前:崖っぷち :04/01/28 13:35
>>197さん
それであっているのでしょうか?
学校でないと実行できないのでよくわかりません・・・・。
いかんせんパッパラパーなもので申し訳ないです・・・。

199 名前:デフォルトの名無しさん :04/01/28 13:47
>198
教えてもらってるのに信用しない
信用出来ないけど、自分で判断する脳もない
そんな貴方には留年が最適かと思われます


200 名前:デフォルト名無しさん :04/01/28 13:52
ファイルの読み込みについて質問です.

001.csvを読み込む
 ↓
計算(if,and,orで1と0にするだけの単純なもの)
 ↓
aaa.txtに追加書き込み
 ↓
002.csvを読み込む
 ↓

このようなプログラムをループさせて,600ファイルほど計算したいのですが
名前の違うファイルをループさせて読み込ませるにはどうしたらいいでしょうか?

201 名前:デフォルトの名無しさん :04/01/28 14:31
あってはいても、人に教わったのがバレバレでやっぱり留年(w

>>200
ファイル名次第。規則性があれば簡単。なければファイル名リストを用意せなアカン。
いずれにせよ環境依存。

202 名前:デフォルトの名無しさん :04/01/28 14:35
>>200
C++に何の関係もなくて宿題スレ行きっぽいけど、
まあ簡単だから答えておくと、

for (int i=1;i<=600;++i){
  char filename[256];
  sprintf(filename,"%03d.csv",i);
  // 処理いろいろ
}

これで、filenameの中には001.csv〜600.csvって文字列が順次入るから、
それを使ってファイルをオープンして処理すればいい。

203 名前:168 :04/01/28 16:42
>>195
OK!
素直にnew,deleteするよ

204 名前:デフォルトの名無しさん :04/01/28 18:17
>>4に紹介されている本が置いてある書店を知りたいんですが
上野を中心に考えてどこかないでしょうか。
中身を見ずに通販で直接買うにはやや高いので、出来ればパラパラと
内容確認をしてから買うかどうか決めたいのです。


205 名前:デフォルトの名無しさん :04/01/28 18:59
>>204
英文でよければpdf落っこちてるよ(タイーホ)

206 名前:デフォルトの名無しさん :04/01/28 19:15
>>204
上野ってのが東京のそれなら秋葉原なり神田なりまでいけばいくらでも。

207 名前:デフォルトの名無しさん :04/01/28 19:43
>>204
レビューもあるのに そこまで嫌なら足で稼ぐしかないでしょ
書店っていってもたまたま在庫切れだったりするし

208 名前:デフォルトの名無しさん :04/01/28 20:22
>>204
4にのってる本はあまりに有名なので秋葉でも神田でもどこでも置いてあると思われ。
足で稼ぐほどでもない。

まぁ強いて言うなら、上野からの距離という意味では東大の生協が一番近いかもしれん。


209 名前:デフォルトの名無しさん :04/01/28 21:39
インターフェースの実装についてです。

通常の本では、インターフェースの実装はインターフェースクラスにメソッドを仮想関数
として実装し、それを使う側がメソッドをオーバーロードして使うような手順になるよう
ですが、そもそもインターフェースは提供者側がメソッドを定義して使わせるという
イメージだったのですが、逆のような気がするのですが、どうしてこうしてるのでしょうか?


210 名前:デフォルトの名無しさん :04/01/28 21:46
>>209
継承、抽象化、隠蔽化などについて勉強汁。


211 名前:209 :04/01/28 22:46
すみません。質問の仕方をちょっと変えてみます。

あるインターフェースクラスAを別のクラスB,C,Dが使うという場合、
B,C,Dがオーバーロードするメソッドが異なれば意味ありますが、
もし全く同じものなら、クラスB,C,Dのおのおのに、オーバーロード
すべき(全く同じ)メソッドを定義しなければならなくなると思ったのですが。


212 名前:デフォルトの名無しさん :04/01/28 22:56
>>211
「インターフェースを使う」の意味が曖昧。
オーバーロードとオーバーライドの意味を混同しているっぽい。
「メソッド」が「同じ」とか「異なる」とかの意味が不明。

総じて、意味がわからん。

213 名前:デフォルトの名無しさん :04/01/28 22:56
>>211
JavaじゃねぇんだからそういうのはAで普通の仮想関数として定義しとけばいいだろ

214 名前:デフォルトの名無しさん :04/01/28 23:07
>>211
簡単なプログラム例でいいから具体的に示してよ。
本当に簡略化した奴でいいから。

215 名前:デフォルトの名無しさん :04/01/28 23:26
>>211
デフォルトの実装がだいたい決まっている場合は
Javaだと継承して〜Adaptorなんてクラスを作る

このへんは経験で言わせてもらうが
しみったれた実装を残しておくぐらいなら
インターフェースを明確にしておく安心感の方が
はるかに大きい



216 名前:デフォルトの名無しさん :04/01/28 23:31
>209
「使用者」→(使う)→「インターフェイス」←(実装する)←「提供者」

217 名前:デフォルトの名無しさん :04/01/29 00:05
>>196-199 オモロイ

218 名前:デフォルトの名無しさん :04/01/29 01:39
例外処理で質問です。
try{
int x = 0;
int y = 4/x;
} catch(...){
//error
}

のように書いたとき全ての例外をキャッチできますが、
catch(...)の書き方は一体何なんでしょうか?
VCを使ってますが処理系に依存するコードなんでしょうか?


219 名前:デフォルトの名無しさん :04/01/29 01:49
>>218
全ての型。環境依存ではない。

220 名前:デフォルトの名無しさん :04/01/29 02:01
>>218
しかしそのコードは(int y = 4/x; で)未定義動作を起こす。

221 名前:デフォルトの名無しさん :04/01/29 02:06
intで0除算したら例外が飛んでくることを期待している?

222 名前:デフォルトの名無しさん :04/01/29 02:12
0除算で投げられる例外はWin32構造化例外。
それがcatch(...)で捕捉できるのはVC++の独自拡張。


223 名前:185 :04/01/29 09:23
>>187
可読性のためなんですね。
ありがd。

224 名前:デフォルトの名無しさん :04/01/29 09:39
時々structをclassのように使ってるのを見るけど
struct hoge
{
  int foo;
  hoge() {
   ....
  }
}
これって文法上何って言うのでしょうか?(調べるためのキーワードがわからなくて・・
classとどう違うのですか?

225 名前:デフォルトの名無しさん :04/01/29 09:51
>>224
基本的に、classと違わない。
アクセス属性を何も書かなかったときのデフォルトが、
 class → private
 struct → public
なだけ。

226 名前:デフォルトの名無しさん :04/01/29 10:02
C++ の文法上はやっぱり構造体と呼ぶしか無いだろうな。

227 名前:デフォルトの名無しさん :04/01/29 11:46
publicメンバ持ってるよんと明示するときにstructにしてる。

228 名前:デフォルトの名無しさん :04/01/29 12:20
Cのランタイムについて教えていただきたいのですが、
BCBとVCではランタイムのソース(実装)が違いますが
これって標準Cでは機能だけ指定されていて、実装は
各コンパイラメーカに任されているっていうことなのですか?

229 名前:デフォルトの名無しさん :04/01/29 12:32
Cみたいにデータだけ登録する場合はstructだなぁ。

>>228
ライブラリってそういうものだよ。規格さえ守っていれば実装はどうでも良い。

230 名前:デフォルトの名無しさん :04/01/29 12:34
>>228
(゚Д゚)ハァ?
標準Cはただの言語仕様だ。
何も実装はしない。


231 名前:デフォルトの名無しさん :04/01/29 12:37
>>228
ここはC++スレだけど、標準Cと言っているので一つ例を出すと、
qsortがいい例だね。別にクイックソートを使わなければならないわけではなく、他のソートと組み合わせてもいい。
bsearchもバイナリサーチでなくてもいい(前提条件があるから他の方法で実装する人はいないだろうけどねぇ)。

232 名前:228 :04/01/29 12:39
>標準Cはただの言語仕様だ。
>何も実装はしない。

未熟ですみません(--);;
標準Cというのはstdのことですよね。
とするとstdの一部であるのSTLとかも、機能とか最低限
のレスポンスが229さんが言うように定められていて
実装はコンパイラメーカが自由にできるという認識
でいいんですかね。





233 名前:228 :04/01/29 12:42
>>231
なるほど。あくまでクイックにソートできればいいという
話でアルゴリズム(実装)は自由なんですね。
アホなもんで、CRTのソースは標準化機構が作って各コンパイラ
メーカに配っているのだと思っていました。。。

234 名前:デフォルトの名無しさん :04/01/29 12:42
>>232
実装まで定義されていたら作れない環境が続出しちゃうよ。
OSの機能を使わざるを得ない関数(malloc,fopen,etc...)とかね。

235 名前:228 :04/01/29 12:44
>>234
>実装まで定義されていたら作れない環境が続出しちゃうよ。
>OSの機能を使わざるを得ない関数(malloc,fopen,etc...)とかね。

あくまでランタイム(仮想マシン)なんですね。
そう考えると理解できるようになってきました。。。


236 名前:218 :04/01/29 13:18
>>219-222
ありがとうございます。なんとなくわかりました・・・


237 名前:デフォルトの名無しさん :04/01/29 14:10
>>228
>標準Cというのはstdのことですよね。
>とするとstdの一部であるのSTLとかも、機能とか最低限
>あくまでランタイム(仮想マシン)なんですね。
きみは何の話をしとるのか

238 名前:デフォルトの名無しさん :04/01/29 14:42
細かい言葉の定義についてネチネチあげつらう趣味は無いけど、
>>228の用語の使い方はちょっと変すぎるなぁ

239 名前:デフォルトの名無しさん :04/01/29 14:59
要するに勘違いしてる。

240 名前:デフォルトの名無しさん :04/01/29 15:06
>>235
一番的確に言うとすれば、インターフェイスが定義されているだけ。
こういう名前の関数をこんな風に呼び出してください。ってこと。

>ランタイム(仮想マシン)
仮想マシンってのはJavaとかと混同してるんじゃないかな?
JavaでのランタイムはJ2SEだけど、これ自身は仮想マシンではないよ。

241 名前:デフォルトの名無しさん :04/01/29 15:13
C++と混ざってるんじゃ?

242 名前:デフォルトの名無しさん :04/01/29 15:26
要するに色々混ざってる。

243 名前:デフォルトの名無しさん :04/01/29 15:52
構造体のアライメントに関して質問です。
環境はWinXP Pro + VC6(SP5)です。

構造体のサイズを sizeof で調ると、

typedef struct TTT{
char a[257];
int b;
char c;
} ttt;
が 268、char c をコメントアウトすると 264、int b もコメントアウトすると 257 になります。

これはコンパイラオプションの「構造体メンバのアライメント」によるものだと
いうのはおぼろげに分かっているのですが、どういう条件でサイズが変わるのか、
また、パディングはどこに入るのかなど教えていただけないでしょうか。
参考になるサイトはないかとずいぶん調べたのですが、見つけられませんでした。
よろしくお願いします。

244 名前:デフォルトの名無しさん :04/01/29 16:12
聞いた言葉を適当につなげて知っている振りをする

245 名前:デフォルトの名無しさん :04/01/29 16:19
>>243
cout << offsetof(TTT, a) << endl;
cout << offsetof(TTT, b) << endl;
cout << offsetof(TTT, c) << endl;


246 名前:243 :04/01/29 16:20
>>244
分かるんだったら教えてくださいよw

追記すると、デフォルトだと8バイト単位(/Zp8)になってるそうで、
またそのオプションは規定値のままいじってないのですが、
構造体のサイズを実際に調べると8バイト単位になってるわけではないし、
一体なにが8バイト? って感じで悩んでるんです。

247 名前:244 :04/01/29 16:22
>>246
すまん、キミ宛じゃなかったんだが・・・
粗い面とはVCの場合、境界をまたがない時には
整列しません。たしかデフォルトは 8

248 名前:デフォルトの名無しさん :04/01/29 16:24
アドレスが8の倍数になるってこと。

b,cともコメントアウトした場合ってのは、charだけの場合アラインメントして
も意味がないからしないってこと。


249 名前:デフォルトの名無しさん :04/01/29 16:32
>>243
245の結果
0
260
264
aとbの間にパディングが入るみたいだね。


250 名前:243 :04/01/29 16:32
>>245
0、260、264という結果になりました。

>>247
うおっ 失礼しました (´д`;)スマソ・・・

>>248
アドレスが8の倍数に・・・ですか。
うーん??
正直まだよく分からんです。bの開始位置が260、でも260は
8の倍数ではないですよね。メンバじゃなくて、構造体の先頭アドレスってことですか?


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