2ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

C++相談室 part17

1 :v(^・^)v:03/03/13 21:54
C++に関する質問はこちらへどうぞ。
ただし質問の前にFAQに一通り目を通してください。
また、テンプレートライブラリ(STL含む)に関する質問は
専用の別スレへどうぞ。

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

2 :v(^・^)v:03/03/13 21:54
■基本■
[Stroustrup]
禿 http://www.research.att.com/~bs/
C++に関するリンクの総本山でもあります。

[C++ Final Draft International Standard]
http://www.kuzbass.ru/docs/isocpp/
http://www.kuzbass.ru/docs/ansi_iso_iec_14882_1998.pdf

[JTC1/SC22/WG21 - C++]
http://std.dkuug.dk/jtc1/sc22/wg21/
規格書の重箱の隅的な話題などが読めます。

[C/C++ Users Journal]
http://www.cuj.com/
[Object Management Group]
http://www.omg.org/
[Association of C & C++ Users]
http://www.accu.org/

[news]
news:comp.lang.c++
news:comp.lang.c++.moderated

[ML]
cppll(日本語) http://www.trickpalace.net/cppll/
メインページにC++に関する良質なC++日本語リンク集があります。

3 :v(^・^)v:03/03/13 21:55
■Document■

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

[STL]
STL Programmer's Guide http://www.sgi.com/tech/stl/
日本語としてはおそらくここ。ただしリファレンス的内容。
http://www.wakhok.ac.jp/~sumi/stl/

[boost]
これに関しては公式のドキュメント、又はソースを読むのが一番です。
ただし日本語でいくつか有益な情報が読めます。
Let's boost http://www.kmonos.net/alang/boost/
shinichiroさん http://user.ecc.u-tokyo.ac.jp/~g940455/wp/
news news:gmare.comp.lib.boost.devel

4 :v(^・^)v:03/03/13 21:55
■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 :デフォルトの名無しさん:03/03/13 21:55
【過去スレ倉庫・その2】

21st: http://pc3.2ch.net/jisaku/kako/1027/10277/1027722910.html
22nd: http://pc3.2ch.net/jisaku/kako/1028/10289/1028907289.html
23rd: http://pc3.2ch.net/jisaku/kako/1031/10316/1031682768.html
24th: http://pc3.2ch.net/jisaku/kako/1033/10335/1033560431.html
25th: http://pc3.2ch.net/jisaku/kako/1034/10348/1034812874.html
26th: http://pc3.2ch.net/jisaku/kako/1035/10359/1035941663.html
27th: http://pc3.2ch.net/jisaku/kako/1037/10372/1037214869.html
28th: http://pc3.2ch.net/jisaku/kako/1038/10386/1038655723.html
29th: http://pc3.2ch.net/test/read.cgi/jisaku/1040485482/ (HTML化待ち)
30th: http://pc3.2ch.net/test/read.cgi/jisaku/1042546212/ (HTML化待ち)
31st: http://pc3.2ch.net/test/read.cgi/jisaku/1044299316/ (HTML化待ち)
32nd: http://pc3.2ch.net/test/read.cgi/jisaku/1045922625/ (前スレ)


6 :v(^・^)v:03/03/13 21:55
■Compiler■
[GCC]
http://gcc.gnu.org/
(Windows上でのPOSIX環境構築 http://www.cygwin.com)
[Borland C++ Compiler]
http://www.borland.co.jp/cppbuilder/freecompiler/
[.NET Framework SDK]
1.0 http://www.microsoft.com/japan/msdn/netframework/downloads/sdk.asp
1.1βhttp://msdn.microsoft.com/downloads/default.asp?url=/downloads/sample.asp?url=/MSDN-FILES/027/002/056/msdncompositedoc.xml
[MSVC] コンパイラ以外のツール、ドキュメントです。
http://www.microsoft.com/msdownload/platformsdk/sdkupdate/
(一括ダウンロードの時は上のURLに続けてこちらを入力してください
default.htm?p=/msdownload/platformsdk/sdkupdate/psdk-full.htm)

なお上記三者を組み合わせたプログラミングにおいてはこちらが分かりやすいです。
http://www.geocities.com/Tokyo/Ginza/5432/documents/winprog/index.html

[DigitalMars]
http://www.digitalmars.com/
[Comeau]
http://www.comeaucomputing.com/
[intel C++ Compiler]
http://www.intel.com/software/products/compilers/
[metrowerks]
http://www.metrowerks.com/mw/default.htm

7 :v(^・^)v:03/03/13 21:56
■Libraries■
Boost http://www.boost.org/
STLport http://www.stlport.org/
Loki http://www.moderncppdesign.com/
LokiPort
MSVC7 http://www.geocities.com/rani_sharoni/LokiPort.html
MSVC6.0 SP5 http://fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport

ACE/TAO http://www.cs.wustl.edu/~schmidt/
Network、Thread、ORBなどのポータブルなライブラリ
Blitz++ http://www.oonumerics.org/blitz/
数値計算ライブラリとして人気がある、らしい
spirit http://spirit.sourceforge.net/
flex++ Bison++ http://www.idiom.com/free-compilers/TOOL/BNF-15.html
パーサジェネレータ

他ライブラリリンク集
http://www.trumphurst.com/cpplibs/cpplibs.phtml

8 :v(^・^)v:03/03/13 21:56
■過去スレ■
Part1 http://piza.2ch.net/tech/kako/980/980175292.html
Part2 http://pc.2ch.net/tech/kako/996/996640937.html
Part3 http://pc.2ch.net/tech/kako/1003/10038/1003832761.html
Part4 http://pc.2ch.net/tech/kako/1009/10090/1009071535.html
Part5 http://pc.2ch.net/tech/kako/1014/10142/1014217496.html
Part6 http://pc.2ch.net/tech/kako/1018/10184/1018454705.html
Part7 http://pc.2ch.net/tech/kako/1021/10217/1021787032.html
Part8 http://pc3.2ch.net/tech/kako/1025/10250/1025010364.html
Part9 http://pc3.2ch.net/tech/kako/1027/10273/1027347982.html
Part10 http://pc3.2ch.net/tech/kako/1029/10293/1029315669.html
Part11 http://pc3.2ch.net/tech/kako/1032/10323/1032345774.html
part12 http://pc3.2ch.net/tech/kako/1035/10350/1035005882.html
part13 http://pc3.2ch.net/tech/kako/1038/10380/1038031395.html
part14 http://pc2.2ch.net/test/read.cgi/tech/1041328679/l50
part15 http://pc2.2ch.net/test/read.cgi/tech/1043605481/l50
part16 http://pc2.2ch.net/test/read.cgi/tech/1045746245/

9 :デフォルトの名無しさん:03/03/13 21:58
Java!

10 :デフォルトの名無しさん:03/03/13 21:58
■関連スレ(テンプレートを用いたライブラリ中心)■
【C++】template 統合スレ -- STL/Boost/Loki, etc.
http://pc2.2ch.net/test/read.cgi/tech/1037795348/l50
【C++】Boost使い集まれ!
http://pc2.2ch.net/test/read.cgi/tech/1033830935/
STLスレッド
part1 http://pc.2ch.net/tech/kako/1004/10042/1004287394.html
part2 http://pc3.2ch.net/tech/kako/1026/10267/1026793823.html
Generic Programming with C++ Template
http://pc.2ch.net/tech/kako/1008/10085/1008593126.html

11 :デフォルトの名無しさん:03/03/13 21:59
■関連スレ(環境依存の話題)■
[GCC]
GCCについて http://pc2.2ch.net/test/read.cgi/tech/1007731543/l50
祝・GCC 3.0リリース http://pc.2ch.net/test/read.cgi/unix/992942337/l50
[Digital Mars]
Code of the Nerds" Digital Mars C/C++
http://pc2.2ch.net/test/read.cgi/tech/1044210976/l50
[Borland]
C++Builder相談室
part1 http://piza2.2ch.net/tech/kako/969/969458279.html
part2 http://pc.2ch.net/tech/kako/997/997074601.html
part3 http://pc3.2ch.net/tech/kako/1016/10160/1016065855.html
part4 http://pc2.2ch.net/test/read.cgi/tech/1035596146/l50
part5 http://pc2.2ch.net/test/read.cgi/tech/1045542179/l50
タダで使えるBorland C++!
part1 http://pc3.2ch.net/tech/kako/1002/10023/1002377328.html
part2 http://pc2.2ch.net/test/read.cgi/tech/1030493157/l50
[VisualC++]
VisualC++相談室
part 1 http://piza.2ch.net/tech/kako/970/970607517.html
part 2 http://piza.2ch.net/tech/kako/981/981630730.html
part 3 http://piza2.2ch.net/tech/kako/993/993186053.html
part 4 http://pc.2ch.net/tech/kako/1002/10021/1002165477.html
part 5 http://pc.2ch.net/tech/kako/1006/10068/1006834463.html
part 6 http://pc.2ch.net/tech/kako/1011/10116/1011615035.html
part 7 http://pc.2ch.net/tech/kako/1017/10178/1017843192.html
part 8 http://pc.2ch.net/tech/kako/1022/10224/1022499000.html
part 9 http://pc2.2ch.net/test/read.cgi/tech/1036897197/l50

12 :デフォルトの名無しさん:03/03/13 21:59
ぉっ

13 :v(^・^)v :03/03/13 21:59
VisualC++(MFC限定)相談室 MFC6.dll
http://pc2.2ch.net/test/read.cgi/tech/1039607377/l50
Windows Programing for C/C++(Not MFC)
http://pc2.2ch.net/test/read.cgi/tech/1018239290/l50
COM の世界を斬る!
http://pc2.2ch.net/test/read.cgi/tech/981823340/l50
ATL 相談室
http://pc2.2ch.net/test/read.cgi/tech/1029029882/l50
managed C++ やろうぜ!!
http://pc2.2ch.net/test/read.cgi/tech/1014486422/l50

14 :v(^・^)v:03/03/13 22:00
終わりです

15 :デフォルトの名無しさん:03/03/13 22:16
乙彼

16 :デフォルトの名無しさん:03/03/13 22:19
STLつかうと一気に実行ファイルサイズが10倍に?!

17 :デフォルトの名無しさん:03/03/13 22:20
持つ彼〜

18 :デフォルトの名無しさん:03/03/13 22:21
>>16
処理系とオプション書いてみ。

19 :デフォルトの名無しさん:03/03/13 22:43
STLを使い出すと今までと同じ労力で10倍の規模のプログラムを作れてしまう、
という意味なんだろ?

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

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

22 :デフォルトの名無しさん:03/03/13 23:09
>>21
#include <stdafx.h>

後死ね。

23 :デフォルトの名無しさん:03/03/13 23:11
>>20
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。

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

25 :デフォルトの名無しさん:03/03/13 23:16
>>22
よくわからないんだけど・・・

26 :デフォルトの名無しさん:03/03/13 23:21
>>16 >>20 >>23
デジャヴですか?

27 :デフォルトの名無しさん:03/03/13 23:44
>>20
それ前スレの俺の書き込みのコピペ(w。
もうBorland-C++は5.6.4になってるよ(w

28 :デフォルトの名無しさん:03/03/13 23:45
デジャブ。ワロタ

29 :デフォルトの名無しさん:03/03/14 13:06
>>26
テンプレ

30 :デフォルトの名無しさん:03/03/14 16:26
>>29
そうか。
じゃあ、次のスレを立てる人にはもっときっちりやって貰わないといかんな。

31 :デフォルトの名無しさん:03/03/14 17:33
AA 用意してる間に前スレ 1000 取られちまった

          | | ガガガガガガガッ         人  
           | |               人  <  >__Λ∩
           | |            人  <  >__Λ∩Д´)/
  ( ・∀・)   | |       人  <  >__Λ∩Д´)/   / ←http://pc2.2ch.net/test/read.cgi/tech/1045746245/993
 と    )    | |    人  <  >__Λ∩Д´)/   / ←http://pc2.2ch.net/test/read.cgi/tech/1045746245/994
   Y /ノ    .人   <  >__Λ∩Д´)/   / ←>>http://pc2.2ch.net/test/read.cgi/tech/1045746245/995
    / ) .人 <  >__Λ ∩Д´)/   / ←>>http://pc2.2ch.net/test/read.cgi/tech/1045746245/996
  _/し' <  >_Λ∩Д´)/   / ←>>http://pc2.2ch.net/test/read.cgi/tech/1045746245/997
 (_フ彡 V`Д´)/   / ←>>http://pc2.2ch.net/test/read.cgi/tech/1045746245/998
            / ←>>http://pc2.2ch.net/test/read.cgi/tech/1045746245/999

32 :デフォルトの名無しさん:03/03/14 18:47
class foo {
int _id;
public:
foo(int id) : _id(id) { }
foo(foo& f) : _id(f._id) { }
foo& operator=(foo& f) { _id = f._id; return *this;}
virtual ~foo() {}
};
int main(int,char**){
foo bar(0);
bar = foo(1);
return 0;
}
以上のコードを gcc 3.2でコンパイルしたら
no match for `foo& = foo' operator
candidates are: foo& foo::operator=(foo&)
っていわれるんだけど、俺間違ってないよね?

33 :デフォルトの名無しさん:03/03/14 19:27
>>32
まちがってる

foo(const foo& f) : _id(f._id) { }
foo& operator=(const foo& f) { _id = f._id; return *this;}

コピーコンストラクタや代入演算子はconstの参照だ
一時オブジェクトは非const参照できない

34 :デフォルトの名無しさん:03/03/14 22:01
BCC とかなら gcc ほどそのへんの制限きつくないから通るだろうけどね。

>>33 より厳密に言うなら一時オブジェクトというより
右辺値の非 const 参照できないってこと。

35 :デフォルトの名無しさん:03/03/14 23:26
class Unko[
int x,y,z,a,b,c;
};
void *p:
p=new Unko();
delete p;

これはメモリリークしますか?

36 :デフォルトの名無しさん:03/03/14 23:32
>>35
メモリリーク以前に、コンパイルが通りません。

37 :デフォルトの名無しさん:03/03/15 01:13
void *p:をdeleteした場合って、デストラクタ呼ばれたっけ?

38 :デフォルトの名無しさん:03/03/15 01:15
呼ばれにゃい。

39 :デフォルトの名無しさん:03/03/15 02:28
んなもん15秒あれば試せるだろ・・・

40 :デフォルトの名無しさん:03/03/15 02:52
15秒でエディタ起動・ファイルの作成・コンパイル・起動までできるの?

41 :デフォルトの名無しさん:03/03/15 02:56
>>37
pがどんな型情報を持っているのかと小一時間。

42 :デフォルトの名無しさん:03/03/15 03:06
>>40
俺のPCにはVisual Studioと検証用の使い捨てプロジェクトが常に立ち上がっているわけだが。

43 :デフォルトの名無しさん:03/03/15 03:56
>>35
ウンコが処理されないようなコード書くなよ。

44 :デフォルトの名無しさん:03/03/15 04:21
>>35
実は渡されたモノはうんこだという事実を知る由も無く
処理を要求されるoperator deleteが不憫だ。

45 :デフォルトの名無しさん:03/03/15 11:12
こんにちわ。質問があります。
1つの関数で2つ以上のオブジェクトをnewして返したいんですが、
void func( ObjectA* a, ObjectB* b )
{
  a = new ObjectA;
  b = new ObjectB;
}
とやってもできないんです。引数じゃなくて、返値でやればできるんですが、
そうすると1つしかnewできません。
何がいけないのか教えてください。

46 :デフォルトの名無しさん:03/03/15 11:26
端的に言えばポインタ引数はあくまで値渡しだから。

47 :デフォルトの名無しさん:03/03/15 11:29
>>44 わろた

48 :デフォルトの名無しさん:03/03/15 11:32
>>45
void func( ObjectA* &a, ObjectB* &b )
{
  a = new ObjectA;
  b = new ObjectB;
}

49 :デフォルトの名無しさん:03/03/15 11:35
>>45
void func(ObjectA*& a, ObjectB*& b )
{
  a = new ObjectA;
  b = new ObjectB;
}

50 :デフォルトの名無しさん:03/03/15 11:35
ケコーン

51 :デフォルトの名無しさん:03/03/15 11:38
まぁ、std::pair<>とか構造体とか使えば何個でも返り値でいけるわけだが。

52 :デフォルトの名無しさん:03/03/15 13:03
>>51
美しくない実装だ。

53 :デフォルトの名無しさん:03/03/15 13:47
>>52
複雑なパラメータの受け渡しにはclassやstructを使うのが定石だろ。
pairは見たことない。

54 :デフォルトの名無しさん:03/03/15 14:16
tupleだな

55 :デフォルトの名無しさん:03/03/15 15:44
pair は class とは別のものであるらしい

56 :デフォルトの名無しさん:03/03/15 23:07
パラメータの受け渡しにパラメータブロック構造体を使うのは可か不可か。考えて見よう。

57 :デフォルトの名無しさん:03/03/15 23:48
可・不可ってあたりが学生臭いなあ
それぞれの長所、短所、どっちにしろ同じこと、ぐらいにしようよ

58 :デフォルトの名無しさん:03/03/16 00:17
学生ってのは誉め言葉でうか

59 :デフォルトの名無しさん:03/03/16 00:37
宿題なら自分でやれって意味だと思うし

60 :デフォルトの名無しさん:03/03/16 17:23
C++でテキストファイルを読み込む場合、ifstreamが使えますが、
Cのfreadでまとめて読み込む方がずっと速いと聞いたことがあります。
実際、単純に考えるとそうなりそうですが、ifstreamを使って、
ファイルの読み込みを高速化する方法はないのでしょうか。

前に2チャンネルのどこかのスレで見た気もするのですが、
今どこにあるかわからなくなってしまいました。
お願いします。

61 :デフォルトの名無しさん:03/03/16 17:26
>実際、単純に考えるとそうなりそうですが、

まずは実際にどのくらい遅くなるのか計ってから書きこもうな

62 :デフォルトの名無しさん:03/03/16 17:34
>>60
よくわからんが、ifstreamのバッファを大きくするとか?

63 :デフォルトの名無しさん:03/03/16 17:46
>>60
>Cのfreadでまとめて読み込む方がずっと速いと聞いたことがあります。

取り合えず本当に早くなるのか結果を見せて下さい。


64 :デフォルトの名無しさん:03/03/16 19:29
60じゃないが

ifstream - 1052[ms]
cstdio - 991[ms]

std::ifstream fs;
for(int i= 0; i< 1000; i++) {
fs.open("test.txt", std::ios::in);
fs.read(ch1, 290);
fs.close();
}

FILE* f;
for(int j= 0; j< 1000; j++) {
f = fopen("test.txt","r");
fread(ch2, sizeof(char), 290, f);
fclose(f);
}

65 :デフォルトの名無しさん:03/03/16 19:32
ioのコストが高いから
あまり変わらないのかもね

66 :デフォルトの名無しさん:03/03/16 20:09
おれはC++でも_open _read _write _closeしかつかわない
つーかそれが普通だとおもってたんだが違うのかな?

67 :デフォルトの名無しさん:03/03/16 20:15
おれはC++だとfstreamしか使わない
おれはそれが普通だと思ってた

68 :デフォルトの名無しさん:03/03/16 20:18
おれはC++ではCreateFileしか使わない
おれは普通だと想ってる

69 :デフォルトの名無しさん:03/03/16 20:22
ひとそれぞれだね!!


70 :名無しさん:03/03/16 21:38
おれはC++でもぬるぽを使っている
おれは普通だと思ってる

71 :デフォルトの名無しさん:03/03/16 21:46
 ユダンモスキモ・・・
  ( ・∀・)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >__Λ∩
  _/し' //. V`Д´)/  
 (_フ彡        /  ←>>70

72 :デフォルトの名無しさん:03/03/16 22:27
だまってこれ使え
class FilePtr
{
public:
explicit FilePtr(const char* text,const char *wr){ pfile = std::fopen(text,wr) ; if(!pfile) throw int( 0 ); }
~ FilePtr() { if(pfile) std::fclose(pfile); }
operator std::FILE* () { return pfile ; }
private:
std::FILE* pfile;
};
int main(){
try{
FilePtr fptr("test.txt","r");
}
catch(int){
std::puts( "Non File" );
}

return 0;
}


73 :デフォルトの名無しさん:03/03/16 22:36
>>72
だまってこういうコード書いてもいいですか。
int main() {
 FilePtr fptr("test.txt","r");
 FilePtr fptr2 = fptr;
}

74 :デフォルトの名無しさん:03/03/16 23:19
便乗質問ですけど、
>>64
Cのfreadだと何バイト読み込んだかわかるけど、
C++のreadだと、何バイト読んだかわからないですよね。
それとも、方法があるのでしょうか?


75 :デフォルトの名無しさん:03/03/16 23:20
gcountがあるJARO

76 :74:03/03/16 23:28
>>75
う。ありがとうございます。
gcount...。getにしか使えないのかと思ってました。

77 :デフォルトの名無しさん:03/03/16 23:47
読んだ後にlengthした方がええよ

78 :デフォルトの名無しさん:03/03/16 23:48
>>73
そんなもんだめ
コピー、代入は自分で考えて下さい。
おれはprivateに放り込みますけどね

79 :デフォルトの名無しさん:03/03/17 00:04
if (FILE* fp = fopen(...)) {
}

上のように書いたらVC6.0でコンパイル通っちゃったのですが、
C++的にはこれはアリなのでしょうか?
今まで一度もこういう記述を見たことが無いので・・・


80 :デフォルトの名無しさん:03/03/17 00:06
>>79
ありあり大辞典

81 :デフォルトの名無しさん:03/03/17 00:07
>>79
あり。寿命は if のスコープ。

82 :デフォルトの名無しさん:03/03/17 00:07
>>78
privateに放り込むよりメンバをconstにするほうがいいぞ。

class FilePtr
{
public:
explicit FilePtr(const char* text,const char *wr) : pfile( std::fopen(text,wr) ) { if(!pfile) throw int( 0 ); }
~FilePtr() { std::fclose(pfile); }
operator std::FILE* () const { return pfile ; }
private:
std::FILE* const pfile;
};


83 :デフォルトの名無しさん:03/03/17 00:13
>>82
readとかwriteのメンバ関数はないの?

84 :デフォルトの名無しさん:03/03/17 00:14
>>82
え? コピーコンストラクタがとおるのでは?

85 :デフォルトの名無しさん:03/03/17 00:19
<<をオーバーロードしたいのですが、
組込型が引数な場合はどうすれば良いのでしょうか。
こんな風では当然あいまいだと言われてしまって…。

#include <fstream>

std::ostream &operator <<( std::ostream &s, int d )
{
 ++d;
 return s << d;
}

int main(){
 std::ofstream f;
 f.open("hage.txt");

 f << 777;

 f.close();
 return 0;
}


86 :82:03/03/17 00:25
>>84
あーそうだねぇ。やっぱりめんどくせぇなー。

87 :デフォルトの名無しさん:03/03/17 00:30
>>84
class noncopyable
{
noncopyable(const noncopyable &);
void operator =(const noncopyable &);
protected:
nocopyable(){}
};
を用意し
class FilePtr : noncopyable
{ /*...*/ };
とすればいい

ちなみにboostに同名のクラスがある

88 :デフォルトの名無しさん:03/03/17 00:31
× >>84
>>86

89 :82:03/03/17 00:42
>>87
class noncopyableの定義も、boost/noncopyable.hppのインクルードも
同じくらいにめんどくさいと思ったのデスヨ。
「その場で」「直接」な手段と思ったのですがねぇ。無念。

90 :デフォルトの名無しさん:03/03/17 01:28
>>85
無理
普通に関数でも作って


91 :デフォルトの名無しさん:03/03/17 01:36
>>90
ありがとうございます。
しょうがないのでostreamをオーバーライドすることにします。

92 :デフォルトの名無しさん:03/03/17 01:45
>>91
何を言っているのですか? 意味が…

93 :デフォルトの名無しさん:03/03/17 01:48
>>85
組み込み型をラップするクラスを作り、それについてオーバーロードすればよい

94 :デフォルトの名無しさん:03/03/17 01:50
>>85
なんで
std::ostream &operator <<( std::ostream &s, int d )
{
++d;
return s << d;
}
こんなことがしたいんだ?
s<< 777 + 1;
でいいじゃん


95 :デフォルトの名無しさん:03/03/17 02:08
>>91
あ、90さんのおかげで無理だと分かったので、
ostreamのオペレータ<<をオーバーライドしたようなの作るしかないかなと。

ここの一番下を参考にしているのですが、
継承元の<<呼び出しがどうも上手く行きません…。
ttp://www.microsoft.com/japan/developer/library/vclang/_iostream_ostream.htm

>>93
ありがとうございます。そういう手もあるんですね。
<<を全書き換えするのと、どっちが楽だろう…選択肢が増えて助かります。

>>94
例えなので…。

96 :デフォルトの名無しさん:03/03/17 02:14
operator<<をオーバーロードして何がしたいのか教えてください

97 :デフォルトの名無しさん:03/03/17 02:19
後でソース読み直したときに混乱しそうだ。

98 :デフォルトの名無しさん:03/03/17 02:26
>>96
いやはや、長引いちゃってすいません。

目的は2つありまして…。まず、いま既に<<を膨大に使って
txt出力しているソースがあるのですが、これを全て
別の注釈付きな書式で書き出す必要がありまして…。

1度出来れば良い&手書きで直していると、
ミスも出そうなので、一気に根本を乗っ取れたらなと。

もう1つはまだ、与しやすいのですが、
doubleやfloat型の「0.0」という数字を、<<にて小数点が付いたままtxt出力したいなと。
(普通にやると「0」になってしまうので)

99 :デフォルトの名無しさん:03/03/17 02:29
C++で文字列(const char*)の比較する場合、stringに代入しないなら
char_traits::lengthで両方の長さ調べて短いほうでchar_traits::compareして・・・
っするしかないの?

100 :デフォルトの名無しさん:03/03/17 02:41
>>98
class wrapstream
{
ostream *os;
public:
wrapstream(ostream &p):os(&p){}

template <class T>
wrapstream &operator<<(const T &a)
{ (*os)<<"--- "; (*os)<<a; (*os)<<endl; return *this; }
};

cout<<fixed;
wrapstream ws(cout);
ws<<10.0<<20.0;

これでどうでしょうか?
小数点がついたまま出力したりするのはios_baseで設定することができるのでそれを参照してください

101 :デフォルトの名無しさん:03/03/17 02:42
>>99
strcmp

102 :デフォルトの名無しさん:03/03/17 02:50
>>100
す、素晴らしいコンポジションであります_| ̄|○

もはや、手作業による長く地味な書き換えしか無いと思ってたのが、
出力先を置換するだけで、一瞬にして作業が終わってしまいました。

いやはや、いくら感謝してもし足りません。ありがとうございました。

103 :デフォルトの名無しさん:03/03/17 04:41
>>100
ウヒョ! いい男・・・

104 :デフォルトの名無しさん:03/03/17 09:43
うほっ!うまそーな魚!いただきマンモース!!!!!!!

105 :デフォルトの名無しさん:03/03/17 10:43
ごちそうサマンサ。

106 :デフォルトの名無しさん:03/03/17 11:25
>>77どういう意味?
tellg?

107 :デフォルトの名無しさん:03/03/17 11:46
char_traits::length()は内部でstrlen()を呼び出してるだけじゃん。

108 :デフォルトの名無しさん:03/03/17 18:49
のーのーのーチッチッチッ


109 :デフォルトの名無しさん:03/03/17 19:33
構造体をクラス宣言の中で宣言したときと、
外で宣言したときの違いを教えてください。

中で宣言すると、メンバ関数の戻り値に
宣言した構造体を用いることができないようなのですが、
それ以外に違いや制限はあるでしょうか?

// ↓中で構造体を宣言
class c {
 struct s {
  // 〜
 };
 // 〜
};

// ↓外で構造体を宣言
struct s {
 // 〜
};

class c {
 // 〜
};

110 :デフォルトの名無しさん:03/03/17 19:42
>>109
返せるよ。
class A {
struct B {
int i;
} b;
public:
B func() {
return b;
}
};

111 :デフォルトの名無しさん:03/03/17 19:47
BがprivateでAがfriendを持たないと怒られるかも

112 :109:03/03/17 21:56
>>110
ありがとうございます。
インライン関数にするとエラーがなくなりました。
インライン限定なんですね。

クラス内部情報の管理に使う構造体なので
宣言を外部に見せたくなかったのですが、
インライン関数ばかりにするわけにもいかないので、
もう宣言を外に見せるようにするしかないですかね。

113 :デフォルトの名無しさん:03/03/17 22:11
>>112
悪いけど...

> インライン関数にするとエラーがなくなりました。

と言うことから...

> インライン限定なんですね。

と結果を出す奴は、プログラマには向いてないと思う。

class A {
 struct B {
  int i;
 } b;
public:
 B func();
};

A::B A::func()
{
 return b;
}

114 :デフォルトの名無しさん:03/03/17 22:42
>>112
ぶっちゃけ処理系は何よ?

115 :デフォルトの名無しさん:03/03/17 23:05
>>113
>と結果を出す奴は、プログラマには向いてないと思う。

>>114 もな。

116 :デフォルトの名無しさん:03/03/17 23:18
111 が答えだと思うんだが・・・。
構造体を見せたくないなら、構造体へのポインタをメンバにすればよかれ。

117 :デフォルトの名無しさん:03/03/17 23:54
class A {
struct B {
int i;
B(int j) : i(j) {}
} b;
public:
A(int i) : b(i) {}
B func() {
return b;
}
};

int main()
{
A a(123);

std::cout << a.func().i << std::endl;
}

118 :デフォルトの名無しさん:03/03/18 00:01
>>113
その方法でうまくいきました。
自クラスで宣言した構造体なので、スコープ演算子を
使わなければいけないとは思いつきませんでした。

>>114
VC++6.0を使ってます。

>>116
class A {
 struct B {
  friend class A;
  // 〜
 };
 // 〜
};

とやってみたのですがエラーでした。
>>111はこういう意味ではない?)

119 :デフォルトの名無しさん:03/03/18 00:22
>>118
BはAのスコープ内にあるから、言ってみれば A::B だからfriend class
宣言なんて不要だよ。

120 :デフォルトの名無しさん:03/03/18 04:03
(本当の)配列をnewで確保するのはどう書けばいいの?
int (*p)[10];
として、
p = new (int [10]);
なら、 new int[10]と解釈されるみたい。
無理矢理、new[]を使って、
p = new [1][10];
なら出来るけど・・・

121 :111:03/03/18 04:08
スコープ演算子を使ってないとは思わなかった・・・

122 :デフォルトの名無しさん:03/03/18 04:11
>>120
(゚Д゚)ハァ?
new int[10] の何が不満なんだ?

123 :デフォルトの名無しさん:03/03/18 04:17
>>120
p = reinterpret_cast<int (*)[10]>(new int[10]);

124 :デフォルトの名無しさん:03/03/18 04:32
>>120
その悲しみはよく分かるが配列型を基本型と同じには扱えないのが
C/C++の悪しき特長だ

125 :124:03/03/18 04:38
一応書いとくと以下のことね

typedef int array[10];
main(){
int *ip=new int;// OK!!
array *ap=new array;// Error!!
}


126 :120:03/03/18 04:59
レス thanks.
規格読んでたんだけど、よく分からなかった・・・

>>122
いや、ただの疑問。
>>123
これだと、delete時にもキャストしなければならない罠。
>>124-125
なるほど、つーことは配列へのポインタは必ずnew[]を
使わなければならないってことか・・

127 :デフォルトの名無しさん:03/03/18 09:35
Write a program in which you hard code a table that contain the state names
state post office abbreviations, and the population's size(you should find these data on-line
,or in some reference book). the program should prompt the user to enter
a state name. let the program do a sequential search to find the corresponding state postalcode
and population size. the program should display these data.

128 :bloom:03/03/18 09:52
http://www.agemasukudasai.com/bloom/

129 :デフォルトの名無しさん:03/03/18 11:19
ファイルの削除の仕方を教えてください。

130 :デフォルトの名無しさん:03/03/18 11:24
気合

131 :デフォルトの名無しさん:03/03/18 11:24
del *.*

132 :デフォルトの名無しさん:03/03/18 11:58
std::remove()

133 :デフォルトの名無しさん:03/03/18 11:59
typedef struct tagVMRGUID
{
GUID *pGUID;
GUID GUID;
} VMRGUID;

g++でコンパイルするとGUID GUID でエラーになるんですが
何か間違っているんでしょうか?

134 :133:03/03/18 12:01
あ。GUIDの定義はコレなんですが…

typedef struct _GUID {
unsigned long Data1;
unsigned short Data2;
unsigned short Data3;
unsigned char Data4[8];
} GUID, *REFGUID, *LPGUID;

135 :デフォルトの名無しさん:03/03/18 12:05
エラーメッセージを省くな馬鹿野郎

136 :デフォルトの名無しさん:03/03/18 12:08
>>133
GUID は構造体の名前なんだから
変数の名前として宣言しちゃだめ。。。

137 :133:03/03/18 12:13
>>135 失礼しましたエラーはこう出てます。
strmif.h:27642: declaration of `GUID tagVMRGUID::GUID'
winnt.h:1167: changes meaning of `GUID' from `typedef struct _GUID GUID'

>>136
レスありがとうございます。
そうなんですか。これはMicrosoft製のヘッダなんですけど・・
回避できないものでしょうか…。

138 :デフォルトの名無しさん:03/03/18 12:23
>>136
ハァ?適当なこといってんじゃねーよ。
struct S
{
};
struct X
{
 struct S S;
};

>>133
ということで、struct GUID;として定義されてれば、
structを付ければ曖昧さが無くなるんだが、
typedefだとどうしていいのかわからん。
回避ってんなら、

typedef struct tagVMRGUID
{
GUID *pGUID;
struct _GUID GUID;// 適当なコメント
} VMRGUID;

これくらいか?

139 :133:03/03/18 12:37
>>138
ありがとうございます。修正してみたのですが
同じエラーになってしまいました。

138 のコードをコンパイルしてみると同じエラーになるようです…。
名前を変更したら通ることは通るんですが…。

struct S {
 int a;
};
struct P {
 S S; // エラー
};
int main( void) {
P p;
p.S.a = 1;

140 :133=139:03/03/18 12:42
>>138
大変失礼しました。
Struct S S で通りました。

struct _GUID GUID; が通らない…。

141 :デフォルトの名無しさん:03/03/18 14:49
>>133
うそ?????????????????????
typedef struct A{ const static int n = 5;}C ;
struct B
{
::C C;
struct A A;
};

142 :133=139:03/03/18 17:45
>>141
何度もレスをいただき、誠にありがとうございます。
141さんのコードのようにグローバルスコープに合わせると
コンパイル通りましたー。
GUID GUID の部分ばかり修正していて *pGUID; の修正を
忘れていました。ここもエラーになっていたようで…。
うつけものです。すみません。。基本知識が不足しているので
規格書を読み直してみます。

今回は皆様にご助言をいただきとても助かりました。
ありがとうございます。

↓修正結果はこうなりました。
typedef struct tagVMRGUID {
::GUID *pGUID;
::GUID GUID;
} VMRGUID;

143 :デフォルトの名無しさん:03/03/18 17:52
http://www.kuzbass.ru/docs/isocpp/lib-support.html

144 :デフォルトの名無しさん:03/03/18 18:00
おい!てめーらくそか!?

俺の仕様書にわざとコーヒこぼしただろ!!

ココならいえる。

145 :デフォルトの名無しさん:03/03/18 18:25
>>144
板違いです。

146 :デフォルトの名無しさん:03/03/18 18:26
何か、ime.nu の広告がむちゃくちゃ増えてないか?

147 :デフォルトの名無しさん:03/03/18 18:56
ホンとだw

148 :デフォルトの名無しさん:03/03/19 17:49
CからC++へのスムーズな移行にはどんな本が必要。
Cがそれなりに分かっているなら「憂鬱な〜」がイイって聞いたのですが。
それともチャンと「Effective〜」のような教本読まないとイクナイ?

149 :デフォルトの名無しさん:03/03/19 19:24
>>148
Effective〜のような本はどっちにしろ読むべし

150 :デフォルトの名無しさん:03/03/19 20:04
>>149
ありがとうございます。
Effective読んだ後に憂鬱摘み食いしながら
MoreEffective読むことにしてみます。

151 :デフォルトの名無しさん:03/03/19 21:40
struct vector3_t
{
vector3_t(float x, float y, float z) : x(x), y(y), z(z) {}
vector3_t(const vector3_t &v) : x(v.x), y(v.y), z(v.z) {}
vector3_t() : x(0.0f), y(0.0f), z(0.0f) {}
.
.
.
union
{
struct
{
float x;
float y;
float z;
};
float v[3];
};
};

ベクトルを表す構造体&共用体なんですが、いまいちやってる事の意味が分かりません。
共用体によって扱いを楽にしてるのはなんとなく分かるんですが、上の3行って一体・・

152 :デフォルトの名無しさん:03/03/19 21:43
マルチですか 若いっていいですね

153 :デフォルトの名無しさん:03/03/19 21:44
>>152
スレ違いだから来ただけだろ。失せろボケ

154 :デフォルトの名無しさん:03/03/19 21:49
まあいいや、可哀想なのでマジレス。

union
{
struct
{
float x;
float y;
float z;
};
float v[3];
};

とりあえず、死ね。
処理系依存互換性皆無

155 :デフォルトの名無しさん:03/03/19 21:51
>>154
あの、151の通りであってるんですが。共用体が構造体に入ってるんです。
もう少し勉強してくらさい。

156 :デフォルトの名無しさん:03/03/19 21:52
>>154 アホ

157 :デフォルトの名無しさん:03/03/19 21:54
>>151
コンストラクタの初期設定子

ようは、構築時にメンバの初期設定してるだけ。

vector3_t v(1.0, 2.0, 3.0);
とされると、v.x = 1.0; v.y = 2.0; v.z = 3.0; となる。
vector3_t v1(v);
とされると、v1.x = 1.0; v1.y = 2.0; v1.z = 3.0; となる。
vector3_t v2();
とされると、v2.x = 0.0; v2.y = 0.0; v2.z = 0.0; となる。

俺も、極めてわかりにくい構文だと思う。

後、無名共用体、無名構造体は >>154 の言う通り処理系に依存する。

158 :デフォルトの名無しさん:03/03/19 21:55
>>151-155
おまえら見当違いもいいとこだな

159 :デフォルトの名無しさん:03/03/19 21:55
初期化子の事を聞きたいのかね

160 :デフォルトの名無しさん:03/03/19 21:57
>>157
CEOのAndre LaMothe氏がOpenGLのパーティクルシステム用に書いたコードの一部なんですが、
この人のコードはとってもワイルドな感じです。

161 :デフォルトの名無しさん:03/03/19 21:58
んで、こういう書き方をするメリットって?

162 :デフォルトの名無しさん:03/03/19 21:58
構造体と配列のメモリレイアウトの互換性も規定されてない

163 :デフォルトの名無しさん:03/03/19 22:05
メリットというか定数メンバやリファレンスメンバの初期化では
必然的にその構文に頼らざるを得ないな。

164 :デフォルトの名無しさん:03/03/19 22:57
エラーコードを取得するメソッドがついてる
クラスがあるとして、やっぱりメンバメソッドの頭で
エラーコードのメンバ変数を初期化する
処理を入れてあげるのって普通?
もっと格好いいやり方ですかね?
ようするに、エラーコードを持ったクラスの設計で
もっといいやり方ないでつかね?

165 :デフォルトの名無しさん:03/03/19 23:05
エラークラスを投げる

166 :デフォルトの名無しさん:03/03/19 23:12
あんまし、簡単に済まさないでさ、
もうちょっと知恵をわけてくれたっていいじゃんよ。
例外じゃないよな?って思うときだってあるじゃん。
エラーと例外って意味違うジャン。

167 :デフォルトの名無しさん:03/03/19 23:21
>>166
ここに質問したら、おまいが抱えてる問題を手取り足取り
解決してくれると思ってますか?
しかも質問内容に見合う回答内容もらってると思うが。

掲示板てのは基本的に情報収集&交換の場、
ヒントを得られれば上等と思ってくれたまい。
それが質問スレであっても、だ。
ヒントがあって考える、それすら出来ないヤツは(略

168 :デフォルトの名無しさん:03/03/19 23:24
>>166
情報少なすぎ。あの情報量では、>>165 が妥当。

169 :デフォルトの名無しさん:03/03/19 23:28
あ〜そうかよ。どうせわかんねーんだろ(プ
お前らの知識を試してみたんだが、この程度だったか。

170 :デフォルトの名無しさん:03/03/19 23:33
文盲あるいはチョソは発言禁止

171 :デフォルトの名無しさん:03/03/19 23:33
>>169
そう、お前に対してはこの程度が妥当。

172 :デフォルトの名無しさん:03/03/19 23:34
てゆーかさ、それを考えるのがクラス設計だと思うわけで、
そのクラスの性質とかいろいろな状況考えないと一概に言えないと思うのよ。
んで、一般論を言えば165じゃねーのってことじゃん?春厨君。

173 :デフォルトの名無しさん:03/03/19 23:38
エラークラスを投げるのが嫌ならグローバル変数にでもセットしてろすっとこどっこい

174 :デフォルトの名無しさん:03/03/19 23:41
□□□□■□□□□□■□□□□□□□□□□□□□□□□□□□□□
□□□■■□□□□□■□□□□□□□■■■■■■■■■■■■□□
□□■■□□□□□■■■■■■□□□□□□□□□□□□□■■□□
□■■□□■□□□■□□□□■□□□□□□□□□□□□■■□□□
□□■□■■□□■■■□□■■□□□□□□□□□□□■■□□□□
□□□■■□□■■□■■■■□□□□□□□□□□□■■□□□□□
□□■■□□□□□□□■■□□□□□□□□□□□■■□□□□□□
□□■□□□■□□□■■■■□□□□□□□□□□■□□□□□□□
□■■■■■■□□■■□□■■□□□□□□□□□■□□□□□□□
□□□□■□□□■■□□□□■■□□□□□□□□■□□□□□□□
□□■□■□■□□□□■■□□□□□□□□□□□■□□□□□□□
□□■□■□■□□□□□■■□□□□□□□□□□■□□□□□□□
□■■□■□■□□□□□□□□□□□□□□□□□■□□□□□□□
□■□□■□□□□■■■□□□□□□□□□□□□■□□□□□□□
□□□□■□□□□□□■■■□□□□□□□□□□■□□□□□□□
□□□□■□□□□□□□□■■□□□□□□■■■■□□□□□□□

175 :デフォルトの名無しさん:03/03/19 23:42
□□□□■□□□□□■□□□□□□□□□□□□□□□□□□□□□
□□□■■□□□□□■□□□□□□□■■■■■■■■■■■■□□
□□■■□□□□□■■■■■■□□□□□□□□□□□□□■■□□
□■■□□■□□□■□□□□■□□□□□□□□□□□□■■□□□
□□■□■■□□■■■□□■■□□□□□□□□□□□■■□□□□
□□□■■□□■■□■■■■□□□□□□□□□□□■■□□□□□
□□■■□□□□□□□■■□□□□□□□□□□□■■□□□□□□
□□■□□□■□□□■■■■□□□□□□□□□□■□□□□□□□
□■■■■■■□□■■□□■■□□□□□□□□□■□□□□□□□
□□□□■□□□■■□□□□■■□□□□□□□□■□□□□□□□
□□■□■□■□□□□■■□□□□□□□□□□□■□□□□□□□
□□■□■□■□□□□□■■□□□□□□□□□□■□□□□□□□
□■■□■□■□□□□□□□□□□□□□□□□□■□□□□□□□
□■□□■□□□□■■■□□□□□□□□□□□□■□□□□□□□
□□□□■□□□□□□■■■□□□□□□□□□□■□□□□□□□
□□□□■□□□□□□□□■■□□□□□□■■■■□□□□□□□ 

176 :デフォルトの名無しさん:03/03/19 23:42
そか?ゴメンゴメン。

例えばこんな感じ。
class Hoge
{
private :
int m_ErrCode;
public :
Hoge() : m_ErrCode(0){}

bool Method1( void )
{
m_ErrCode = 0; //←全てのメソッドの頭でこれを入れるのが
             //なんか格好悪いような気がするんです
 ・
   ・
   ・
}
  ・
  ・
  ・
int GetErrorCode( void )
{
return m_ErrCode;
}
};

もっといいやり方とかパターンとか、ないかなと。

177 :デフォルトの名無しさん:03/03/19 23:42
すっとこどっこいもここまでくるとすっとこどっこいが
可愛そうになるほどすっとこどっこいだな。

178 :デフォルトの名無しさん:03/03/19 23:46
>>176
もういいから失せなよ。

179 :デフォルトの名無しさん:03/03/19 23:46
>>176
どうせ、各々のメソッドが成功かどうかを返すんだろ ?
だったら、失敗した時だけエラーコードをセットすれば良いと思う。
(当然、メソッド成功時は GetErrorCode() の値は保証しないことをドキュメントに書いとく。)

180 :176and166:03/03/19 23:46
169は私じゃないでつ。

181 :デフォルトの名無しさん:03/03/19 23:47
>>178
それだったら、その場で例外投げるとかエラーコード返すなりすればいいじゃん。
何もエラーコードを保存する必要はないような気がするが。

182 :181:03/03/19 23:47
ごめんごめん >>176

183 :デフォルトの名無しさん:03/03/19 23:47
俺は別に格好悪いとは思わないけど。何がいけないんだろう。

184 :デフォルトの名無しさん:03/03/19 23:48
int GetErrorCode(void){return m_ErrCode=NO_ERROR;}

185 :デフォルトの名無しさん:03/03/19 23:49
エラーコードが揮発性でいいなら、
GetErrorCode内で初期化してしまう

186 :デフォルトの名無しさん:03/03/19 23:51
>>185
そんな汚いプログラムは書くなよ。

187 :176:03/03/19 23:56
初期化とかはべつに問題じゃなくてね。
もうちょっと足してみると

bool Method1( void )
{
m_ErrCode = 0; //←全てのメソッドの頭でこれを入れるのが
             //なんか格好悪いような気がするんです
 ・
 ・
if( なんか失敗 ){
m_ErrCode = 失敗コード;
return false;
}



188 :デフォルトの名無しさん:03/03/20 00:00
iostreamの設計を見なされ

189 :デフォルトの名無しさん:03/03/20 00:01
エラーコードを返したら駄目なのですか?

190 :デフォルトの名無しさん:03/03/20 00:01
格好悪いなら取れば?
WindowsみたいにGetLastErrorとでもしておけば辻褄があうだろ

191 :デフォルトの名無しさん:03/03/20 00:04
bool Method1( void )
{
if( なんか失敗 ){
m_ErrCode = 失敗コード;
return false;
}

よし、これでどうだ

192 :176:03/03/20 00:04
>>179
なるほど。そういう手もありかな?

>>181

戻り値をboolと書いてしまったのが
まずかったですね。
boolじゃなくてたとえばstringが戻り値だったとして
失敗して空のstringが返ったとき、なぜ空だったのか
GetErrorCode()で取得みたいな場合も。

193 :176:03/03/20 00:15
>>188
あ、そっか。あったですね。
std::fstream strm( "Data.txt", std::ios::out | std::ios::in| std::ios::trunc );
if( strm.fail() == true )
fail()ってどうなってんだろ?後で見とこっと。
あれstd::ios::trunc ってどんな意味?


194 :デフォルトの名無しさん:03/03/20 00:16
>GetErrorCode()で取得
こういうのはマルチスレッドに弱かったりするからなぁ

戻り値はエラーコード専用として使い
引数でstringもらったら?


195 :デフォルトの名無しさん:03/03/20 00:18
if(strm.fail() == true)
この根底の仕方は駄目でしょ

196 :176:03/03/20 00:23
if( strm.fail() )

あ。こか。

197 :176:03/03/20 00:26
エラーコードを重要視したいがために引数返しに
するのって、悲しいコードな気もするんですね。

198 :デフォルトの名無しさん:03/03/20 00:27
だったら例外で良いじゃん

199 :デフォルトの名無しさん:03/03/20 00:28
>>197
COMは規約としてそうなっている
重要なのは一貫性だと思う

200 :Addicted to C++ ◆CPP8mJMMbA :03/03/20 00:31
class Hoge
{
private :
 int m_ErrCode;
public :
 Hoge() : m_ErrCode(0){}
 bool Method1( void ){
  //処理
  if( なんか失敗 ){
   m_ErrCode = 失敗コード;
   return false;
  }
  //処理
  return !(m_ErrCode = 0);
 }
//…
 int GetErrorCode( void )
 {
  return m_ErrCode;
 }
};

201 :176:03/03/20 00:37
>>199
COMなってるね。
見えた。一貫性だね。
一貫して全てのメソッドの頭に書いとけば
それはそれでいいね。
別のクラスでは例外投げ使ってたりとか
したらこのクラスは、やっぱよくないしね。
これも例外投げで統一するべきだしね。
catchでエラー取得って、使う側にしたら
スンゴイ使いズらい気がするんだよね…

202 :デフォルトの名無しさん:03/03/20 00:41
if(!FAILED(p->foo()))
{
if(!FAILED(p->foo()))
{
if(!FAILED(p->foo()))
{
}}}
こんなのよりマシだと思う、例外は
実際COMのエラーはVBとかJとかでは例外として送出されてた

203 :176:03/03/20 00:43
>>200
Method1の前にMethod2が失敗してたとしたら
Method1は常に失敗してしまうじゃん?
だからメソッドの頭にm_ErrCode=0が
必要だと思っちゃうわけですよ。
その頭に書いちゃうことは格好がいいか?ってこと。
話がもどっちまった。

204 :Addicted to C++ ◆CPP8mJMMbA :03/03/20 00:58
>>176(196)
ハァ? マルチスレッド? んなInternational Standardに
ないもんは知らねーYO! ちなみに
if(strm.fail())
は、格好にこだわるならむしろ
if(!strm)
の方が格好がいいかと。
std::ios_base::out | std::ios_base::truncは
ファイルを切り詰めるんじゃなかったかな。

205 :デフォルトの名無しさん:03/03/20 00:58
>>200のは m_ErrCode に 0 を代入してそれを否定してるんだから
true が返るときは必ず m_ErrCode == 0 が保証されるんじゃない?
トリッキーだけど。俺は return m_ErrCode=0, true; と書きたい。

206 :205:03/03/20 01:00
すまそ、マルチスレッドの話であったか。

207 :Addicted to C++ ◆CPP8mJMMbA :03/03/20 01:05
>>203
すまぬ、マルチスレッドなどと訳のわからぬことを書いた。
てっきりMethodをマルチスレッドで同時実行するのかと。
逝ってきます y=-( ゚д゚)・∵ ターン
とまではいかないまでも(w、

>Method1の前にMethod2が失敗してたとしたら
>Method1は常に失敗してしまうじゃん?
これはなぜに?そういうクラス仕様?そうでなければ
このコードは自動的に最新のエラーコードに更新されると
思うのだが。

208 :デフォルトの名無しさん:03/03/20 01:06
>>206
別にマルチスレッドの話ではないと思う

>>203
同じクラスのメソッドが失敗したということは
その状態のまま他のメソッドを呼んではだめでしょ


209 :206:03/03/20 01:11
あれそうなの?分からなくなってきた。そうでなければ>>200
コードはどこが問題になるのだろう。

210 :176:03/03/20 01:16
悪い。私が見間違えた。
200のコードは満たしてます。
問題ないでつ。

211 :デフォルトの名無しさん:03/03/20 01:46
なぁ・・・俺・・・いまだに参照とポインタの使い分けに悩むんだ・・・
もう・・・ポインタ一本で行っていいかな・・・?

212 :デフォルトの名無しさん:03/03/20 01:49

  い
   と
    も

213 :デフォルトの名無しさん:03/03/20 05:06
下に書いたクラスみたいなのをいくつも作るときに、
楽ができるやり方ありませんか?
class Test
{
 Test ()
 {
  if (m_instance) throw Error ();
  m_instance = this;
 }
 ~Test () { m_instance = 0; }
 static Test* m_instance;
};

214 :デフォルトの名無しさん:03/03/20 05:15
Ctl+C Ctl+V

215 :デフォルトの名無しさん:03/03/20 05:33
>>214
うちの環境ではそんなコマンドないけど・・・
C-h k C-c C-v
C-c C-v is undefined

216 :213:03/03/20 05:54
うちの環境では
C-M-a C-p C-@ C-M-e M-w で C-y

って、マジレスキボン……
templateっぽいけど、さっぱりわからんかった

217 :デフォルトの名無しさん:03/03/20 06:02
>>216
あのさ、何がしたいんだかわかんないよ。
class Test の微妙にそれぞれ違うバージョンを作りたいって事なんだろうけど、
どう微妙に違うのかわかんないと案の出しようが無いだろう。

218 :デフォルトの名無しさん:03/03/20 06:10
http://www.boost.org/libs/pool/doc/implementation/singleton.html
これか?

219 :デフォルトの名無しさん:03/03/20 06:19
仮想キーコードとスキャンコードの違いを教えてください。

…これってAPIスレの方が適切だったりしますか?

220 :219:03/03/20 06:51
ごめんなさい、スレ立てるまでもないと勘違いして誤爆しました


221 :213:03/03/20 06:53
>>217-218
>>213のTestみたいに、好きな時に作れるけど同時に一つしか存在できない
クラスを、いくつか作りたいんです。なのでboostのはちょっと。

今は、すべてのクラスでTestみたいなのを個別に書いてるんですが、
もうちょいなんとかならんのかなと思いました。
Testには書けてませんが、デフォルトコンストラクタ以外のも使いたいです。

>>219
そうみたい。

222 :デフォルトの名無しさん:03/03/20 07:44
template <class SubClass> class singleton
{
static SubClass *inst_;
public:
singleton()
{
if (inst_) throw Error();
inst_=static_cast<SubClass *>(this);
}
~singleton()
{ inst_=0; }
static SubClass &instance()
{ return *inst_; }
};
template <class SubClass>
SubClass *singleton<SubClass>::inst_=0;

//使い方
class Test : public singleton<Test>{};

223 :213:03/03/20 08:12
>>222
動きました。ありがとうございます。

224 :デフォルトの名無しさん:03/03/20 16:54
ソケットのクラスで何がよく使われてますか?
それとも自作が基本ですか?

225 :デフォルトの名無しさん:03/03/20 18:19
>>224
よくわからんが、ACE とかはどうだろう?

226 :デフォルトの名無しさん:03/03/20 21:22
>>224
.NET風の薄いラッパを自作して使ってる。

227 :デフォルトの名無しさん:03/03/20 22:09
linuxのデバイスドライバを作るのにC++を使いたいのですがどうにもうまくいきません
どこか良い開設サイトをご存知ありませんか?



228 :デフォルトの名無しさん:03/03/20 22:20
std::copyやstd::swapを、自分で定義した型でオーバーロード
する時、オーバーロード関数はstdに入れちゃう?Koenig lookup
させる?そもそもオーバーロードなんてしない?

229 :デフォルトの名無しさん:03/03/20 22:23
>>194
>> GetErrorCode()で取得
> こういうのはマルチスレッドに弱かったりするからなぁ

煽り ? 単なる無知 ?
エラーコードがスレッド毎に保存されることぐらい常識だと思うが...。

230 :デフォルトの名無しさん:03/03/20 22:23
>>228
std に入れるのは規格違反。

231 :デフォルトの名無しさん:03/03/20 22:32
>>229
煽り? 周囲の文を読んでいるか?
クラスのメンバ変数だぞ?スレッド毎に保護されるわけ無いだろ…。


232 :228:03/03/20 22:53
>>230
でも、Koenigでやるのも地獄だし、誰かがstd::を付けたら
結局ダメだし。

233 :名無しさん:03/03/20 23:02
ぬるぬるだな。

234 :デフォルトの名無しさん:03/03/20 23:05
だな

235 :デフォルトの名無しさん:03/03/20 23:08
企画違反でも入れちゃうのだっ

236 :デフォルトの名無しさん:03/03/20 23:10
 イヤ〜ン
             ノ∩
           ⊂   ヽ ←>>233
            /( 。Д。 )っ
            U ∨ ∨
         ・@;∴‥
   ∧_∧ ∩  :: :.
  ( ・∀・)/  :: ::
  (つ   /  :: :'
  人⌒l ノ  :: :: ガッ
  し(_)

237 :デフォルトの名無しさん:03/03/20 23:10
http://sourceforge.net/projects/opencxx/
これ、良いんじゃね?

238 :名無しさん@Emacs:03/03/20 23:28
>>237
それ何?説明読んだけどイマイチ分からんかった。
C++の文法を拡張した物のC++へのトランスレーターって事?

239 :デフォルトの名無しさん:03/03/20 23:29
ある関数 f があるとき、この関数を使って出来ることは

・fを呼び出す
・fのアドレスを取る

の2つだけである、ってのは正しいかな?

240 :228:03/03/20 23:29
stdに入れるのがイレギュラーなのは確かだけど、だからといって
namespace myns {
  class Class1 { ... };
  swap(Class1 &x, Class1 &y) throw();
  ...

  namespace junk {
    using std::swap;
  }
  template <class Iter> void foo(Iter s, Iter e) {
    using namespace junk;
    Iter i1, i2;
    ...
    swap(*i1, *i2);
  }
}
なんて絶対やりたくないんだけど。
やっぱりオーバーロードしようとするのが間違い?

241 :230:03/03/20 23:36
>>240
俺は常に.cppの頭でusing namespace std;する人なので
それは考えたことがなかった。。。けど、そんな複雑にせんでも

template <class Iter> void foo(Iter s, Iter e) {
 using std::swap;
 Iter i1, i2;
 ...
 swap(*i1, *i2);
}

だと何か問題あるのか?

242 :デフォルトの名無しさん:03/03/20 23:37
>>231
すまん書き間違えた...

×: エラーコードがスレッド毎に保存されることぐらい常識だと思うが...。
○: (マルチスレッドを考慮に入れるなら) エラーコードをスレッド毎に保存することぐらい常識だと思うが...。

まさかやり方知らないとか ?

243 :デフォルトの名無しさん:03/03/20 23:41
>>238
リフレクションが使えるC++

244 :デフォルトの名無しさん:03/03/20 23:42
> エラーコードをスレッド毎に保存することぐらい

gccだとどうやるの?

245 :デフォルトの名無しさん:03/03/20 23:42
threadハンドルをキーにmapする。

246 :228:03/03/20 23:44
>>241
それだとmyns::swap()が見えない。
ちなみに単にswap()だけ、あるいはusing namespace stdだと、
*i1,*i2がprimitive型の時にstd::swap()が見えなくなる。

247 :デフォルトの名無しさん:03/03/20 23:53
>>242 >>245
だからメンバ変数だっていってんだろ!!
オブジェクト一つずつにそんなことする気か?

>threadハンドルをキーにmapする。
これじゃ足りねーよ

248 :デフォルトの名無しさん:03/03/20 23:55
>>244
スレッドは C++ の標準じゃねーから、単に gcc と書かれても困る。

249 :デフォルトの名無しさん:03/03/20 23:58
てかスレッドごとにインスタンス作れよ

250 :デフォルトの名無しさん:03/03/21 00:05
あるクラスのstaticなメンバ関数で共通に使いたいmutexを初期化したいのです。
Javaだったらスタティックイニシャライザでクラスに属するリソースの初期化処理をやりますよね。
でも、C++では言語としてそのような機能はないみたい(あるのかも知れないが、私は知らない)。
そこで、以下のようにグローバル変数で初期化しているのですけど、

namespace _hoge {
pthread_mutex_t mutex;
class Initializer {
public:
Initializer(){
pthread_mutex_init(&mutex, NULL);
}
};
Initializer initializer;
};

なんかダサい気がします。もっとよい方法を識者の方に伺いたいです。
(ちなみに、mutexをクラスのメンバにしてPTHREAD_MUTEX_INITIALIZERで初期化すると
「インテグラルじゃない値を初期化しようとしてる」みたいな警告が出るのでもっとダサい)


251 :デフォルトの名無しさん:03/03/21 00:09
コンストラクタ内で初期化しろ。
二回目以降はスキップ。
ダサいのがいやならカエレ!

252 :デフォルトの名無しさん:03/03/21 00:12
>>250
pthread_mutex_t を、initするクラスでラップしといてから

template<class T>
inline CMutex& common_mutex_of() {
 static CMutex mutex;
 return mutex;
}

253 :250:03/03/21 00:18
>>251
コンストラクタ内で初期化する方法だと、mutexを初期化するのは、メインスレッド
でやらないと駄目。でもメインスレッドから hoge::init() みたいなのを呼ぶのはダサい(呼び忘れるから)。
で、コンパイル時か、実行時でもmain関数より前に初期化を行いたい。


254 :250:03/03/21 00:21
>>252
おお。目から鱗かもです。

255 :デフォルトの名無しさん:03/03/21 00:25
チョッと待て、>>252も呼び出す時がいつかで競合の問題がある
ほら

pthread_mutex_t mutex;
bool pinit(){ pthread_mutex_init(&mutex, NULL); return true; }
bool pinitialized=pinit();

これでどうよ?

256 :デフォルトの名無しさん:03/03/21 00:28
namespaceっていつから流行ってんの?
それ一般的に使われてんの?

学究的な興味なんざ小指の爪の先ほどもない。
職業プログラマとして必要な技術?

257 :デフォルトの名無しさん:03/03/21 00:29
無理しないでnamespaceと対になったinitializerクラスで我慢しとけよ。

258 :250:03/03/21 00:36
>>255
あ、それでいいのか。
でもやっぱグローバル変数使わざるを得ない?
staticなメンバ変数と関数だけで済ませられないでしょうか。
(駄目なら、グローバル変数での初期化が定石ってことでいいのでしょうか)

>>256
標準ライブラリで使われている気が、、、


259 :デフォルトの名無しさん:03/03/21 00:39
>>258
staticなメンバ変数はほとんどグローバル変数と同じようなもんだぞ?

260 :デフォルトの名無しさん:03/03/21 00:42
マジで標準ライブラリに?
うーむ、ぐぐっても解説等出てこないから比較的新しい技術なのかと思っていたが、
C++の標準的な「何か」なのかな・・・
CからC++へ、なんとなく体で移行してきたんでわからんことが大杉。
本腰入れて勉強しないと限界みたい・・・

261 :デフォルトの名無しさん:03/03/21 00:44
とあるライブラリの関数foo()と別のライブラリの同名関数foo()を同一ソースでコールしたい。
さてどうする?

262 :250:03/03/21 00:46
>>259
確かにそうですね。結局、namespaceで保護するのが関の山ですかね。

263 :デフォルトの名無しさん:03/03/21 00:50
>>262
無名ネームスペースに閉じ込めたら?

264 :デフォルトの名無しさん:03/03/21 00:55
>>239

正しくない。
意味のある使い方がまだある。


265 :250:03/03/21 00:58
>>263
なるほど。っていうか、無名namespaceってのは初めて知りました。
mutex を、それを利用するクラスのメンバにして、
初期化は無名namespaceのグローバル変数を使ってやると。
それが一番かもしれないですね。


266 :名無しさん:03/03/21 01:54
ぬるい話題が多いな。
るいじの質問もあるし…
ぽんと,いい考えがうかばないのか?

267 :デフォルトの名無しさん:03/03/21 01:58
ぬるくない問題はC++では解決できないからねぇ。
そういう人はとっくにC#に以降済みだし。

268 :デフォルトの名無しさん:03/03/21 02:03
ミノガスカヨッ
  ( ・∀・)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >__Λ∩
  _/し' //. V`Д´)/
 (_フ彡        /  ←>>266

269 :デフォルトの名無しさん:03/03/21 09:22
C#だとよ(w

270 :デフォルトの名無しさん:03/03/21 10:35
>>228,>>230
ユーザー定義型を使って標準ライブラリのテンプレートを特殊化することは認められている。
17.4.3.1 -1- (ttp://www.kuzbass.ru/docs/isocpp/lib-intro.html#lib.reserved.names)

オーバーロードの追加が認められているという記述は見当たらなかった。

271 :228:03/03/21 12:32
>>270
おお!特殊化なら合法だったんだ。
これで幸せになれそうです。ありがとうございます。

272 :デフォルトの名無しさん:03/03/21 15:09
>>270
テンプレートライブラリを作成するときにstd::swap(a,b)を使うことを考えると、
自前のswap処理を作ったならstd::swapの特殊化をしておくべきだと思うんだが、
boost::scoped_ptrなんかは、boost::swapが定義されてるな。
これだと、
 scoped_ptr<T> a,b;
 std::swap(a,b);
と書いても、a.swap(b)にはならないな。

273 :272:03/03/21 23:07
http://std.dkuug.dk/jtc1/sc22/wg21/docs/papers/2001/n1296.htm
↑によると、

namespace std
{
 template<typename T>
 class X {};
 template<typename T>
 void swap(X<T>& rhs, X<T> lhs);
}

これは特殊化ではなく、オーバーロードの宣言になるので、規格違反になるそうだ。

結果として、
自前のクラスについてstd::swap等の特殊化はできるが、
自前のクラステンプレートについては(規格に従う限り)不可能らしい。

274 :デフォルトの名無しさん:03/03/21 23:25
クラステンプレートが static なデータメンバを持っているとき、複数のコンパイル単位で、
その static なデータメンバの定義を行っても、リンク時に一つにまとめられてしまうよう
なのですが、これは規格に則った動作でしょうか。

-- X.h --
template<class T> class X {
static T x;
};
template<class T> T X<T>::x;

-- Foo.cpp --
#include "X.h"

void foo()
{
X<int> a;
}

-- Hoge.cpp --
#include "X.h"

void hoge()
{
X<int> b;
}

ここで Foo.cpp と Hoge.cpp をコンパイルしてリンクしても、とくに X<int>::x の
多重定義にはならず、正常にリンクされます。(g++ と VC++ で確認)

しかし、C++第3版の 13章7節によると「非inline の static メンバは、どこかの翻訳単位に
ユニークな定義を持たなければならない。」とあり、上のような動作は保証されていない
ようなのです。

275 :デフォルトの名無しさん:03/03/22 00:06
>>274
14.5.1.3にX.hの内容と同じ例があげられている。
その挙動を疑うなら、以下のソースも疑うことになると思うのだが・・・。

-- X.h --
template<class T>
void f();

-- Foo.cpp --
#include "X.h"

void foo()
{
f<int>();
}

-- Hoge.cpp --
#include "X.h"

void hoge()
{
f<int>();
}



276 :275:03/03/22 00:10
あ、ごめん。訂正。

-- X.h --
template<class T>
void f(){}



277 :デフォルトの名無しさん:03/03/22 00:11
? これ同じ例か?

278 :デフォルトの名無しさん:03/03/22 03:56
?HogeHoge@@YAHG@Z
を元に戻すテーブルかなにかはありませんか?

279 :デフォルトの名無しさん:03/03/22 04:01
>>278
WinならUnDecorateSymbolNameというのがある


280 :デフォルトの名無しさん:03/03/22 04:12
undname -f ?HogeHoge@@YAHG@Z

?HogeHoge@@YAHG@Z == int __cdecl HogeHoge(unsigned short)


281 :278:03/03/22 04:26
Σ(*゚Д`;)ア…ア…アッハァァァァァァァァ?!!
すばらしいですぞ、このような時間に!!!
はげしくあげしく、感謝します。

282 :デフォルトの名無しさん:03/03/22 06:37
以下のように、相互にincludeしたいのですが、エラーが出てしまいます(´Д⊂
こういう場合は、2つのクラスを、同じヘッダにまとめるしか無いのでしょうか?

----------------A.h
#ifndef A_H
#define A_H

#include "B.h"

class A(){
A( B* b );
};

#endif
----------------B.h
#ifndef B_H
#define B_H

#include "A.h"

class B(){
B( A* a );
};

#endif
----------------

283 :デフォルトの名無しさん:03/03/22 06:43
----------------A.h
#ifndef A_H
#define A_H

#include "B.h"

class B;
class A(){
A( B* b );
};

#endif
----------------B.h
#ifndef B_H
#define B_H

#include "A.h"

class A;
class B(){
B( A* a );
};

#endif
----------------

284 :282:03/03/22 06:49
>>283
見事にリンクできました。これがクラスの前方参照…。
助かりました。ありがとうございました。

285 :デフォルトの名無しさん:03/03/22 12:02
初歩的質問です。

int x=0;

int *a = &++x; // OK
int *b = &x++; // エラー

bの初期化でエラーになるのはなぜでしょうか?
コンパイラによれば'&'に左辺値がないとのことですが・・・。
自分のイメージとしてはxのアドレスでbを初期化した後、
xをインクリメントするという感じなのですが・・・。


286 :デフォルトの名無しさん:03/03/22 12:22
&(x++)

287 :デフォルトの名無しさん:03/03/22 12:28
>>286
エラーですよ

288 :デフォルトの名無しさん:03/03/22 12:30
優先順かな。
下は&xが評価された後にインクリメントされるから、
一時領域のインクリメントはできないのか、あいまいさではじかれてるのかどっちかでしょう。
エラーコードを見ればどっちかわかる。

289 :285:03/03/22 12:31
ちなみに私が知りたいのは、どうしたら自分のイメージどうりに
動かせるかではなく、なぜエラーになるのかです。
結合順位からいえば、もともとインクリメント演算子の方が強いのですが・・。

290 :デフォルトの名無しさん:03/03/22 12:34
禿本の p161 に説明があるけどピンとこないな。

>論理的に可能であれば、左辺値の被演算子を取る演算子の処理結果は、
>その左辺値被演算子を示す左辺値になる。
 (略)
>int *p = &++x;  // p は x を指す
>int *q = &(x++); // エラー: x++は左辺値(xに格納されている値)ではない

x に副作用が発生するタイミングは前置でも後置でも ; に至るまでの
いつかでしかないと思うのだけど前置のみ左辺値になるのはどうして
だろう。

291 :デフォルトの名無しさん:03/03/22 12:40
>>289
まあ ++x は、極論すれば、{x = x + 1, x} と同じだからアドレスがとれる。
でも、x++ は、{(x = x + 1)} と言う式になるから、アドレスが取れない。

292 :デフォルトの名無しさん:03/03/22 12:40
だから、前置は式評価前にインクリメント、後置は式評価後にインクリメントするからだろ?

293 :285:03/03/22 12:40
本の解説でも、コンパイラのエラーメッセジでも
あくまで&に対する左辺値が無いということが原因みたいですね。

ちなみに

int *r = &(x += 1); // OK

これはOKでした。これが前置と同じことなんですかね・・・。
後置だとカッコの中身が先に評価されないとか(超適当)。


294 :デフォルトの名無しさん:03/03/22 12:41
式ってのはxね。

295 :デフォルトの名無しさん:03/03/22 12:45
>>292
前置の場合 x の副作用が式の評価前に行われるのは保証されてるの?


296 :デフォルトの名無しさん:03/03/22 12:57
int a, b, c;
a = 0;
b = a++;
c = ++a;

bは0、aは1になるのはわかってんだよね?

297 :デフォルトの名無しさん:03/03/22 12:57
× bは0、aは1
○ bは0、cは1

298 :デフォルトの名無しさん:03/03/22 12:59
あーちがう!
このままじゃcは2になるやん。
まぁ雰囲気だけ味わってくれ・・鬱だ死のう。

299 :デフォルトの名無しさん:03/03/22 13:00
cは2じゃないか?

300 :デフォルトの名無しさん:03/03/22 13:14
int& operator++(int&);
int  operator++(int&,int);

int  x = 0;
int* a = &(operator++(x));
int* b = &(operator++(x,0));


301 :デフォルトの名無しさん:03/03/22 14:20
T& operator++(void) { m_nakami+=1; return *this; }
T operator++(int) { T temp=m_nakami; m_nakami+=1; return temp; }

後者の返り値は値(一時変数だから参照を返せない)だから
アドレスがとれないってことじゃなくて?

302 :デフォルトの名無しさん:03/03/22 14:21
基本型でない型の振る舞いと対称性を保つためにエラーにせざるを
得ないということ? template とか。本末転倒な気もするけども。

303 :デフォルトの名無しさん:03/03/22 14:35
はぁ?

304 :デフォルトの名無しさん:03/03/22 14:42
Cではどっちもエラーになるな。

305 :デフォルトの名無しさん:03/03/22 14:45
> int* b = &x++;
↑こんなコード、コンパイルできるようにしてもなんのメリットもないだろ。

306 :302:03/03/22 14:45
>>303
>>300-301 が言ってるのはそういうことじゃないのか?

307 :デフォルトの名無しさん:03/03/22 14:56
>>305
だからなんなんだ?

勉強のできないやつってのは、なぜそうなるか?どういう原理なのか?
といったことにはまったく興味をしめさず、できればいい、動けばいい
的な考えなんだよな。だから応用もきかないし、所詮そこ止まりの人間。
そういう奴はベーシックでもやってりゃいい。


308 :300:03/03/22 15:00
>>306
オーバーロード可能な演算子のシグネチャとして、
C++では演算子'++'を>>300のように定義した。
この定義には「基本型でない型の振る舞いと対称性を保つ」目的があったかもしれない。
その結果、Cではコンパイルできなかった式'&++x'はコンパイル可能になった。
ここは「コンパイル可能にせざるを得ない」という話になるだろう。

だが、'&x++'「エラーにせざるを得ない」なんて話には、どうにもつながらない。

ちなみに、300==305。
>>307
何のメリットも無いのに、Cと異なる挙動とする意味でもあるのか?

309 :デフォルトの名無しさん:03/03/22 15:01
>>306
もし>>302の疑問が正しいのであればそもそもC言語でも駄目なのはどうしてだ?
C言語では基本型以外にoperator ++は定義できない


310 :デフォルトの名無しさん:03/03/22 15:09
>>何のメリットも無いのに、Cと異なる挙動とする意味でもあるのか?

そういうこと言っているわけじゃねぇだろって
もっと一般的な話だろ(プログラムに限らずな)


311 :306:03/03/22 15:11
>>300
Cと比較すると解釈が逆になることが分かるな。
でもメリットて話だとしたら、&++x にどんなメリットがあったのか
疑問だ。Cと同じように左辺値になり得ないとしたら問題が起こる
のだろうか。

312 :デフォルトの名無しさん:03/03/22 15:17
>&++x にどんなメリットがあったのか疑問だ。

意味がわかりません!!メリットなんて別にないだろ!!


313 :306:03/03/22 15:18
>>312
メリットが無いのであれb &++x も C と同じように左辺値に
ならなければよかったんでは。

314 :306:03/03/22 15:19
>&++x も
++x も

315 :デフォルトの名無しさん:03/03/22 15:19
VC++って標準C++とは限らないんだな・・・。
for(int i = 0; ... ; ...)
このiのスコープもデフォルトではforブロック外だよな、.netは。
ほかにも、標準C++に沿ったコーディングでエラーにもなるし。
標準C++のコンパイラってあんの?

316 :デフォルトの名無しさん:03/03/22 15:20
ストラップにメールだしてくれ。

317 :300:03/03/22 15:22
>>306
> &++x も C と同じように左辺値にならなければよかったんでは
左辺値にならないとしたらオーバーロード可能なシグネチャの定義が、
 int operator++(int&)
というようなものになり、
ユーザー定義型で効率のよい実装が難しくなる。

>>310
あれ?外してた?あんた>>307か?
何を突っ込まれたのかわからない。ごめん。

318 :デフォルトの名無しさん:03/03/22 15:28
&++x ←これって左辺値じゃないよね?
++x ←これは左辺値になるけど
x++ ←これは左辺値じゃない


319 :デフォルトの名無しさん:03/03/22 15:31
まあ、確かに++xを左辺値にする必要はないのかな?

320 :デフォルトの名無しさん:03/03/22 15:32
(++x)=10;
とかできてもうれしくないしな・・・


321 :デフォルトの名無しさん:03/03/22 15:35
メリットうんぬんじゃなくて、結合やらなにやらの思想の統一性から
こうしたのかもしれないね・・・。なにを基準に決めたのか知らんけど。

322 :デフォルトの名無しさん:03/03/22 15:37
でも ++x = ++y とか書きたいときがある。ない?
今議論されてることって一貫性の問題?

323 :322:03/03/22 15:37
激しくかぶった。ごめ。

324 :デフォルトの名無しさん:03/03/22 15:38
しかしK&Rにせよストラウストラップにせよ、わざわざ
読者をなやますようなコードをちりばめるね・・・。
参考書というよりは教科書チックだな。

325 :デフォルトの名無しさん:03/03/22 15:41
C++では (x = y) = z; がエラーにならずに通るからね。Cでは見事に
エラー。

326 :デフォルトの名無しさん:03/03/22 15:42
>>322
*++x = *++y;
こうじゃないの?
++x = y++
は何が起こるの?

327 :デフォルトの名無しさん:03/03/22 15:43
++x = ???
ってけっきょく???で上書きされるから
インクリメントを事前にしても意味ないんじゃ・・・。

328 :306:03/03/22 15:45
効率の問題で ++x が左辺値になることを許してしまうというのも
なんだかな・・・。

329 :デフォルトの名無しさん:03/03/22 15:48
別に効率の問題ではない。
勘違いしているだけでしょう。

330 :デフォルトの名無しさん:03/03/22 15:49
int x = 0;
int y = 5;

++x = y++;

cout << x << endl;
cout << y << endl;

result:
5
6


331 :デフォルトの名無しさん:03/03/22 15:51
はあ
++xは意味がないですね


332 :デフォルトの名無しさん:03/03/22 15:51
++x = x++;


333 :デフォルトの名無しさん:03/03/22 15:54
>>332
それは x = x++; と同じで結果が未定義なのでは。

334 :デフォルトの名無しさん:03/03/22 15:56
int x = 0;

++x = x++;

cout << x << endl;


result:
2

(VC++.net)


335 :デフォルトの名無しさん:03/03/22 15:57
(++x)++;

336 :デフォルトの名無しさん:03/03/22 15:59
>>334の鼻から悪魔が出てきている最中

337 :デフォルトの名無しさん:03/03/22 15:59
>>334
result:
2
(BCC5.6)
2
(MingGW 3.2.2)

338 :デフォルトの名無しさん:03/03/22 16:00
++++++++++x;

339 :ハンバーグフートーハルコーギョーコーコー:03/03/22 16:03
++--+--++----x;

340 :デフォルトの名無しさん:03/03/22 16:04
もうめちゃくちゃだな

341 :デフォルトの名無しさん:03/03/22 17:35
質問です。
#include <cstdio>
とすれば、<stdio.h>で定義されている関数がstd名前空間内に入っている形で
利用できると理解していたのですが、
std::puts("俺");
が、「'std'はクラスでも名前空間でもない」と言われます。また、
::puts("誰");
だとコンパイルが通ります。私の勘違いなのでしょうか。
環境はVC6.0です。

342 :デフォルトの名無しさん:03/03/22 17:39
VCは標準C++準拠じゃありません。


343 :デフォルトの名無しさん:03/03/22 17:40
>>341
VC6.0を窓から投げ捨てろ
それかSTLportをインストロール

344 :デフォルトの名無しさん:03/03/22 17:48
>>342-343
そういうことでしたか。
VCを投げ捨てる決心がつくまでの間は、namespace std{ と } で
何とかやっていけそうです。有難うございました。

345 :デフォルトの名無しさん:03/03/22 18:48
多倍長計算ができるC++用のライブラリの中で、信頼の置けるものはありませんか?

346 :デフォルトの名無しさん:03/03/22 21:31
例外処理ってどんな時に使用しますか?


347 :デフォルトの名無しさん:03/03/22 21:37
>>346
例外的なことが起きた時

348 :デフォルトの名無しさん:03/03/22 21:41
MFCではファイルの読み込みでEOFに達すると例外を投げます。




ハァ

349 :デフォルトの名無しさん:03/03/22 21:41
>>347
実はその「例外的」の例外の定義について深く知りたかったり…。

350 :デフォルトの名無しさん:03/03/22 21:41
ageてしまった。スマソ

351 :デフォルトの名無しさん:03/03/22 21:43
>>346
例外でもなんでもなく、ごく自然にあり得るエラーでも、
すぐ例外投げて責任転嫁する糞な設計のライブラリを
嫌々渋々使わされるとき。


352 :デフォルトの名無しさん:03/03/22 21:46
>>349
人によって例外の定義は変わる。

ファイルが開けないというのを例外だという人もいれば
それは非常によくあることだから例外ではない、戻り値で知らせるべきだという人もいる

だからごめんなちゃい、わかんないよ

353 :デフォルトの名無しさん:03/03/22 21:52
>>351
そんなライブラリ使うの止めて、あんたがすばらしいライブラリつくりゃ委員で内科医 ?

354 :デフォルトの名無しさん:03/03/22 21:57
Javaはコンパイルエラーで例外を吐きます。
ハァ

355 :デフォルトの名無しさん:03/03/22 22:31
init();
run();
done();

と失敗することを全く考えずに正常系の処理をとりあえず書く。
で、後から判明した失敗する要因をすべて例外として投げる。

356 :デフォルトの名無しさん:03/03/22 23:46
>>348
iostream系もEOF(やその他エラー)で例外投げるようにできなかったっけ?

357 :デフォルトの名無しさん:03/03/22 23:54
exceptions() で例外の設定できるね

358 :デフォルトの名無しさん:03/03/22 23:59
いちいち戻り値をチェックしなくていいから楽チン


359 :デフォルトの名無しさん:03/03/23 00:01
>>355
ワラタ。
ありがちな泥縄設計だね〜
一部の人にはシャレにならなかったりw

360 :デフォルトの名無しさん:03/03/23 00:14
>>359
正常系-例外の分離が本質じゃないのか、C++の例外は?
たとえばWindowsのSEHですらcontinueがあるのに、
それすらもない例外なんだから、それ以外の用途は無いだろ

361 :デフォルトの名無しさん:03/03/23 00:19
bool operator==(T const & a, U const & b) って、クラス T のメンバに
bool T::operator==(U const & b) があればいらないですよね?


362 :デフォルトの名無しさん:03/03/23 00:41
>>361
ユーザー定義の変換がある場合は、そうとも言い切れない。

363 :デフォルトの名無しさん:03/03/23 01:10
>>362
どんな変換の場合でしょうか?
T型への変換があった場合でも T::== が呼ばれますよね?

364 :362:03/03/23 01:30
>>363
↓MEMBERの定義を変えてコンパイルして見れ。

#define MEMBER 1
struct S;
struct T
{
    T();
    T(const S&);// S to T
#if MEMBER
    bool operator==(int) const;
#endif
};
#if !MEMBER
bool operator==(const T&,int);
#endif

bool f(const S& s,int i)
{
    return s == i;
}


365 :デフォルトの名無しさん:03/03/23 02:26
あるエラーが発生した時、もう復帰が不可能または復帰する必要無しである場合
全て例外投げてます。

って安易な考えじゃだめなのかなぁ。

366 :デフォルトの名無しさん:03/03/23 02:36
>>364
なるへそ。サンクス。

367 :デフォルトの名無しさん:03/03/23 02:52
>>365
「復帰が不可能または復帰する必要無し」とかいう用件は、
ライブラリを使う側、使う場所で決まると思うが。

368 :デフォルトの名無しさん:03/03/23 03:42
>>367
iostream の exceptions みたいにすればいいじゃん。

369 :デフォルトの名無しさん:03/03/23 04:05
C++よりはJavaかC#なんかの標準ライブラリの例外の投げ方見てると参考になるよ。
で実際は>355的な発想でちゃんと設計していくんだけど
例外的な使い方としてgoto的な例外(処理中止例外みたいなの)も織り交ぜるのが通のやり方。

370 :デフォルトの名無しさん:03/03/23 04:15
>>368
エラーが発生した状態を保持できるようにするのは
そう簡単に決心がつくものじゃない。
全ての処理の前にその状態を問い合わせる必要が出てくる。

371 :デフォルトの名無しさん:03/03/23 13:29
>>367
もちろん、エラー後の処理を判断しかねる場所では、戻り値でエラーを返します。
特にループ内でも頻繁に使用されるような関数であれば、例外処理のようなコスト
の高い処理を毎回行ってその都度判断を行う事は避けた方が良いと思います。

でも、判断できる場所では、例外無く例外を投げてます。

ってやり方をしてたら、部下に
「例外処理は本当の例外が発生したときのみ使用した方が良いのでは?
 想定できるエラーで例外処理を行うのは邪道だと思うんですが」
と意見されてしまいますた…。

372 :デフォルトの名無しさん:03/03/23 13:42
>想定できるエラーで例外処理を行うのは邪道だと思うんですが
想定できないエラーってなに?という線引きの話だけど

メモリが足りない、ファイルがオープンできない、
他のプロセスが書き込んだあるべきデータが存在しない。
ライブラリにおかしな引数が渡された。
といった自分は悪くないけど発生しうるエラーはすべて例外にするかな。
自分が悪い=バグはそれ専用の例外を投げる。

偶数はスキップして奇数のみを処理する。
という普通にあり得るケースはコスト以前に例外にはしない。

373 :デフォルトの名無しさん:03/03/23 14:55
>>372
この手のどっちでもいいことって、宗教戦争になるからなぁ。

> ファイルがオープンできない、

これ1つとっても、ユーザーがファイル名を入力していたなら単なるエラー処理とも言えるし。
自分が作成したファイルだったりしたら、例外とも言えるし。

ようは好みの問題だろ。結論なんか出ないよ。

374 :デフォルトの名無しさん:03/03/23 17:00
> 自分が悪い=バグはそれ専用の例外を投げる。
その場合は悪あがきせずにabort()するべきだと思うが。
ネットワークアプリだったら、バグっているのに実行続けたら、
セキュリティホールになるだろ。

375 :デフォルトの名無しさん:03/03/23 17:29
「想定できないエラーが生じたら例外」って、誰が考えたんだ?
throwって書いた本人は間違いなくエラーを予測しているだろうが。
俺は、自分自身を復旧させる気が無くて、デストラクタ以外の
今後の動作を保証したくない時か、単にprivate関数の中での
エラーを一番外のpublic関数でまとめて処理したい時に例外にしてる。

376 :371:03/03/23 18:13
ああ、いわゆる参照オブジェクト系のクラスを設計する時は
同じくそういう手法を用いてます。

逆に、値オブジェクト系のクラスを設計する時は、
なるべくエラー処理を例外処理で行わないよう気をつけてます。
パフォーマンス的な問題で…。

ちなみに、私の部下が言った「想定できないエラー」とは
>>372さんが中段に書かれているような事でした。

実はその部下に正直に「私は例外処理に詳しくないので、休日使って調べてみる。ごめん」
と言ってしまいましたが、上司として言っちゃダメな事なんだろうなぁ…。

377 :デフォルトの名無しさん:03/03/23 18:20
>>376
俺は比較的良い上司に思える

378 :デフォルトの名無しさん:03/03/23 18:31
David Abrahams:"See below"
http://www.boost.org/more/error_handling.html
http://www.boost.org/more/generic_exception_safety.html
ディヴィッド エイブラハム:「↓嫁」
http://boost.cppll.jp/HEAD/more/error_handling.html
http://boost.cppll.jp/HEAD/more/generic_exception_safety.html

379 :デフォルトの名無しさん:03/03/23 18:43
>>376
理想の上司とは「これは仕様だ」といって突きすすむような人のことだよネ。

380 :デフォルトの名無しさん:03/03/23 19:56
>>378
ありがとうございます。とても勉強になりました。
(もしかしてここに書いてある内容は常識だったりしますか…?)

>>379
正しい知識を基に(環境要因を含めて)妥当な判断を下せて
(多少強引でも)突き進める人、が私的に理想の上司かなぁ。
ネタにマジレスと知りつつも。

381 :デフォルトの名無しさん:03/03/23 20:59
理想の上司ってのは言語に詳しい必要ないからなぁ。

382 :デフォルトの名無しさん:03/03/24 03:44
ここはマ板ですか?

383 :デフォルトの名無しさん:03/03/25 00:15
すみません。
(void **)&pDirectInput
という表記は一体どういう意味なのでしょうか。void型って型が指定されてないんですよね?
それの2次元配列?にキャスト?ポインタのアドレスを2次元配列にキャスト?意味わからないです。。

384 :デフォルトの名無しさん:03/03/25 00:19
pDirectInputへのポインタを、void*へのポインタへキャスト。

385 :デフォルトの名無しさん:03/03/25 00:34
>>383
void ** はvoidへのポインタのポインタ。但し、void *型はオブジェクトの
大きさがわからないので、アドレス演算をしようとしたり、実体化しようと
するとエラーになる。明示的なキャストが必要。それ以外は普通の
ポインタへのポインタと同じ。

386 :デフォルトの名無しさん:03/03/25 00:45
ポインタに更にポインタがいる場合ってどういう時ですか?

387 :デフォルトの名無しさん:03/03/25 00:53
>>386 Cスレ逝け

388 :デフォルトの名無しさん:03/03/25 01:02
>>386
具体的な例って言うと、ポインタ配列をソートしたりする必要がある時
かなあ。

389 :デフォルトの名無しさん:03/03/25 01:04
あぁ、なるほど。ありがとうございました。二度とこねぇよ!

390 :デフォルトの名無しさん:03/03/25 01:05
>>386
動的二次元配列の代用

391 :デフォルトの名無しさん:03/03/25 01:06
>>389
その場合はこのAA貼れ。かっこいいぞ。
                 ┌─┐
                 |も.|
                 |う |
                 │来│
                 │ね│
                 │え .|
                 │よ .|
      バカ    ゴルァ  │ !!.│
                 └─┤    プンプン
    ヽ(`Д´)ノ ヽ(`Д´)ノ  (`Д´)ノ    ( `Д)
    | ̄ ̄ ̄|─| ̄ ̄ ̄|─| ̄ ̄ ̄|─□( ヽ┐U
〜 〜  ̄◎ ̄  . ̄◎ ̄   ̄◎ ̄   ◎−>┘◎

          ヽ(`Д´)ノ モウコネエヨ!!
            (  )   ウワァァン!!
            / ヽ

392 :デフォルトの名無しさん:03/03/25 01:09
                 ┌─┐
                 |あ.|
                 |り |
                 │が│
                 │と│
                 │よ .|
                 │っ .|
      バカ    ゴルァ  │ !!.│
                 └─┤    プンプン
    ヽ(`Д´)ノ ヽ(`Д´)ノ  (`Д´)ノ    ( `Д)
    | ̄ ̄ ̄|─| ̄ ̄ ̄|─| ̄ ̄ ̄|─□( ヽ┐U
〜 〜  ̄◎ ̄  . ̄◎ ̄   ̄◎ ̄   ◎−>┘◎

          ヽ(`Д´)ノ オレイヲイウノガテレクサイゼ!!
            (  )   ウワァァン!!
            / ヽ


393 :デフォルトの名無しさん:03/03/25 01:10
argvが手っ取り早い例かと

394 :デフォルトの名無しさん:03/03/25 01:11
文字列の配列→やっぱり2次元配列の事なのね

395 :デフォルトの名無しさん:03/03/25 01:17
>>394
C++的にはstd::vector<std::string>だろ。
文字列の配列ごときはコードに直接表現できる。
Cとは違うのだよ、Cとは。

396 :デフォルトの名無しさん:03/03/25 01:21
>>395
Cを馬鹿にするな

397 :デフォルトの名無しさん:03/03/25 01:22
悲しいけどここC++スレなのよねぇ

398 :デフォルトの名無しさん:03/03/25 01:25
Cにmany improvementsをプラスしたものがC++。だからCでできる
事はC++でも大抵できる。敢えてそれをしないのは、それに替わる
もっといい手段が提供されてきたから。 

399 :デフォルトの名無しさん:03/03/25 05:59
質問です。
フルスクリーン動作のゲームをWindowで動作させる監視プログラムを作りたいのですが
ゲームそのものの画面の解像度は変えずに
ディスクトップが1280x1024動作、ゲームが640x480動作を考えてまして
監視しているプログラムだけの画面を切り替えるようにするにはどうすればよいのでしょうか?

ちょっと、わかり難い質問でスミマセン。。。

400 :デフォルトの名無しさん:03/03/25 06:06
1.DirectXのウインドウモードでフルスクリーンをエミュレートするプログラムを書く
2.該当アプリのDirectX呼び出しを乗っ取る
3.こんな質問をしているようじゃ絶対作れない
4.そもそもスレ違い

401 :デフォルトの名無しさん:03/03/25 06:39
>>400
やっぱりDirectXの機能を使うしかないですか・・・

仮想的に画面を作るという方法が楽なのかな・・・


402 :デフォルトの名無しさん:03/03/25 09:22
>>395
std::stringのcopy constructorとoperator=がnothrowだと
保証してくれるなら使ってやるよ。

403 :デフォルトの名無しさん:03/03/25 09:56
>>402
強い保証が欲しいなら自分でラップすればいい。
コピーしてswap使うとか、boost::shared_ptr使うとか、いろいろあるだろ。

404 :デフォルトの名無しさん:03/03/25 10:39
質問です。

(ファイル"A.h")

namespace Aspc {
   class Aclass {

          Bspc::Bclass  Bobj;
   };
};

----------------------------------
(ファイル"B.h")

namespace Bspc {
   class Bclass {

          Aspc::Aclass  Aobj;
   };
};



こんな関係のヘッダをインクルードしようと思ったのですが
どうしたものだかと悩んでしまいました。
ご教授お願い致します。


405 :デフォルトの名無しさん:03/03/25 10:59
>>404
ヘッダでインスタンスを定義しちゃダメ

406 :405:03/03/25 11:01
>>404
'class'が見えてなかったよ・・・ごめん。

前方宣言しる。

407 :デフォルトの名無しさん:03/03/25 11:01
>>404
namespace Aspc {
   class Bclass;
   class Aclass {

          Bspc::Bclass  Bobj;
   };
};

----------------------------------
(ファイル"B.h")
#include "A.h"
namespace Bspc {
   class Bclass {

          Aspc::Aclass  Aobj;
   };
};


408 :405:03/03/25 11:04
>>404
あぁあ、classの中でもやっぱりインスタンスには前方参照は効かんぞ。

そのクラス定義は、論理的にムリだ。
前方宣言+auto_ptrくらいにしとけ。

スレ汚し、まことにもうしわけない。

409 :404:03/03/25 11:19
>>405
うあ やはり無理があったですか。
どうやっても片方で名前空間が通せませんでした。

了解しました。構成を見直してみます。
ありがとうございました。

410 :デフォルトの名無しさん:03/03/25 11:22
Aの中には必ずひとつのBを入れてください。
Bの中には必ずひとつのAを入れてください。

さぁ、Aをひとつ、くださいな。

411 :デフォルトの名無しさん:03/03/25 11:32
>>404
ワラタ
sizeof(Aclass)はいくつになるんだよ。

412 :459:03/03/25 12:58
namespace Aspc {
    class Bspc::Bclass;
   class Aclass {

          Bspc::Bclass&  Bobj;
   };
};

----------------------------------
(ファイル"B.h")

namespace Bspc {
    class Aspc::Aclass;
   class Bclass {

          Aspc::Aclass&  Aobj;
   };
};

実体はコンストラクタで作られ

413 :404:03/03/25 13:33
404です 皆さま レスありがとうございますー

結局、どっちみち相互依存が大きいので
独立させる意味なしと判断しますた。

namespace Aspc {
    class Aclass;
    namespace Bspc {
         class Bclass {
              Aclass   Aobj;
         };
    };
    class Aclass {
         Bspc::Bclass   Bobj;
    };
};

とりあえず今回はこれで回避。

>>412
試してみましたが、やはりどうしても
先に読まれるほうの class Bspc::Bclass;  のあたりで
Bspcが未定義になってしまうかと思われます。

>>410
あー、上記は例を簡略しすぎてアレな関係になってますが
実際はクラス同士を持ち合っているわけではないのでご心配なく。



414 :デフォルトの名無しさん:03/03/25 14:11
>>413
ほんとは AclassとBclassって、
お互いのポインタか参照を持ち合ってるのか?


415 :404:03/03/25 15:40
たびたびすみません   
>>414 もちょい正確にすると、

("A.h")
namespace Aspc {
     class Aclass {
          void UpdateA();
          void FromBclass( データ );
          Aspc::BaseClass* pBase;
     };
     class BaseClass {    //実体保持
          void Update();  //AobjとBobjの更新ループ
       private:
          Aspc::Aclass  Aobj[n];
          Bspc::Bclass  Bobj;
     };
};
--------------------------------------
("B.h")
namespace Bspc {
     class Bclass {
          void UpdateB();  //任意のpAclassにデータを投げる
          Aspc::Aclass* pAclass[n];
     };
};

がんばって要約するとこんな関係ぽ。
名前空間とかおぼえたてで プロトタイプ宣言で
どうにかするのかなと思い。

やっぱりBclassはAspcなしでは動かさないので、
Aspcに内包することにしました。お騒がせしましたー

416 :デフォルトの名無しさん:03/03/25 19:59
----ファイルcmycl.h----
class mycl{
public:
static int i1;
};

----ファイルcmycl.cpp-----
#include"mycl.h"
int mycl::i1 = 1;

----ファイルtest1.cpp----
#include"iostream.h"
#include"mycl.h"

int main(){
mycl c;
cout << c.i1 << "\n";
return 0;
}

とやって、
bcc32 test1.cpp cmycl.cpp
とコンパイルしたのですが、エラーが出てしまいます。
静的メンバ変数を使えるようになりたいのですが、ご教授お願いします。

417 :デフォルトの名無しさん:03/03/25 20:07
>>416
どんなエラーが出たのか書け。

あと、インクルードするファイル名を確認しろ。

418 :デフォルトの名無しさん:03/03/25 20:14
>>416
インクルードガード。散々ガイシュツ。

419 :デフォルトの名無しさん:03/03/25 22:34
VC++6.0,Winでのチラつかない描画に関する質問。
オフスクリーン描画、WM_PAINTで転送がメジャーだろうけど
もっとかんたんな方法ない?フラグ立てるだけ、とか。

420 :名無しさん:03/03/25 23:34
ぬるぽを使ってはいけない理由を詳細に説明してください。

421 :デフォルトの名無しさん:03/03/25 23:34
>>419
レス違い

422 :デフォルトの名無しさん:03/03/25 23:35
>>421
れすじゃないすれ

423 :デフォルトの名無しさん:03/03/25 23:38
ぬるぽって何?
nullっぽい って言う意味?

424 :デフォルトの名無しさん:03/03/25 23:41
とりあえずここではバルスよりも禁句とされている

425 :423:03/03/25 23:50
なるほど・・・

ヌルポインタのことか
あまり使わない単語だから気づかなかった(汗

426 :デフォルトの名無しさん:03/03/26 00:13
>>425
(゚Д゚)ハンパネー!!!


427 :デフォルトの名無しさん:03/03/26 00:19
( ´∀`)<ぬるぽ

428 :デフォルトの名無しさん:03/03/26 00:31
>>427
(゚Д゚)ハンパネーガッ!!!


429 :国語が足りない奴:03/03/26 08:03
struct BMP{
struct BMP BP;
};
この構造体をエラーなしにしたい時はどうすれば
いいですか?
でるエラーは「struct BMPは未定義」です。

430 :デフォルトの名無しさん:03/03/26 08:08
>>429
メンバ変数をstruct BMP *BP;にする。

431 :デフォルトの名無しさん:03/03/26 18:53
今、Borand C++ Compiler 5.5を使い独習C++で勉強しているんですが、
コンパイルすると次のようなエラーが表示されます。

致命的エラー F1003 c:\Boland\Bcc55\include\stdcomp.h 5:
error 指令: Must use C++ for STDCOMP.H

凄く簡単な下記のようなソースでもコンパイルする際にエラーになります。
一度再インストールしてみましたが、無理でした。
何か対処法はないのでしょうか?

#include <iostream>
using namespace std;
int main()
{
cout << "Hellow world!\n";
return 0;
}

よろしくお願いします。

432 :デフォルトの名無しさん:03/03/26 18:57
filename.cpp

433 :デフォルトの名無しさん:03/03/26 19:02
>>432
解決しました。本当にありがとうございます。
ついCの癖でそのまま.cにしていました。

434 :デフォルトの名無しさん:03/03/26 22:47
質問というかなんというか、ちょっと気になったので、
ご意見が伺えればと思います。

たとえば、
class Hoge {
public:
hoge_t value() const {
// 初期化してないときは、ファイルから読み込んだりして
// メンバを初期化したい。
// でも、いつ使うか分からないのでコンストラクタでは
// 初期化したくない。
// でも、意味的には絶対にconst なのに。。。
}
};
みたいな、メンバを作りたくなったことってないですか?
そんな場合ってどうしてます?
1. しょうがないので、constをはずす。
2. Hoge* h = (Hoge*)this;
3. グローバルな領域に、いつも触れるオブジェクトをおいておいて、
それを参照する。
4. その他

くらいですかね?
1. は、そのためにconstを使わないというのが、のちのち別の弊害を
呼びそうで嫌です。
2.や3.は、このクラスのconstが信用できなくなりそうで嫌です。

結局、オーバヘッドが気になるけど、コンストラクタで初期化して
しまったのですが、なにか良い解決方法ってありますか?

よろしくです。

435 :デフォルトの名無しさん:03/03/26 22:51
>>434
// 初期化してないときは、ファイルから読み込んだりして
// メンバを初期化したい。
// でも、いつ使うか分からないのでコンストラクタでは
// 初期化したくない。
// でも、意味的には絶対にconst なのに。。。
constの意味解ってますか?


436 :デフォルトの名無しさん:03/03/26 22:53
>>434
キャッシュ要素やレイトバインディング用には
mutableキーワードが使えるけど

437 :デフォルトの名無しさん:03/03/26 23:05
>>435
ちゃんと読んでくれ。

>>436
そんなものがあるとは、しりませんでした。
なかなか、知らないことってあります。
でも、使い方は難しそうですね。
コーディング規約で使うなとか、書かれそう。

非const のメンバ関数の評価を必要があるまで行わない、みたいな
機構をコンパイラがサポートしてくれたら、、、
とつくづく思います。

438 :デフォルトの名無しさん:03/03/26 23:49
>>436
そんな便利なものが、、、と思ったが使い方が難しいですね。
結局、コーディング規約で使用不可になるのも時間の問題かと、、、

必要なときだけ評価してくれるメソッドが作れる仕様になって
くれないかな。と思うよ。

439 :デフォルトの名無しさん:03/03/27 00:26
>>437
いまいちいみがわからn。
ちょっと解説してくれ

440 :デフォルトの名無しさん:03/03/27 00:35
const版と非const版をオーバーロードするんじゃダメなのか?

441 :デフォルトの名無しさん:03/03/27 00:40
そーでなくって、
たとえば、円周率の1万桁目を返すメソッドがあったとする。
毎回、1万桁を計算するのは嫌なので、必要なときに計算したい。
これは、意味的にはconstであると考えられる。
もちろん、コンストラクタで計算するというのもありだが、
もし使わないとしたら、計算時間がもったいない。
どうしよう、、、、
という話です。

442 :デフォルトの名無しさん:03/03/27 00:47
>>438
使い方が難しいといったのは、constという指定では、本来メンバに
副作用があってはいけないと思います。
が、mutableでは、それができることになります。
ちょうど、friendのようなもので、よほどドキュメントが整備されて
居ない限り、動作を追うのが難しくなります。
本来、副作用を極小化することによって、想定できない動作を防ぐために
classやconstというのはあるはずですから。

そこで、たとえば副作用があってもいい、コンストラクタや非constの
メソッドを呼び出したときに、その動作のうち、時間がかかってしかも
使われないかもしれない初期化のコードなどの評価を必要があるまで
遅延させることができたなら、より安全に記述できるんじゃないかな
って思ったって訳です。



443 :デフォルトの名無しさん:03/03/27 00:54
面罵のconstとmutableキーワードを言語仕様から取っ払え。

444 :デフォルトの名無しさん:03/03/27 00:55
>>442==441なのか?
mutableが最も威力を発揮するような場面なら
使うのが吉かと。

445 :デフォルトの名無しさん:03/03/27 01:00
>>444
442=441=.... です。

確かに、素直に使うのが吉なような気はしますが、、、、
friendと同じように、禁止されるんでないかなーという
一抹の不安が。

446 :444:03/03/27 01:04
>>445

禁止されたら邪悪な方法を使え!

class AAA {
int a;
int* p;
public:
AAA() : a(0), p(&a) {}
void asd(int i) const { *p = i; }
};

素人さんにはお勧めでき(以下略


447 :444:03/03/27 01:08
いや、ま、
p = new int;
ってやれば邪悪でも何でもないんだけどね、、、

448 :デフォルトの名無しさん:03/03/27 01:32
んー、難しいですねぇ。
というか、
int* p => int const * const p;
という型に変換されないあたりが、なんか仕様的に嫌に思えてきました。

449 :デフォルトの名無しさん:03/03/27 05:33
C++ではvoid *は使わないんですか?(T.T)

450 :デフォルトの名無しさん:03/03/27 06:11
>>449
void *って何につかうの?
通常目的の型のポインタを使うと思いますが。

451 :デフォルトの名無しさん:03/03/27 07:01
> int* p => int const * const p;

int f( int* p )
{
 int const * const q = p;
 return *q;
}

変換できるぞ。

452 :デフォルトの名無しさん:03/03/27 07:01
friendやmutableに気をつけろってんならわかるが、
禁止までされてる場合の理由ってどうなってんですか?

453 :デフォルトの名無しさん:03/03/27 08:42
>>434
class Hoge {
public:
 hoge_t value() const {
  return GetHogeT();
 }

private:
 hoge_t& GetHogeT(void){
  static hoge_t tmp;
  return tmp;
 }
};

じゃだめなのか?
(メンバの変わりに常にGetHogeTを介して操作する)

454 :デフォルトの名無しさん:03/03/27 09:12
>>453
Hogeインスタンス複数作ってあぼーん

455 :デフォルトの名無しさん:03/03/27 09:17
>>434
そういう場合は
Hoge* pThis = const_cast<Hoge*>(this);
pThis->メンバ = 値
なんてするのがセオリーかな。

第2の選択肢として変更するメンバをmutable宣言する、ってのもある。
mutableは「決してconstではない」という意味で、全てのメンバ関数から
変更できてしまうので、今回の例では適切ではないだろう。

要約すると、概念的にはconstだが、メンバ変数の値を変更する必要がある場合
1.1部のメンバ関数でしか値を変更しない、または値の変更が例外的な場合は
  const_cast<Hoge*>(this) を使う。

2.それ以外、つまり多くの関数で値を変更する場合や値の変更が例外的でない
  場合は該当メンバ変数をmutable宣言する。

456 :デフォルトの名無しさん:03/03/27 10:20
volatileつけるとboolが呼ばれるみたいなんだけど
なぜなんでしょうか?

#include<iostream>
using namespace std;
void test(char*)
{
cout << "char*" << std::endl;
}
void test(bool)
{
cout << "bool" << std::endl;
}

int main()
{
test(static_cast<char*>("a")); //char*
test(static_cast<volatile char*>("a")); //bool
test(static_cast<const volatile char*>("a")); //bool
}

457 :デフォルトの名無しさん:03/03/27 10:37
>>456
引数を明示的にvolatile char*と宣言するとちゃんと呼び出されるので、
volatileを付けたことによりchar*とはマッチしなくなり、次にポインタが
暗黙的にboolに変換されたためと思われる。

void test(char*)
{
std::cout << "char*" << std::endl;
}
void test(bool)
{
std::cout << "bool" << std::endl;
}
void test(volatile char* p)
{
std::cout << "volatile char*" << std::endl;
}
void test(const volatile char* p)
{
std::cout << "const volatile char*" << std::endl;
}
int main()
{
test(static_cast<char*>("a")); //char*
test(static_cast<volatile char*>("a")); //volatile char*
test(static_cast<const volatile char*>("a")); //const volatile char*
}

458 :デフォルトの名無しさん:03/03/27 11:34
>>449
スレッドへの引数に使う。
Cでもいえることだが。

459 :456:03/03/27 12:14
C++は強く型付けされてるとよく聞くけど
暗黙的な変換に関しては
なんかしっくりこないことが多い気がする。

一般の関数で行われる標準変換も便利といえば便利だが、
ときには必要もない時もあるし、
動作を変更したいときだってあるはずだと思う。
となるとtemplateと関数オブジェクト使えってことになるわけだが、
それはそれで面倒な訳だが...。



460 :デフォルトの名無しさん:03/03/27 13:46
>>459
volatileが勝手に外れるのがしっくりくるのか?

461 :456:03/03/27 13:58
>>460
それもそうだねw

勝手にはずれて一見正常に動いてるように見える恐さと
見当違いなものが呼ばれてる恐さの攻めぎあい...。


462 :デフォルトの名無しさん:03/03/27 14:00
http://jsweb.muvc.net/index.html
★☆★☆★☆★☆★☆★☆★☆★☆

463 :デフォルトの名無しさん:03/03/27 14:13
struct X
{
 int f();
 int f() const;
 int f() volatile;
 int f() volatile const;
};
int f( X volatile const & x )
{
 return x.f();
}


464 :デフォルトの名無しさん:03/03/27 15:16
というか、そもそもbool<->intの変換とかtype*->boolの変換さえなけりゃ問題ないんだろうに。

465 :デフォルトの名無しさん:03/03/27 17:45
【フジテレビ】今夜9時〜10時54分
『FNS最高視聴率祭り国民のチャンスライン電話でもらえる1000万』
という番組が放送されるわけだが、この番組は解答者(ゲスト)が
クイズに答えるのだが、どの解答者がその問題を正解してるか視聴者が
スタジオに電話し答えるわけだ。そして、そこに2ちゃんねらーを出演させようじゃないか!
■手順■
1.番組中に公表される番号に電話する。
2.運良くつながる(つながらない場合は根気よくかけ直す)
3.司会者が「もしもし〜」などと切り替えしてくる。
4.大声で「オマエモナー」と叫ぶ。
5.あとは賞金ゲットのために頑張ってください。

※このレスを見かけたら、できれば5つ以上のスレに貼り付けてください。
【企画本部】
http://that.2ch.net/test/read.cgi/event/1048752014/l50

466 :デフォルトの名無しさん:03/03/27 22:32
extern "C"の使い方がよくわかりません。

たとえば、標準ライブラリでhoge.hというヘッダがあってもchogeがない場合は、

extern "C" {
 #include <hoge.h>
}

とするのでよいでしょうか?



467 :466:03/03/27 22:34
× 標準ライブラリ
○ 標準っぽいライブラリ

468 :デフォルトの名無しさん:03/03/27 22:36
>>466
extern "C" は主にC++の名前マングリングを防止するためにある。
Cで書かれたライブラリをリンクする場合はインポートする関数を
extern "C" で囲まないとリンカエラーになる。

469 :466:03/03/27 22:39
>>468
ありがとうございます。
そこまではわかるんですが、それで、>>466は正しいのでしょうか?
そういうコードを見たことがないので、不安になったのです。

470 :デフォルトの名無しさん:03/03/27 22:42
>>468
このドスケベ男め

471 :デフォルトの名無しさん:03/03/27 22:44
ヘッダをインクルードする時でなくて、ヘッダそのものに、

#ifndef __cplusplus
extern "C" {
#endif

// 本体をここに書いてある

#ifndef __cplusplus
}
#endif

としてあることが多いような。
されてないなら>>466のようにするしかない。

472 :デフォルトの名無しさん:03/03/27 22:46
ifndef でなくて ifdef でした。
すまん。

473 :466:03/03/27 22:47
>>471 >>472
ありがとうございます。
しかも即レスで。
このスレはレベルが高いので助かりますです。

474 :デフォルトの名無しさん:03/03/27 22:48
>>470
まんぐりんぐ違い

475 :デフォルトの名無しさん:03/03/27 23:06
( ´∀`)<ぬるぽリング

476 :デフォルトの名無しさん:03/03/28 05:05
まんぐろんぐ に いんぽーと か



ここは卑猥なインターネットですね!!!

477 :デフォルトの名無しさん:03/03/28 09:02
ろんぐ→りんぐ

(-_-)ウツダシノウ  ダンッ ──< ===E∩三⊂∀・ )

478 :デフォルトの名無しさん:03/03/28 11:30
クラスを引数とすると、そのクラスの新しいインスタンスを返すような
メソッド(いろいろなクラスのインスタンスを管理するクラスで)
を作る方法を教えてください。


479 :デフォルトの名無しさん:03/03/28 11:35
仮想関数を一つも持たないクラスAから派生クラスを作成する場合、
クラスAのデストラクタはvirtualでなければならないのでしょうか?

480 :デフォルトの名無しさん:03/03/28 11:42
>>478
意味が良くわからん



481 :デフォルトの名無しさん:03/03/28 11:42
>>479
class A{};
class B : public A{};
A *a=new B;
delete a;

とするようなことがあるのならvirtualにする必要がある

482 :478:03/03/28 12:02
わかりにくくてすみません。
こんな感じのものを作ってみました。
Factoryクラスがオブジェクトを管理しています。
クライアントがcreateメソッドを呼び出すと、
指定したインスタンスが得られます。
ifの羅列になってしまうのですが・・・

class Factory{
private:
 std::list<Object*> m_obj_list;
public:
 Object* create(const type_info& a_type){
  Object* nobj;
  if(a_type == typeid(Integer)){
   nobj = (Object*)new Integer;
  }else if(a_type == typeid(Symbol)){
   nobj = (Object*)new Symbol;
  }else{
   throw new UExceptionNotSupportType;
  }
  m_obj_list.push_back(nobj);
  return nobj;
 }
}


483 :デフォルトの名無しさん:03/03/28 12:06
>>482
まだいまいちよくわからないのだが

class Factory{
private:
 std::list<Object*> m_obj_list;
public:
template <class T>
 Object* create(){
  Object* nobj=new T;
  m_obj_list.push_back(nobj);
  return nobj;
 }
}
Factory f;
f.create<Integer>();

これじゃだめなのか? なんの役に立つんだこれ?

484 :478:03/03/28 12:54
>>483
なるほど。ありがとうございます。
インタプリタ作成中なんですが、オブジェクトの管理をする部分です。(GCとか)


485 :デフォルトの名無しさん:03/03/28 13:30
>>479
n個のクラス C0, C1, C2 〜 C(n-1)があり
クラスCm(1<=m<n)はクラスC(m-1)より派生しているとする
また、クラスCmのデストラクタはvirtual宣言されていないものとする

0 <= a < b < nのとき以下のポインタpaがあるとき
Ca* pa = new Cb;
delete pa; によって

C0のデストラクタがvirtualであるときは
クラスCbから継承ツリーを逆にたどりC0までのデストラクタが順に呼び出される
C0のデストラクタがvirtualでないときは
クラスCaのデストラクタのみ呼び出される

オブジェクトCx(0<=x<n)がデストラクトされるとき
デストラクタがvirtualであるときは
クラスCxから継承ツリーを逆にたどりC0までのデストラクタが順に呼び出される
デストラクタがvirtualでないときは
クラスCxのデストラクタのみ呼び出される


デストラクタを正しく呼び出したいのであれば、virtualを付けなければならない。


486 :479:03/03/28 14:03
>481 >485
まさしく481の例のようなことをしたかったわけです。
なるほど、よくわかりました。
ありがとうございました。

487 :デフォルトの名無しさん:03/03/28 16:28
>>484
関数をこうしたほうが使いやすいかな

template <class T>
T* create(){
  T* nobj=new T;
  m_obj_list.push_back(nobj);
  return nobj;
}


488 :デフォルトの名無しさん:03/03/28 16:59

std::string::c_str() は例外を出す可能性があるから、
きちんと例外処理したほうが良いというのは本当ですか?

489 :デフォルトの名無しさん:03/03/28 17:12
>>484のObjectって何?Javaかとおもっちゃった。

490 :デフォルトの名無しさん:03/03/28 19:14

const修飾子について教えて下さい。
やりたいことはMAX.cppのMAX_SIZEを1個変更する事で
すべてのクラスのMAXサイズを変更できるようにしたいのです。

[AAA.cpp]
extern const int MAX_SIZE ;

class AAA
{
chars[MAX_SIZE];
};

[BBB.cpp]
extern const int MAX_SIZE ;

class BBB
{
char s[MAX_SIZE] ;
};

[MAX.cpp]

const int MAX_SIZE=256 ;

んでこれらのソースをコンパイルすると
「定数式が必要です。」でエラーになります。
#defineを使う方法もあるのですがデバッガに
かけた時に変数名が消えてしまうのでやりたくないのです。
constとexternの使い方まちがってますか?
環境はVC++6です。

491 :デフォルトの名無しさん:03/03/28 19:20
C++だとconstは内部リンケージじゃなかったっけ?

492 :デフォルトの名無しさん:03/03/28 19:52
>>490
こりゃ無理だろ

[max.h]

const int MAX_SIZE=16; // or enum { MAX_SIZE = 16 };

[a.cpp]
#include "max.h"
class A { char chars[MAX_SIZE]; };

[b.cpp]
#include "max.h"
class B { char chars[MAX_SIZE]; };

これでどう?

493 :デフォルトの名無しさん:03/03/28 20:02
enum使え。

494 :デフォルトの名無しさん:03/03/28 20:09
class Hoge {
public:
 static int c;
};

int Hoge::c = 100;

int main () {
 Hoge *pHoge = NULL;
 cout << "c = " << pHoge->c << endl;
 return 0;
}

これ動くのだけれど保証されていますか。
お願いします。

495 :デフォルトの名無しさん:03/03/28 20:14
>>494
インスタンスのメンバには一切触れないから大丈夫だと思うが

すなおに
cout<<"c = "<<Hoge::c<<endl;
としてはだめなのですか?

496 :デフォルトの名無しさん:03/03/28 20:28
今日からC++始める。
図書館で独習C++第3版と
1000万人のコンピュータ科学1入門編気軽にプログラミング
っての借りてきた。
BCPadで作ってとGCCでコンパイルします。
よろしくお願いします



497 :デフォルトの名無しさん:03/03/28 21:26
>>496
いばらの道になるかもしれませんが、ガンガってください

498 :デフォルトの名無しさん:03/03/28 21:37
491さん
492さん
493さん

どうもありがとうございます。
コンパイル通りました。

const修飾された変数は、格ソース固有の持ち物
であって外部に見せる(公開)する事はできない。
よって、*.hにconst変数を記述し各々のソースに
取込んだとしても、各ソースにconst変数が確保
される。

と理解しましたが合ってますか?

s/格/各/


499 :デフォルトの名無しさん:03/03/28 23:44
VC++の質問もここでいいのかな??

MFCでアプリケーション作成しているのですが、midiを流す方法がわかりません。
DirectXの知識がないので、APIを使えばできるとか聞いたのですが。
まだWindowsプログラミングは初心者なものでどうしていいか・・・
アドバイスお願いします。


500 :デフォルトの名無しさん:03/03/28 23:57
>>499
スレッド一覧の検索ぐらいしようよ・・・

501 :デフォルトの名無しさん:03/03/28 23:58
だからスレ違いって言っちょるだろが!

502 :デフォルトの名無しさん:03/03/29 00:00
windows 用のソースで

class xxx
{
 public:

 union
 {

  struct
  {

   xxx xxx; // xxx は他のクラス
   float xxx;
  };

  struct
  {
   float xxx, xxx, xxx, xxx;
  };

  float xxx[4];

 };

 .
 .
 .
てのがありまして、これを linux の g++ でコンパイルすると、
struct の 所で、

503 :502:03/03/29 00:01
(つづき)

anonymous class type not used to declear any object
と言われます。それで struct の定義の後に とりあえず s1, s2 と名前を
つけたら、今度は、
member "struct quat::{anonymous union}::{anonymous} quat::{anonymous union}::s1" with
constructor not allowed in union と言われました。
それでさらに union に u1 と定義してみましたが、同じエラーになりました。
これってどうすれば通りますか?

504 :デフォルトの名無しさん:03/03/29 00:08
最近はじめったばっかりで"Hello world"からはじめてたんですけど。
インクルードファイル"stdio.h"が開けないってエラーでました。

#include<stdio.h>

main()
{
printf("Hello World\n");
}

初歩的すぎてごめんなさい。

505 :デフォルトの名無しさん:03/03/29 00:15
はいはい、ネタ質問は他所でどうぞ。

506 :デフォルトの名無しさん:03/03/29 00:15
>>504
これと
#include <stdio.h>
これの違い調べてみ
#include "stdio.h"
そしたらついでに分かるから


507 :504:03/03/29 00:26
>>506
わかりまつた。
やってみます


508 :504:03/03/29 00:48
お手上げでつ(´Д`;)

""は文字列・・・?
<>・・・?

509 :デフォルトの名無しさん:03/03/29 00:55
( ゚д゚)

リファレンス読むとかしないわけ?

510 :504:03/03/29 01:00
マジで初心者なんで。。。

なんかここにいるべき人間ではなさそうなので・・・逝ってきます・・。
でもやれるだけはガムバルつもりでつ。

511 :デフォルトの名無しさん:03/03/29 01:48
#include <iostream>で逝っとけ。もしくは
#include <iostream.h>

512 :デフォルトの名無しさん:03/03/29 04:07
>>504
ヘッダーファイルへのパスが通ってねーんだよ!ヴォケが。

513 :デフォルトの名無しさん:03/03/29 08:50
list201.cppのソース
#include<stdio.h>
#include<stdlib.h>
int main(int ac, char *av[])
{
int n;
printf("引数 %d 個\n", ac);
if(ac != 1){
n = atoi(av[1]);
printf("値 %d \n", n);
return n;
}
return 999;
}
list202.cppのソースが
#include<stdio.h>
#include<stdlib.h>
void main(int ac, char *av[])
{
int n;
if(ac != 1){
n = system(av[1]);
printf("戻り値 %d \n", n);
}
}
としたときに、list202 list201とコマンドを実行したとき
戻り値 999
と表示されるはずなのに
戻り値 0
となってしまいます。どうしてでしょうか?

514 :デフォルトの名無しさん:03/03/29 10:07
>>513
当然。system()は実行したコマンドの戻り値を返すわけではない。
「コマンドプロセッサ」の戻り値を返す。だからコマンドプロセッサが
正常に起動されたら0を返す。
それからとても激しく環境依存です。

515 :デフォルトの名無しさん:03/03/29 10:50
>>513
これはc++ではないですね。
--- a1.c ---
int main (int argc, char *argv[]) {
 if (argc != 1)
  return atoi (argv[1]);
 return 0;
}
--- a2.c ---
int main (int argc, char *argv[]) {
 if (argc != 1)
  printf ("%x\n", system (argv[1]));
 return 0;
}
のとき
./a2 './a1 0' ---> 0
./a2 './a1 -1' ---> ff00
./a2 './a1 3' ---> 300




516 :C++いちねんせい:03/03/29 15:38

コンストラクタのについて教えて下さい。
以下のソースをコンパイル&リンクすると
コンストラクタ(2)がリンク時に「 LNK1120: 外部参照 1 が未解決です。」
となり、リンクできないのですが何故なのでしょう?
コンストラクタ(2)の本体(という言い方でいいのかな?)をclass{ }
内に持っていくとリンクまで通ります。なんでかなぁ?

[aaa_class.hpp]
class aaa
{
public :
aaa() { cout << "コンストラクタ(1)が呼ばれた\n" ;}
aaa(int size,char *s) ;
};
[aaa_class.cpp]
aaa::aaa(int size,char *s)
{
cout << "コンストラクタ(2)が呼ばれた\n"
cout << size << '\n' ;
cout << s << '\n' ;
}
[main.cpp]
int main(int ac,char **av)
{
aaa d1;
aaa d2(10,"ABCDEFG") ;
}


517 :デフォルトの名無しさん:03/03/29 15:53
>>516
aaa_class.cppがコンパイルされてないとか

518 :デフォルトの名無しさん:03/03/29 16:52
>>516
一応、[aaa_class.cpp] と[aaa_class.hpp]に using namespace std; を書いておけ
うちではコンパイル通るぞ

519 :叩かれるかな、と思った496:03/03/29 18:40
>>497


520 :519:03/03/29 18:41
激しくミスった
「ありがとう」と書くつもりやったんやけどクソレスになるから
「やめる(C)」をクリックしようと思ったらそれが「書(ry

521 :デフォルトの名無しさん:03/03/29 19:59
パシャ パシャ  パシャ パシャ パシャ  パシャ パシャ パシャ パシャ パシャ
   パシャ パシャ パシャ パシャ パシャ  パシャ パシャ パシャ  パシャ  パシャ
 ∧_∧      ∧_∧     ∧_∧  ∧_∧    ∧_∧     ∧_∧
 (   )】      (   )】    (   )】 【(   )    【(   )    【(   )
 /  /┘ .   /  /┘.    /  /┘ └\ \   └\ \   └\ \
ノ ̄ゝ     ノ ̄ゝ      ノ ̄ゝ     ノ ̄ゝ    ノ ̄ゝ     ノ ̄ゝ

522 :デフォルトの名無しさん:03/03/30 00:38
メンバーが変数だけならstructを使いますか?

523 :デフォルトの名無しさん:03/03/30 01:12
>>522
というか全部のメンバを初めからpublic属性にしたい時にstructを
使うと楽。public: とタイプせずに済む。

524 :デフォルトの名無しさん:03/03/30 01:59
一時的にしか使用しないクラスって
new する意味ってあるの?

void func()
{
std::string str = "onigiriwassyoi";
puts(str.c_str());
}

void func()
{
std::string* str = new std::string("onigiriwassyoi");
puts(str->c_str());
delete str;
}

の違い。

525 :デフォルトの名無しさん:03/03/30 01:59
変数名の最初に
_つけちゃ駄目って聞いたけど何で?

526 :デフォルトの名無しさん:03/03/30 02:26
_で始まって大文字が続く識別子はC++の予約後
__で始まる識別子はC++の予約後
_で始まる識別子はCの予約後

いちいち説明するのが面倒なので
_で始まる識別子は使うなと言ってるだけ

変数名以外にも#define識別子とかにも使うなよ

527 :デフォルトの名無しさん:03/03/30 03:57
>>526
「処理系の実装者のために予約されている」だな。
ちなみに __ は始めだけじゃなくて、それを含む名前全部だったはず。

528 :デフォルトの名無しさん:03/03/30 04:09
先頭がアンダースコアになっている名前は、実装や実行時環境の特別な機能のために予約されているので、アプリケーションプログラムではそのような名前を定義しないようにすべきである。


禿げ第三版日本語版より。


529 :デフォルトの名無しさん:03/03/30 05:18
>>526-528
Σ(゚Д゚)
使いまくってた。

>禿げ第三版日本語版より。
って何の本?
詳細キボンヌ。

530 :デフォルトの名無しさん:03/03/30 05:41
>>529
禿げ = Bjarne Stroustrup
つまりはプログラミング言語C++第三版のこと。

531 :デフォルトの名無しさん:03/03/30 06:05
>>530
情報ありがとう。

7000円は、高すぎる。
EffectiveC++とC++FAQを買って
ある程度読んだ俺には
買う必要は、ありますか?

とりあえず、明日本屋で流し読みしてみる。

532 :デフォルトの名無しさん:03/03/30 06:13
>>530
ストラウストラップ先生を禿げと呼んでいるのか。
いいセンスだ。

533 :デフォルトの名無しさん:03/03/30 06:15
>>531
>>530ではないが、C++のバイブルなので、なにはなくとも
読むべきだとおもうが…

534 :デフォルトの名無しさん:03/03/30 06:51
漏れもK&RもC++も読んだことないなぁ
規格書はよく見るけど

535 :デフォルトの名無しさん:03/03/30 09:00
それはそれでイイ

536 :デフォルトの名無しさん:03/03/30 12:05
4人のギャングに騙されると、メンバに _ を付けてしまう罠
でも確かに m_ ってダサイよなぁ、とか思ったりも


537 :デフォルトの名無しさん:03/03/30 12:09
>>536
_を前につけるのはC/C++規格違反だから
後ろに付けるっていう案もあるが、すごい違和感あるよな

538 :536:03/03/30 12:14
>>537
後ろはあかんね。前が駄目なんで一時期やってたが、どうも合わない。

やっぱり最初(変数の)に情報が来ないと、認識しづらいのかな。人間って。

539 :デフォルトの名無しさん:03/03/30 12:26
>>538
そうか? 俺はもうメンバ変数の後ろにアンダーバーが無いと
なんか落ち着かないのだが

540 :デフォルトの名無しさん:03/03/30 12:26
_(([a-z])+[_A-Z]*)?
はC++で使ってもよいことになってたはず。
Cでは駄目だが

トニカク説明するのが面倒だから _で始まるのは駄目と
いうのは同意

後ろに_をつけるのは慣れた。


541 :デフォルトの名無しさん:03/03/30 12:27
なんかちょっと変。

_ 自身と _の次に英小文字か来るのはOKといいたかった

542 :デフォルトの名無しさん:03/03/30 13:44
_asm
__asm
もokなんですか?

543 :デフォルトの名無しさん:03/03/30 13:46
>>542

>>528 をよく読んでよく考えなさい

544 :デフォルトの名無しさん:03/03/30 14:09
542は>>540-541への返信

545 :デフォルトの名無しさん:03/03/30 14:13
後ろにアンダースコアを2つ付けてるYO。変数名・関数名にも普通に
アンダースコア使っているから1つだとどうにも目立たず。

546 :デフォルトの名無しさん:03/03/30 14:35
>>545
>>527

547 :デフォルトの名無しさん:03/03/30 14:41
>>545
うしろも駄目って事?「それを含む名前全部」てことだと n_files
みたいなのも駄目って意味にも取れるけど。

548 :547:03/03/30 14:44
って違うね。>>527氏の言ってるのは _ から始まっていたら _hoge_
こういうのはだめだって意味じゃない? hoge_ hoge__ は問題ないと
思うんだけど。

549 :デフォルトの名無しさん:03/03/30 14:47
>>547
[17.4.3.1.2]
Each name that contains a double underscore ("__")
or begins with an underscore followed by an uppercase letter (lex.key)
is reserved to the implementation for any use.

550 :547:03/03/30 14:57
>>549
引用さんくすです。なんだかややこしい規則だなあ・・・。つまり正確には
アンダースコア2個は前だろうと後ろだろうと駄目で、アンダースコアから
始まる場合は次の文字が大文字でなければいい、もしくは後ろにのみ付ける
分には問題ないということですか。

551 :デフォルトの名無しさん:03/03/30 14:57
ANSIの規則を書き換えると以下のようになる

規則1・アンスコで始まって、大文字またはアンスコが続く識別子は常に予約済み(全てのスコープ、全ての名名前空間で)
規則2・アンスコで始まる識別子はファイルスコープを持つ通常の識別し(関数、変数、typedef、列挙体定数)に対して予約済み

もし安全重視の側に立つのならアンスコで始まる名前を付けてはならない

しかし、次の例外を憶えて使っても良い
アンスコで始まって数字か小文字が続く識別子を構造体/共用体のメンバや、
関数・ブロック・プロトタイプスコープでつかっても良い

552 :デフォルトの名無しさん:03/03/30 15:03
つまりだ

int _a;//NG
void foo()
{
int _a;//OK
}

struct Foo
{
int _member;//OK
int _Member;//NG
};

553 :デフォルトの名無しさん:03/03/30 15:11
ずっと前から謎だったんだが、STLportの実装で使われている名前が全部
これらの「実装のために予約」された名前になっているのはどういうわけだ?

554 :547:03/03/30 15:15
なるほど、単純に _ の後に小文字が続けばいいというものでは
ないってことですね。勉強になりますた。てか本当ややこしいな・・・。
後ろにのみアンダースコアは1個てのは、うまく網目掻い潜ってる
というか、そこまでしてアンダースコアを使うか、というか(w

555 :デフォルトの名無しさん:03/03/30 15:17
>>553
おれが思うにコードをわざと読みにくくしてるのでは?

556 :デフォルトの名無しさん:03/03/30 15:18
単なる思い上がりでしょう。

557 :デフォルトの名無しさん:03/03/30 15:29
正しく動くこととパフォーマンスと実装(コンパイラ固有の問題)を重視してるから、
規格を遵守することはさほど優先じゃないだけだろ。


558 :デフォルトの名無しさん:03/03/30 15:33
STLの実装者は'実装のために予約された名前'を使う対象には入らないの?

559 :デフォルトの名無しさん:03/03/30 15:36
>>558
まだ早い もうちょっと待て

560 :デフォルトの名無しさん:03/03/30 15:42
>>558
それの答えがどうであれ、ローカル変数にまで予約された名前を使う理由にはならん。

561 :デフォルトの名無しさん:03/03/30 15:51
>>551
構造体がありなら、クラスもありって解釈でいいかな。
だとすると…メンバに使える!!!(*゚∀゚)=3

どうなんだろ…。

562 :デフォルトの名無しさん:03/03/30 15:53
>>561
ややこしい規格を持ち出さないと説明がつかなくなるからやめとけ。

563 :デフォルトの名無しさん:03/03/30 16:12
typedef enum _E { HOGE0, HOGE1, HOGE2 } E;
int foo( E e ) {
    return (int)e;
}
なんでこのコードが VC++ で通らないのか、やっと解ったよ

564 :デフォルトの名無しさん:03/03/30 16:13
なんで?

565 :デフォルトの名無しさん:03/03/30 16:15
>>561
安全重視の側に立った方がいい

566 :デフォルトの名無しさん:03/03/30 16:32
最近それを知って _ をメンバの後ろに付けるよう矯正しますた。
最初は気持ち悪かったけど一日で慣れてしまった……。

567 :デフォルトの名無しさん:03/03/30 16:38
>>563
typedef enum E { HOGE0, HOGE1, HOGE2 } E;
こう書けばいいのに・・・・


568 :デフォルトの名無しさん:03/03/30 16:40
enum E {...};だけでイイだろ?

569 :567:03/03/30 16:43
>>568
そうだ。ここC++スレだ。
Cならダメだだから。


570 :567:03/03/30 16:43
「だ」が一つ多いし(鬱

571 :デフォルトの名無しさん:03/03/30 16:56
>>567
Cって、列挙体のタグ名とtypedefのタイプ名ってかぶってもいいの?

>>568
うん、とりあえず、そんな風に修正したの。
「typedefとenum定義って同時にしちゃ駄目なのかなぁ。
 VC++のバグかなぁ」
って思いながら...(←痛すぎ)

あ、いや、もともとCのコードを移植したものだったし、

572 :デフォルトの名無しさん:03/03/30 16:58
>>571
列挙も構造体も共用体もOK


573 :デフォルトの名無しさん:03/03/30 17:26
>>524


574 :デフォルトの名無しさん:03/03/30 17:55
>>573
スタック、ヒープで検索。

575 :デフォルトの名無しさん:03/03/30 19:02
>>574
ヒープより、フリーストアのほうがいいかも。

576 :デフォルトの名無しさん:03/03/30 19:42
質問してもいいですか?

577 :デフォルトの名無しさん:03/03/30 19:44
質問していいか質問していいですか?

578 :デフォルトの名無しさん:03/03/30 20:10
質問して良いかの質問なんてしないでください

579 :デフォルトの名無しさん:03/03/30 21:07
返答しないでください

580 :デフォルトの名無しさん:03/03/30 21:21
>>576-578
チョトワラタ


581 :デフォルトの名無しさん:03/03/30 22:20
template<typename T> void template_function(T){}
struct {} global_instance_of_unnamed_struct;
void f()
{
    template_function(global_instance_of_unnamed_struct);
}

こいつがコンパイルできてしまうのはバグですか?

582 :デフォルトの名無しさん:03/03/30 22:22
>>581
何でバグなの?

583 :デフォルトの名無しさん:03/03/30 22:30
これか?
[14.3.1]
-2- A local type, a type with no linkage, an unnamed type
or a type compounded from any of these types shall not be
used as a template-argument for a template type-parameter.


584 :名無しさん:03/03/30 23:11
 

585 :デフォルトの名無しさん:03/03/30 23:18
>>582
&の右の項がないから。

586 :デフォルトの名無しさん:03/03/30 23:18
 

587 :デフォルトの名無しさん:03/03/30 23:21
>>585


588 :デフォルトの名無しさん:03/03/30 23:24
>>587
もっと具体的に言うと、
&nbspのあとに、;が無いから。

...は!もしかしてwindowsだとふつうにみえるのか...

589 :デフォルトの名無しさん:03/03/30 23:28
ん〜?どれどれ?
 
 

590 :デフォルトの名無しさん:03/03/30 23:29
なるほど、そうなのか。

591 :デフォルトの名無しさん:03/03/30 23:35
WindowsつーかIEだな<実体参照の;がなくてもとおる。

592 :デフォルトの名無しさん:03/03/31 00:47
 

593 :デフォルトの名無しさん:03/03/31 07:56
C++の関数からCの関数を呼ぶときは、プロトタイプの前後に
__cplusplusなんとかってのをつけとけばいいけど、
逆にCからC++の関数を呼ぶときはどうすればいいの?

594 :デフォルトの名無しさん:03/03/31 08:06
C++の修飾名でcallする。

595 :デフォルトの名無しさん:03/03/31 08:06
手を挙げればいい

596 :デフォルトの名無しさん:03/03/31 08:13
C++でコンパイルする。

597 :デフォルトの名無しさん:03/03/31 08:16
COM+/DCOM

598 :デフォルトの名無しさん:03/03/31 08:30
>>596
ヘッダとライブラリしかない場合は?
C++の就職名でcallか〜?

599 :デフォルトの名無しさん:03/03/31 08:34
#include <stdio.h>

char *nanashi[6]={"逝ってよし","(・ё・)クサー","来るな","あっちいけ","吊れ"};
void main()
{

int i;

for (i=1;6<=i;i++)
{
printf ("デフォルトの名無しさん %d",nanashi[i]);
};
};


600 :デフォルトの名無しさん:03/03/31 08:39
>>599
配列の範囲を超えてしまう。

601 :600:03/03/31 08:40
違う違う。
ループに一度も入らない。

602 :デフォルトの名無しさん:03/03/31 09:01
>>598
↓これでいける?

// cxx_tunnel.h
#if defined(__cplusplus)
extern "C" {
#endif
void c_func();
#if defined(__cplusplus)
}
#endif

// cxx_tunnel.cpp
#include "cxx_tunnel.h"
#include "cxx_lib.h"
void c_func(){ cxx_func(); }

// source.c
#include "cxx_tunnel.h"
void func(){ c_func(); }


603 :デフォルトの名無しさん:03/03/31 09:20
>>602
#ifdefにしろよ。

604 :デフォルトの名無しさん:03/03/31 11:30
>>603
#id defined() はANSI-Cから取り入れられた構文なので、
新しい人はこちらの方を好んで使う人もいる。

605 :デフォルトの名無しさん:03/03/31 12:08
正直、どうだっていい。

606 :デフォルトの名無しさん:03/03/31 13:28
つまらん間違いだけど
×#id defined()
○#if defined()

typoですた。

607 :Cスレの151:03/03/31 21:46
Cスレで質問していたのですが、こちらにも流れてきました…
http://pc2.2ch.net/test/read.cgi/tech/1048995232/151-

C++なら、構造体の宣言は
struct Foo;
ですむので、関数の宣言でも
struct Foo;
void func(Foo *f);
というぐあいに、(実体を書かずに)宣言だけですませることができます。
これでコンパイル依存が減って作業がはかどります。

これをCでやるにはどうすればいいのでしょうか?
typedef strct { /* ... */ } Foo;
といったぐあいに他のヘッダでFooを定義しているときに
他のヘッダで
extern typedef Foo;
void func(Foo *f);
とできるのでしょうか?

タグ名を使って
extern struct Foo_tag;
void func(struct Foo_tag *f);
と冗長(?)にするの?なんかやだなぁ


608 :デフォルトの名無しさん:03/03/31 21:50
>>607
なぜC++のスレでCの質問をするのでしょうか。


609 :Cスレの151:03/03/31 21:55
>>608
Cスレで質問したとき、どうも、コンパイル依存について
あまりふれられずに話が進んでしまっているようなので…

C++だったら、「Effective C++」の34項が
とても有名だと思うので、こちらでも質問させて
いただきました

これをC版のstructでするにはどうするのでしょうか?

610 :デフォルトの名無しさん:03/03/31 21:56
>>607
void foo(struct Foo *);

typedef struct Foo
{
int i;
} Foo;

void foo(struct Foo *f){}

はいどうですか?

611 :デフォルトの名無しさん:03/03/31 21:59
>>610
> void foo(struct Foo *);

Fooって何?そんなもの知らない。


612 :610:03/03/31 22:01
>>611
? 何いってるのかわかりません?

613 :デフォルトの名無しさん:03/03/31 22:03
>>612
Fooの定義をする前にFooという名前を使ってはいけないだろ。
それとも上にまだ何かあるのか?

614 :デフォルトの名無しさん:03/03/31 22:04
>>609
CでやるならCの流儀に従え
いやならやめろ

615 :デフォルトの名無しさん:03/03/31 22:07
>>613
いえ、上には何も無いですよ

void foo(struct Foo *);
でsturct Fooと書いてあるからFooは構造体の名前だということがわかるため
前宣言はいらないと思っていたのですが・・・ひょっとして駄目なのですか?

616 :610:03/03/31 22:08
ちなみにVC7ではコンパイルできます

617 :デフォルトの名無しさん:03/03/31 22:20
CでもC++でも関数引数内で型の定義は出来ない。
あらゆるユーザ定義型とユーザ定義型へのポインタ、参照は
それを別の宣言、定義で使用するまえに宣言しておかなければならない。

struct Foo;
void foo(struct Foo *);

で足りるんだからそうしとけ。

K&RでもARMでもなんでもいいから宣言と定義の項を悟りをひらくまで
読み続け呂。

618 :デフォルトの名無しさん:03/03/31 22:21
gccじゃどうやってもコンパイルできないが・・・

619 :610:03/03/31 22:25
>>617
読みました、駄目みたいですね。
VCでコンパイルできるもんだから勘違いしてました。

struct Foo;
void foo(struct Foo *);

typedef struct Foo { int i; } Foo;

void foo(struct Foo *f){}

じゃあ、これで

620 :Cスレの152:03/03/31 22:33
>>617

610さんと私で、ごちゃごちゃしてますが…(^^;

617さんは私におっしゃっているのでしょうか?

私は、宣言と定義について、勉強が足りないです。

614さんがCでやるならCの流儀で…とおっしゃってますが
やはりそうなのでしょうか…
タグ名を使うべきなような気がしてきました。
typedefはしない方が良さそうな…

621 :Cスレの151:03/03/31 22:35
>>620
Cスレの151です。名前をまちがえました

622 :デフォルトの名無しさん:03/03/31 22:40
>>620
Cなら素直にtypedef使え。

623 :sage:03/03/31 22:40
いい加減スレ違いだからおわり

typedef struct tagFoo Foo;
void foo(Foo *);


624 :デフォルトの名無しさん:03/03/31 22:41
冗長なexplicitって無害?

625 :sage:03/03/31 22:42
本当にexplicitにしたいものがどれだか分からなくなるのが問題なら、有害。


626 :Cスレの151:03/03/31 22:43
>>623
スレ違いが過ぎたようなので、終わります

たくさんアドバイスをしてくださって
どうもありがとうございました

627 :デフォルトの名無しさん:03/03/31 22:53
>>625
なるほど。
私は基本的に全部explicitにしたい派なので、その点については無問題です。
いままで引数を増やしたときはこまめにexplicitをはずしていましたが、
これからはつけっぱなしにしてみます。

628 :デフォルトの名無しさん:03/04/01 01:13
NULLを返す(ような)コンストラクタって作れますか?

A *a=new A();
if(a==NULL){
 puts("Aの作成に失敗");
}

ってなことをしたいのですが。

629 :sage:03/04/01 01:22
作れる。
昔はそんな感じだったがいまはstd::bad_allocを投げるのがお約束になってる。

例外じゃいかんのか?

630 :デフォルトの名無しさん:03/04/01 01:23
A *a=NULL; try{ a = new A(); }catch(...){}
if(a==NULL){
 puts("Aの作成に失敗");
}


631 :デフォルトの名無しさん:03/04/01 01:25
#include <new>
A *a=new(std::nothrow) A();
if(a==NULL){
 puts("Aの作成に失敗");
}


632 :sage:03/04/01 01:27
>>631ソレしらんかった hmm

633 :デフォルトの名無しさん:03/04/01 01:30
Aのコンストラクタがエラーになったときの処理とちがうんかいな?

634 :sage:03/04/01 01:37
だったら適切なfactoryを一個つくりゃいいんじゃないの?
無理にじかにnewしなくとも

635 :628:03/04/01 01:49
みなさん回答どうもありがとうございます。

>>629
作れるんですか?よろしければ作り方教えていただけると助かります。
コンストラクタに渡した引数の値がおかしいときとかに
newを失敗させるってことをしたいんです。
foo(new A()); みたいなこともしたいので、できれば例外処理は使いたくないです。

636 :628:03/04/01 02:08
factoryっていうのは

A *CreateA(){ ... }
A *a=CreateA();

こんなものでしょうか。(googleで調べたけどfactoryの意味わからんかったです)
これだとなんだか悔しいんですが。


637 :デフォルトの名無しさん:03/04/01 02:16
改行コードがLFCRCRのテキストファイルを
読み込みたいんですが、どういう方法がいいのでしょうか?

たとえばABC\n\r\rDEF\n\r\rというテキストファイルを
std::list<string>に改行コードなし文字列を
行ごとに格納していきたいのですが
getline()関数でデリミタ文字を\rを指定すると
前後にLFとCRが残ってしまいます。
やっぱりgetline()を使わず
1文字ずつ読み込むのが妥当ですかね?

638 :デフォルトの名無しさん:03/04/01 02:34
>>636
A* new_A() { try{ return new A(); }catch(...){ return 0; } }

foo(new_A());

うん。そっくり。

639 :デフォルトの名無しさん:03/04/01 03:09
>>637
std::getline()はデリミタに'\0'を指定して一度に全部読み込め。

int main()
{
std::stringstream file("\n\r\rabc\n\r\rdef\n\r\r");
std::string str;
std::list<std::string> ls;

std::getline(file, str, '\0');

while (true) {
std::string::size_type n = str.find_first_of("\n\r\r");
if (n == std::string::npos) break;
if (n) ls.push_back(str.substr(0, n));
str.erase(0, 3);
}
std::list<std::string>::const_iterator pos;
for (pos = ls.begin(); pos != ls.end(); ++pos)
std::cout << *pos << std::endl;
}

640 :デフォルトの名無しさん:03/04/01 03:14
>>639
ああこれやと行末に\n\r\rがないとおかしくなるなあ。直そ。

641 :デフォルトの名無しさん:03/04/01 03:19
こんなもんやないかな。

int main()
{
std::stringstream file("\n\r\rabcd\n\r\rdef\n\r\rghi");
std::string str;
std::list<std::string> ls;

std::getline(file, str, '\0');

while (true) {
if (str.length() == 0) break;
std::string::size_type n = str.find_first_of("\n\r\r");
if (n == std::string::npos) n = str.length();
if (n) ls.push_back(str.substr(0, n));
str.erase(0, n + 3);
}
std::list<std::string>::const_iterator pos;
for (pos = ls.begin(); pos != ls.end(); ++pos)
std::cout << *pos << std::endl;
}

642 :デフォルトの名無しさん:03/04/01 03:38
>>641
ありがとうございました
おかげで何とかなりそうです
自分のファイル入出力にくっつけて検証したいと思います

643 :デフォルトの名無しさん:03/04/01 03:44
>>641
find_first_ofでいいのか?

std::list<std::string> f( std::istream& source , const char delimiter[] )
{
std::string all;
std::getline( source , all , '\0' );
std::list<std::string> lines;
if( !all.empty() )
{
std::string::size_type pos = 0;
do {
const std::string::size_type start = pos;
pos = all.find( delimiter , start );
lines.push_back( all.substr( start , pos ) );
} while ( pos != std::string::npos );
}
return lines;
}


644 :643:03/04/01 04:03
自己申告。
>>643もダメ。

645 :デフォルトの名無しさん:03/04/01 04:13
こんなのはどうだろう
std::string str = "ABC\n\r\rDEF\n\r\rGHI\n\r\rJKL";
std::list<std::string> strlst;
std::string::size_type begpos = 0, endpos;

while ((endpos = str.find("\n\r\r", begpos)) != std::string::npos) {
 strlst.push_back(str.substr(begpos, endpos - begpos));
 begpos = endpos + 3;
}
if (begpos != str.length() - 1) {
 strlst.push_back(str.substr(begpos));
}


646 :637:03/04/01 04:19
void main()
{
std::ifstream stream;
char rBuffer[6555];
std::string str;
std::list<std::string> ls;

stream.rdbuf()->pubsetbuf(rBuffer, sizeof(rBuffer) / sizeof(char) );
stream.open("LFCRCR.txt", std::ios::in | std::ios::binary );

while (!stream.eof()) {
std::getline(stream, str, '\n');

std::string::size_type n = n = str.length();
if (n > 2)
ls.push_back(str.substr(2, n));
}

stream.close();

std::list<std::string>::const_iterator pos;
for (pos = ls.begin(); pos != ls.end(); ++pos)
std::cout << *pos << std::endl;
}

どうしても何百MBのテキストファイルを読み込むのに
毎行検索すると速度的に非常に遅くなるので
改行コードは必ずLFCRCRが来ると決めうちして
こんな感じに読み込むとそこそこ速度が出ました
急造なんで問題は多分ありますけど

647 :637:03/04/01 04:25
非常に危険をはらんだコードのような気もします
とりあえずお休みなさい
ありがとうございました

648 :デフォルトの名無しさん:03/04/01 06:47
std::istream& getline_for_637(std::istream& src, std::string& dst, const char* delimiter) {
std::istream::sentry k( src, true );
if( k ) {
dst.clear();
const char* comparing = delimiter;
for( std::istreambuf_iterator<char> cur(src), end ; cur != end && *comparing != '\0' ; ++cur ) {
const char c = *cur;
if( c == *comparing ) {
++comparing;
} else {
if( comparing != delimiter ) {
dst.insert( dst.end() , delimiter , comparing );
comparing = delimiter;
}
dst.push_back( c );
}
}
if( *comparing != '\0' ) {
src.setstate( std::ios::eofbit );
dst.insert( dst.end(), delimiter, comparing );
if( dst.empty() ) {
src.setstate( std::ios::failbit );
}
}
} else {
src.setstate( std::ios::failbit );
}
return src;
}


649 :デフォルトの名無しさん:03/04/01 11:52
>>643
スマソ。find_first_of()ではまずいやね。
Cで言うとstrcspn()やからね。
find()がstrstr()に該当するから、find_first_of()は使わないでくだされ。

650 :デフォルトの名無しさん:03/04/01 14:28
COleVariant に文字列をCHAR型の文字を代入するにはどうすればいいのですか?


651 :デフォルトの名無しさん:03/04/01 17:35
COleVariantて何ですか?

652 :デフォルトの名無しさん:03/04/01 19:23
質問お願いします。VC6では通る、以下のようなコードは
やはりSTLの実装依存になってしまうのでしょうか?
vectorは内部的に、その型の配列である…というのが保証されていると良いのですが…。

#include <vector>
#include <iostream>

void func( int* array, int num_array ){
 for(int i=0; i<num_array; ++i)
  std::cout << array[i] << std::endl;
}

int main(){
 std::vector<int>vec;
 vec.push_back(1);
 vec.push_back(777);
 vec.push_back(1000);
 func( &vec.at(0), vec.size() );
 return 0;
}

653 :デフォルトの名無しさん:03/04/01 19:40
>>652
BCCでも通りますが何か

654 :デフォルトの名無しさん:03/04/01 19:42
>>653
VC7では通らないんだよね。

655 :デフォルトの名無しさん:03/04/01 19:45
>>652
> func( &vec.at(0), vec.size() );

この方が、わかりやすいかと。(Effective STL 16項)
func( &vec[0], vec.size() );

656 :デフォルトの名無しさん:03/04/01 19:49
>>653 >>654
レスありがとうございます。やはり無理なんですね。

実際にはfuncの部分が、こちらではいじれないライブラリなので、
残念ながらvectorの使用を諦めなければになりそうです。

…また可変長配列手書きの時代に巻戻り…残念です。
それとも仕様が変わりそうにない、他のSTLを使えばいいのかな…。

657 :655:03/04/01 19:51
>>655じゃだめなのか? 自分で言うのも何だが。
VC++なんて、窓から投げ捨てろ!

658 :652=656:03/04/01 19:52
と、書いている間に…

>>655
や、本当だ。分かりやすいです。
というか…Effective STLに載っていると言うことは、
常套手段として認められているのでしょうか!

ちぃ、手元にその本がみつからず…これからちと探してきます。
これは期待です。有益な情報ありがとうございました。

659 :デフォルトの名無しさん:03/04/01 19:53
>>656
一番安全なのは、配列同様の配置を保証した、
偽vectorを自前で実装することでは。
で、必要なときはそのヘッダファイルを使い回すと。

660 :デフォルトの名無しさん:03/04/01 20:42
どうしてあそこまで実装にこだわった標準が「vectorの中身が配列」
というのを保証しなかったんだ?あと「stringはcopy-on-write
だからコピー・代入で例外を投げない」というも。
今更言ってもしょうがないけど。

661 :デフォルトの名無しさん:03/04/01 20:44
>>652
もうEffectiveSTLの該当する項を読んだりしてるかもシレンが、
最近の修正で、「&vec[i] == &vec[0] + i でなければならん」と
規格に定められた。ので、問題ないはず。既に世に出てるコンパイラで
こうなってないものも特に無いようだし。

662 :デフォルトの名無しさん:03/04/01 20:51
>>660
> stringはcopy-on-write だからコピー・代入で例外を投げない
vectorの方はともかく、こっちはCOWでない実装も相当たくさん
存在するのだが。特に独自にthread-safetyを保証しようとしたりすると。

663 :デフォルトの名無しさん:03/04/01 21:22
>>660 単に漏れただけ。


664 :658:03/04/01 21:27
>>659
仰るとおりで、先ほどまで私も、昔自作したtemplateを前にため息ついてました。
>>660
激しく同意です。その一文がこれまでにもあれば…。
>>661
うほっ!良い規格!いや素晴らしい情報です。修正入ったんですねぇ…。
嬉しすぎです。当方、もう二度と配列なんて定義しなそうな勢いです。

お礼が遅くなってすいません、20時にしまる書店へ裸足で飛び出したもので…
皆様レスありがとうございました。深く感謝です。

665 :デフォルトの名無しさん:03/04/02 04:38
定数をクラスの外部に見せずに
宣言する方法はないでしょうか?
例えば、

#include "Base.h"

const int BUFFERSIZE = 10;

class Derived : public Base
{
 Derived( int size = BUFFERSIZE );
 ~Derived();
 // 〜
};

と言う風に宣言したとき、もし"Base.h"でも
BUFFERSIZEと言う定数が同様に宣言されていたら
コンパイルエラーになってしまいます。

includeするヘッダファイルにすでに同名の
定数が宣言されているかどうかを調べて、
衝突しない名前を考えるのが面倒なので、
同名の定数を宣言できる方法があれば
うれしいのですが、そんな方法はないでしょうか?

666 :デフォルトの名無しさん:03/04/02 04:50
クラス内に書く

667 :sage:03/04/02 06:59
整数型なら"enumハック"でぐぐれ

668 : ◆hMJAPH9PWA :03/04/02 11:39
>>665
namespaceを使えばいいのでは。

669 :デフォルトの名無しさん:03/04/02 14:27
                \ │ /
                 / ̄\   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
               ─( ゚∀゚  )< ぬるぽぬるぽぬるぽ!!
                 \_/   \_________
                / │ \
                    ∩ ∧ ∧  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\∩ ∧ ∧ \( ゚∀゚ )< ぬるぽぬるぽぬるぽ!!
ぬるぽぬるぽ!!   >(゚∀゚ )/ |    / \__________
________/ |    〈 |   |
              / /\_」 / /\」
               ̄     / /


670 :デフォルトの名無しさん:03/04/02 14:29
namespaceって何だっけ?

671 :デフォルトの名無しさん:03/04/02 15:04
>>670
入門書読め。

672 :デフォルトの名無しさん:03/04/02 15:13
usingって何だっけ?

673 :665:03/04/02 15:14
>>666
クラス内に書くと、純粋仮想関数の記述が間違っている、
といったエラーになってしまいます。(VC++にて)

>>667
なるほど。enumでうまくいきますね。
整数型という限定がありますが。

>>668
"namespace"で検索してみました。
こんな便利な仕組みがあったんですね。
(わたしがC++の勉強に使った書籍には
namespaceの説明はありませんでした)
これだと整数型以外でも使えますね。

ありがとうございました。

674 :デフォルトの名無しさん:03/04/02 16:16
cl.exe は static const を純粋仮想関数とかほざいて
受け付けてくれないからねえ・・・

675 :デフォルトの名無しさん:03/04/02 16:17
そんな古い本は窓から投げ捨てなさい。

676 :デフォルトの名無しさん:03/04/02 16:22
VC++7だとうまくイったな。

677 :デフォルトの名無しさん:03/04/02 19:15
ANSI以前のC++にはなんの価値もないからなあ。
CにはK&Rみたいなのがあるけど、C++にはそういった
ものがない。古い本は焚書だよ。

678 :デフォルトの名無しさん:03/04/02 21:25
テンポラリーな int のアドレスって作れますか?

void foooooo( int* pi ){}

foooooo( &int( 0 ) );

みたいな。
実際には上のコードはエラーが出ます。

679 :デフォルトの名無しさん:03/04/02 21:27
C:広辞苑
C++:現代用語の基礎知識

680 :デフォルトの名無しさん:03/04/02 22:42
>>678
struct Int
{
int i;
int *operator&(){ return &i; }
};

void foo(int *){}

foo(&Int());

注意事項 絶対に使うな!

681 :デフォルトの名無しさん:03/04/02 23:08
早い話、山椒で受け取るようにすればいいわけで・・・

682 :デフォルトの名無しさん:03/04/02 23:12
>>678
なぜこんなことをする必要がある

683 :デフォルトの名無しさん:03/04/02 23:28
あ、わかった。Win32のReadFileやWriteFileで使いたいんだな?

684 :デフォルトの名無しさん:03/04/03 00:57
int i = 5;
my_cout << i
で、
i = 5 ってやりたいんですが(つまりi=を書く手間を省略したい)いい方法って無いですか?


685 :デフォルトの名無しさん:03/04/03 00:59
my_cout << 5

686 :デフォルトの名無しさん:03/04/03 06:53
>>684
シンボル名は実行時には通常取得できないので
Cスタイルマクロ使うしかない。
#define NAME_AND_VAL(a) (#a << " = " << (a))
とか定義して
my_cout << NAME_AND_VAL(i);
とか。

687 :デフォルトの名無しさん:03/04/03 10:07
struct A{
 virtual void hoge() = 0{ }
};

これってVC6で通るんだけど、正しい構文なんですか?
規格には、
virtual void hoge(){} = 0;
は駄目ってあって確かにこれは駄目だけど・・・

688 :デフォルトの名無しさん:03/04/03 11:50
>>687
通常は抽象基底クラスの関数は外部で宣言しないとエラーになる。
また抽象基底クラスの自体は直接インスタンスを生成できないだけで、
間接的に継承された子クラスから呼び出すことはできる。

#include <iostream>

struct A {
virtual void func() = 0;
};

void A::func() { std::cout << "A::func()" << std::endl; }

struct B : public A {
void func() { std::cout << "B::func()" << std::endl; }
void func2() { A::func(); }
};

int main()
{
B* b = new B;

b->func();
b->func2();

delete b;
}

689 :678:03/04/03 13:30

foooooo( int* ) は自作関数ではないので、
受け取りを書き換える事は出来ません。

struct, class で wrap するつもりはありません。
どうやらテンポラリーは無理みたいなので諦めました。

どうもありがとう

class Int
{

public:
   Int( int i ){ m_int = i; }

private:
   int m_int;

public:
   operator int() const { return m_int; }

};

foooooo( &Int( 0 ) );
foooooo( &Int( 1 ) );
foooooo( &Int( 2 ) );
foooooo( &Int( 3 ) );


690 :sage:03/04/03 14:12
>>689
よくわからんが

int x;
foooooo(&(x=0));
foooooo(&(x=1));
foooooo(&(x=2));
foooooo(&(x=3));

じゃだめなのか?

691 :デフォルトの名無しさん:03/04/03 14:22
>>688
ありがとうございます。純粋仮想関数でも定義できるんですね。
こうしておくと、あるクラスでの仮想関数オーバーライドにおいて、
(直下の)基底クラスの仮想関数が純粋かどうか気にする必要がなくなりますね。


692 :デフォルトの名無しさん:03/04/03 19:37
auto_ptrの一時オブジェクトって、どうやってコピーしているの?
例えば
auto_ptr<int> foo() {
  auto_ptr<int> ap;
  return ap;
}
void bar() {
  auto_ptr<int> ap2 = foo(); // *1
}
という場合、gcc3.2で試してみると、fooの戻り値の一時オブジェクトを
auto_ptr_refに変換して、それからap2のコンストラクタを呼んでいる
ようなんだけど、これって暗黙のユーザー定義変換を2回実行している
ことにならない?*1の行が
  auto_ptr<int> ap2(foo());
なら分かるんだけど。

693 :デフォルトの名無しさん:03/04/03 22:28
暗黙の型変換はauto_ptrからauto_ptr_refの1回だろ?

694 :692:03/04/03 22:43
>>693
auto_ptr_refからauto_ptrへの変換も暗黙の型変換だと思うけど。
struct hoge {};
struct moge {
  moge();
  moge(const hoge &) {};
};
struct fuga {
  fuga();
  fuga(const moge &) {};
};
int main() {
  fuga f = hoge();
  return 0;
}
ってやったらエラーになる。

695 :デフォルトの名無しさん:03/04/03 23:05
>>692
>auto_ptr<int> ap2 = foo();
>auto_ptr<int> ap2(foo());

これらは同じ意味

696 :デフォルトの名無しさん:03/04/03 23:08
>>695 ダウト

697 :デフォルトの名無しさん:03/04/03 23:09
「ヘキサゴン」て言おうよ

698 :デフォルトの名無しさん:03/04/04 00:28
>>696
おれも同じだと思ってた。違うの?

699 :sage:03/04/04 00:46
上はデフォルトコンストラクタのあとで代入演算子のオペレータ(があれば)を呼び出す。
下はパラメータ付きコンストラクタを呼び出す。

ほとんどの場合において求める動作と結果が同じなので、
上の書き方がされていたとき、下と同じ処理をしてもよいと、規定されてる。

同じ動作を意図して書かれる場合もあるが、デフォルトコンストラクタの
処理コストが大きい場合には、同じ動作にならずに困ることもある。

700 :693:03/04/04 00:55
>>692
やっとみつけた。

えー、まずは、
T x = a; // copy-initialization
T x(a); // direct-initialization
と呼ぶそうだ。

[8.5 -14-]
If the initialization is direct-initialization, or if it is copy-initialization
where the cv-unqualified version of the source type is the same class as,
or a derived class of, the class of the destination, constructors are considered.

ってことで、direct-initializationか、またはcopy-initializationで
且つ初期化する型が初期化子の型とcv修辞子を除いて同じ場合
コンストラクタによる初期化を検討する、ってことらしい。

「初期化する型が初期化子の型とcv修辞子を除いて同じ場合」のみ、
copy-initializationとdirect-initializationは同じ意味になる。

auto_ptrの場合は、auto_ptr_refからの変換コンストラクタを、
auto_ptrからauto_ptr_refへのユーザー定義変換1回で
呼び出すことができるので、これで決定となる。

お、>>698もこれで解決?

最近規格書漁りが多いなぁ。

701 :デフォルトの名無しさん:03/04/04 00:58
何だか explicit らへんの話も分からなくなってきた。

>auto_ptr<int> ap2 = foo();
これは
>auto_ptr<int> ap2(foo());
これの書き方を変えただけのものだと思ってたんですが、そうでは
ないということでしょうか。

702 :デフォルトの名無しさん:03/04/04 00:59
>>699
1行目が激しく間違っているようだが。

703 :700:03/04/04 01:00
>「初期化する型が初期化子の型とcv修辞子を除いて同じ場合」のみ、
>copy-initializationとdirect-initializationは同じ意味になる。
ああなるほど。

704 :703=701:03/04/04 01:01
700はおれじゃなかった。

705 :デフォルトの名無しさん:03/04/04 02:06
Drectxを使ってフルスクリーンモードで描写しながら
DialogWindowを表示したいのですが
どのようにすればよいでしょか?

706 :デフォルトの名無しさん:03/04/04 02:08
DirectXって何ですか?DialogWindowって何ですか?

707 :デフォルトの名無しさん:03/04/04 02:15
間違えました。
DirectX
Dialog box
でした。

708 :4:03/04/04 02:27
>>108
んー。調べてみます。
入力を見せないで、入力されたものを吐くプログラムをつくって
それをpipeで繋いでうまくできるかもしれません。

709 :707:03/04/04 02:35
他板で教えてもらえました。
迷惑かけてすんませんでした。

710 :デフォルトの名無しさん:03/04/04 03:40
Standard C++ Library クラスリファレンス
http://www-scc.tokyo.jst.go.jp/riyou/users/users_guide/ucoma/FJcompiler/C++/stdlib/stdref/
この間からつながらなくなった。どっかに移動した?

711 :710:03/04/04 03:54
Solaris のが生きてた。
ttp://www.mmm.muroran-it.ac.jp/guide/unix/C++/stdlib/stdref/

712 :デフォルトの名無しさん:03/04/04 04:19
Exceptional C++で質問です。
項目22のBasicProtocolって言うクラス作る必要あるんですか?
解答ではメンバにしろって書いてあるみたいですが。
関数だけのクラスならクラスにくくらず関数だけ書いて、
Protocol1、Protocol2で呼べばいいと思いますが?


713 :sage:03/04/04 07:12
もっと易しい本から嫁

714 :デフォルトの名無しさん:03/04/04 08:47
>>712
そのクラスが関数だけである、とどこに書いてある?
追加のメンバがあるかもしれないが云々...とは書いてあるが。

仮に全部フリー関数だけだったとしても、MessageHelperオブジェクトと
いう一つの実体としてくくる設計はアリだろう。

715 :デフォルトの名無しさん:03/04/04 12:50
すいません引越し直後でネットがつながらないので携帯から失礼します
コードのコの字も分からない人間ですがC++を始めたいと思います
今書店にいるのですが教本が多過ぎてどれが良いのか分かりません
まず一冊これを買えという定番があれば教えて頂けないでしょうか

716 :デフォルトの名無しさん:03/04/04 12:56
>>715
>コードのコの字も分からない人間ですがC++を始めたいと思います

あー、そう。
君は晴比古の本でいいよ。

717 :デフォルトの名無しさん:03/04/04 13:00
宣伝発見

718 :デフォルトの名無しさん:03/04/04 13:00
>>716
ありがとうございます
探してみます

719 :デフォルトの名無しさん:03/04/04 13:01
>>716は晴比古

720 :デフォルトの名無しさん:03/04/04 14:22
>>715
オライリーシリーズをお薦め

721 :デフォルトの名無しさん:03/04/04 15:03
>>715
日経ソフトウェアのムック『ゼロから学ぶC++』とかは?
あと『独習C++』とか

722 :デフォルトの名無しさん:03/04/04 15:21
>>720-721
なるほど
晴比古という方の本がまだ見つからないので
合わせて探しに新宿に行ってきます
ありがとうございます

723 :デフォルトの名無しさん:03/04/04 15:23
iostreamで、ディスクエラーなどでI/O自体が失敗した時は、
どういう振る舞いになるのですか?eof?bad?

724 :デフォルトの名無しさん:03/04/04 17:12
>>722
マジにとるなよ。
晴比古というのはダメな参考書を書いている人だから
絶対に買うな。あと三田とか岩谷とかも避けるように。

725 :デフォルトの名無しさん:03/04/04 17:30
晴比古本でも、「新C++言語入門シニア編(上・下)」は、
最新の ANSI C++ の規格にそって書いてあるから、
他の入門書よりもずいぶんマシだと思うが。
初心者には最適だと思うぞ。
~~~~~~~

ビギナー編はダメダメだが。


726 :デフォルトの名無しさん:03/04/04 18:03
C++いきなりやる香具師は必ず失敗する。
C++やるには、アセンブラ・Pascal・C必ず一通り齧らなければ
モノにならんでしょ。
C#なら、いきなりこれから初めても大丈夫みたいだけど。
大した違いは無いような感じだけど意外な差があるのが言葉の世界

727 :デフォルトの名無しさん:03/04/04 18:11
いやいや、別に良ーんでないの?

728 :デフォルトの名無しさん:03/04/04 21:27
ポインタをdeleteした後にはNULLを代入した方がいいのですか?
なぜですか?

729 :デフォルトの名無しさん:03/04/04 21:31
>>728
0を代入しておくと、間違ってdeleteしても無視されるから。

730 :デフォルトの名無しさん:03/04/04 21:32
そのせいで間違ってdeleteしているバグが隠蔽される。

731 :デフォルトの名無しさん:03/04/04 21:33
ありがとうございます。
じゃ、デストラクタの中などでdeleteする時はほっといてもいいんですね。

732 :デフォルトの名無しさん:03/04/04 21:37
あの〜スミマセン!!
MassageBoxの出し方教えて下さい。
ガッコウの兄貴に指示されました。
コニチワ、マッサージボックスで出せなさいと。
どうすればいい?


733 :sage:03/04/04 21:40
std::cout << "MessageBox";

734 :デフォルトの名無しさん:03/04/04 21:43
#define MassageBox MessageBox

735 :デフォルトの名無しさん:03/04/04 21:44
>>732

www::google << "MessageBox";

736 :デフォルトの名無しさん:03/04/04 21:44
732はマルチです。

737 :デフォルトの名無しさん:03/04/04 21:49
いくら必死でもマルチはいかんな。
それとも釣りかな。

738 :デフォルトの名無しさん:03/04/04 21:54
すみません質問してもよろしいでしょうか?

CSVファイルを読み込む
      ↓
中の値を全て2倍にする
      ↓
処理した値をCSVファイルとして出力

というプログラムをC++で組みたいと
考えているのですが、どのような
アルゴリズムを使用すればよいか、
ヒントでもよいので回答していただけないでしょうか?

739 :いつでもどこでも太郎さん:03/04/04 21:55
すみません。初心者です。
C++で、一定時間ごとに、画面をキャプチャするなんていうアプリを作れるのでしょうか?

740 :デフォルトの名無しさん:03/04/04 21:55
2倍するところは、2を掛ければよさそうだな

741 :デフォルトの名無しさん:03/04/04 21:56
初心者はまずできることからやろうよ。

742 :デフォルトの名無しさん:03/04/04 22:19
掛け算は「×」でなく「*」、、と。

743 :デフォルトの名無しさん:03/04/04 22:20
>>739
最近マルチ多いな

744 :デフォルトの名無しさん:03/04/04 22:21
C++のこんな感じのサイトありますか?
http://java.sun.com/j2se/1.4/ja/docs/ja/api/index-files/index-1.html

745 :デフォルトの名無しさん:03/04/04 22:22
なんでテンキーには「*」がないんですか?

746 :デフォルトの名無しさん:03/04/04 22:23
>>744
いくらでもある。

747 :デフォルトの名無しさん:03/04/04 22:35
>>745
残念だが私のテンキーにはある

748 :デフォルトの名無しさん:03/04/04 22:46
>>747
いや、ないはずだ。よく見ろ。

749 :デフォルトの名無しさん:03/04/04 22:48
ほんとだ。
若干形が違った。


750 :744:03/04/04 23:03
>>746
レスありがとうございます。
アドレスを教えてくださいませんでしょうか?

751 :デフォルトの名無しさん:03/04/04 23:23
>>713 例えばどんな本がいいですか?

>>714 読み落としていました。有難うございます。
> 仮に全部フリー関数だけだったとしても、MessageHelperオブジェクトと
> いう一つの実体としてくくる設計はアリだろう。
アリだというのは分かりますが、実際こういう設計ってあるんですか?
インスタンスを作るとメモリが消費されると思うのですが間違いでしょうか?
外部関数として使うのに対して、クラスにしてインスタンスを作成してから使う場合の
メリットってなんですか?

752 :デフォルトの名無しさん:03/04/04 23:32
>>750
URLのことをアドレスと言ってるようではレスがつかない。

753 :デフォルトの名無しさん:03/04/04 23:41
携帯のURL教えて〜

754 :744:03/04/04 23:56
>>752
釣りかと思うが釣られてみる。

ttp://www-6.ibm.com/jp/domino04/pc/support/beginner.nsf/fb8e1a8a5749032f49256a1d00097a28/af49d8cf505a17db49256a2a00286780?OpenDocument
【日本語】 URL (ユー・アール・エル)
【英語】 URL ( Uniform Resource Locator の略)
インターネットに接続されているコンピューター上のサービスを利用するために指定する住所のようなも のです。 アドレスとも言います。

なんかつかれた。春休み早くおわらねーかな。

755 :デフォルトの名無しさん:03/04/05 00:09
イラク戦争の中継を見ながらこう書いてしまったことはありませんか―――
vector v;
v.bush_back(0);

756 :デフォルトの名無しさん:03/04/05 00:59
ややウケタw

757 :デフォルトの名無しさん:03/04/05 11:12
お願いします。コンパイルできません。
% g++ --version
egcs-2.91.66
です。

ostream& operator<< (ostream& out,
const vector<int, allocator<int> >& v)
{
copy(v.begin(),v.end(),ostream_iterator<int,char,char_traits< char > >(out," "));
return out;
}

http://www.mmm.muroran-it.ac.jp/guide/unix/C++/stdlib/stdref/vec_0251.htm#Example



758 :デフォルトの名無しさん:03/04/05 11:18
>>757
デフォルトのアロケータをサポートしない処理系でSTLを使うのは
一種のチャレンジだ。

759 :デフォルトの名無しさん:03/04/05 11:39
>>758
そこのところは書き換えました。

解決しました。

760 :sage:03/04/05 13:20
>>751
クラスの静的メンバを使う場合、そのクラスのインスタンスを生成しなくても利用できるよ。
設計時に関数の固まりをオブジェクトとしてとらえたかどうかでクラスにするか、
namespaceで囲むだけにするか、それともただの大域関数にするかを決めればいい。


761 :デフォルトの名無しさん:03/04/05 17:19
関数の引数として、クラスオブジェクトのポインタ渡しと参照渡しで、
何か違いってあるのですか?


762 :sage:03/04/05 17:51
参照渡しで受け取る場合ぬるぽが来る心配がない。

763 :sage:03/04/05 17:54
ポインタ渡しだと、基底クラスのポインタを渡せる。
つまり多態を使うときはこっち。

764 :デフォルトの名無しさん:03/04/05 17:58
参照渡しでもぬるぽは来る(…と言っても、そんなもん渡すんじゃねぇ!と
いう意思表示としては使えるが…)し多態も出来ますが。

765 :デフォルトの名無しさん:03/04/05 18:07
>>764
同意。
参照を選ぶときは、ぬるぽを考慮していないという意思表示に使ってます。

766 :デフォルトの名無しさん:03/04/05 19:36
僕も 0 を渡したときにしかるべき動作をする、
って仕様ならポインタ、そうでなければ全て参照渡しにしてます。

とくに const T& hoge ってのは慣用句みたいなものなので
覚えておきましょう。

767 :デフォルトの名無しさん:03/04/05 21:08
>763
参照でもポリモできるでしょ?

768 :デフォルトの名無しさん:03/04/05 23:32
ねーねー、C++って何ができるの?ゲームでも作れるの?

769 :デフォルトの名無しさん:03/04/05 23:41
C++は、言語です。

770 :デフォルトの名無しさん:03/04/05 23:43
>>769 うん。だから?

771 :デフォルトの名無しさん:03/04/05 23:46
「日本語って何ができるの?」って聞いてるようなもんだ。

772 :デフォルトの名無しさん:03/04/05 23:52
>>770 にも何かができるような言語は、
今後永遠に生まれることがないはずです。

773 :デフォルトの名無しさん:03/04/06 01:18
delete NULL;
を実行したとき、処理時間を奪われる以外の
作用がないことは言語仕様として定められて
いるのでしょうか?

if ( p != NULL ) delete p;
は、
delete p;
に置き換えても全く問題はないのでしょうか?

774 :デフォルトの名無しさん:03/04/06 01:21
ない

775 :デフォルトの名無しさん:03/04/06 01:23
>>774 ありがとうございます。

776 :デフォルトの名無しさん:03/04/06 01:30
delete p;
p = NULL;

としないと危ないと思われ。

777 :デフォルトの名無しさん:03/04/06 01:32
NULLなんてc++にはありませんが何か?

778 :デフォルトの名無しさん:03/04/06 01:36
>>776
別に危なくはないと思われ。

779 :デフォルトの名無しさん:03/04/06 01:40
>>776
auto_ptr使っとけ。

780 :デフォルトの名無しさん:03/04/06 03:08
>>776
それってよく見かけるけど
俺はdelete p;した後pを使うようなコードを書いた事が無い。
メモリの解放はなんらかのスマートポインタにやらせる。
明示的にdeleteを呼び出す事は滅多に無い。

そもそもp = 0;しなきゃ危ないコード
(例えばpを複数回deleteする可能性があるとか)
を書くのが問題なんじゃないのか?


781 :デフォルトの名無しさん:03/04/06 03:23
778-780 には同意できるが、777 には首をかしげる。

782 :デフォルトの名無しさん:03/04/06 03:48
#include <cstddef>

783 :デフォルトの名無しさん:03/04/06 08:46
>>781
首をかしげるだけなら誰にでもできるね。

784 :デフォルトの名無しさん:03/04/06 12:09
Javaのserialize(deserialize)みたいに、動的にオブジェクトのクラスを
発見するにはどうすればよいですか?

785 :デフォルトの名無しさん:03/04/06 12:36
>>783
普通そう思うよな?
ところが

786 :デフォルトの名無しさん:03/04/06 13:46
VC++ の std::runtime_error や std::logic_error が、
文字列を std::string で保存しているのを知って驚いた。

787 :デフォルトの名無しさん:03/04/06 13:51
>>784
プログラムが自分で管理する

788 :デフォルトの名無しさん:03/04/06 13:52
×プログラムが自分で管理する
○プログラマが自分で管理する


789 :デフォルトの名無しさん:03/04/06 16:04
>>784
intも全部クラスにしてクラスのタイプを返すメンバ関数をオーバーライドする

790 :デフォルトの名無しさん:03/04/06 18:13
#include <stdio.h>
void main()
{
  for (int i = 0; i < 1000; i++)
    ;
  printf("%d", i);
}

上のコード、BCBなら通らないけど、VC++なら通ってiの値が表示されるのですが、
どっちが正しいのでしょう?

791 :デフォルトの名無しさん:03/04/06 18:19
激しくスマソ、テンプレたどったら分かりました。
スレ汚してすみませんでした。

792 :デフォルトの名無しさん:03/04/06 18:24
どうわかったのかも書いてくれるとわかりやすい

793 :791=790:03/04/06 18:41
C&C++FAQ の 「for文の( )内で宣言された識別子の有効範囲はどうなっていますか。」を見ると、
for文のカッコ内で宣言された変数は、そのfor文内のみ有効だと書いてあった。
だから、790のコードを通さない方が正しい。
VC++も結構いい加減なんですね。

794 :デフォルトの名無しさん:03/04/06 18:45
>>793
そのように、どう解決したか書いてくれるとそれが妥当かどうかの検証ができる。

VCは6だとしたら、いいかげんなのではなく当時はそれで良かった。
規格はその後だからね。
(あってるかな?)

795 :791=790:03/04/06 19:14
>>7994
今度から気をつけます。
規格が決まったのは最近なんですか。
いやぁ、猫でも(ryを読んでて、790でコンパイルが通るような事が書いてあって、
あれっおかしいな?と思ってBCBで確かめてみたんだけど、
気になったので、VC++でも試したところ余計に分からなくなって・・・。
ちなみにVC++.NETです・・・。

796 :デフォルトの名無しさん:03/04/06 19:18
>>795
C++の規格は98年。VC6はそれよりちょっと前か?

797 :デフォルトの名無しさん:03/04/06 19:24
>>790-795
> (あってるかな?)

合ってないよ。
規格がどうのこうの言うんなら、「Microsoft 言語拡張機能」を Off してから議論しろや。

798 :デフォルトの名無しさん:03/04/06 19:41
>>795
同じく 98 年、ただし stdC++ よりも数ヶ月リリースが早かった。

799 :798:03/04/06 19:41
796 宛てですた。

800 :デフォルトの名無しさん:03/04/06 20:35
>>787
とうとう自己管理プログラム言語が完成したか。

801 :デフォルトの名無しさん:03/04/06 20:36
>>798
それならVC++6.0が標準規格に準拠していなくてもおかしくないんじゃない。

802 :デフォルトの名無しさん:03/04/06 21:02
VC6が出た時期なんてたいした問題じゃない。
VC6に含まれている大量のコードはそれ以前にかかれたもの。

803 :デフォルトの名無しさん:03/04/06 21:11
>>793
「for文内部」だと { } も含まないのかな?
() だけ?

有効範囲じゃなくても、スコープから外れるわけじゃないのかね?



804 :名無しさん@Emacs:03/04/06 21:23
いい加減、VC6は捨てろ。
古臭いMuleを使ってるのを見ると吐き気がする、
それと同じだ。

805 :デフォルトの名無しさん:03/04/06 21:28
エディタとコンパイラを同一視している奴がいるな(w

806 :AGENT-GC:03/04/06 21:41
Visual Studio .NET でC++できるんすか?

807 :デフォルトの名無しさん:03/04/06 21:44
MuleでC++はできません。

808 :デフォルトの名無しさん:03/04/06 21:45
>>806 マルチすんな

809 :AGENT-GC:03/04/06 21:48
やっぱVisualBasicC++っすよね?
C++するにはボーランドとマイクロソフトどっちがいいっすか?

810 :デフォルトの名無しさん:03/04/06 21:51
うるさい

811 :デフォルトの名無しさん:03/04/06 21:52
>VisualBasicC++
落ち着け

812 :名無しさん@Emacs:03/04/06 21:57
>>805
ハァ?馬鹿かおまいは?
新しいコンパイラぐらい買えっつーいみだボケ

813 :デフォルトの名無しさん:03/04/06 22:20
デストラクタは明示的には呼び出せない、と聞いて試したのですが、
普通の関数みたく呼び出すことができました。
ただしインスタンスは生きたままで、その後普通に他の関数をコールできました。
こういうものなんでしょうか?

あと、C++が起動、実行時にどのようなメモリの取り方をするのかが、
よくわかるようなサイト等はないでしょうか?
先輩が、インスタンスとは、クラスが必要とするメモリをmallocで取得してるようなもの &
C++は起動時に、リンクしているヘッダで宣言されてる全てのインスタンス分のメモリを取る
と言ってたのですが・・・するとそれらは全てヒープ領域に取られると言うことですか?

どなたか詳しい方お願いします。

814 :デフォルトの名無しさん:03/04/06 22:35
>>813
正直何が聞きたいのか良くわからん

815 :デフォルトの名無しさん:03/04/06 22:38
>>813
ヒープ領域はnewでオブジェクトを作成したとき
だけじゃないですかね?

newの実装とかは俺も知りたいけど、解説している
サイトは知らないなぁ。



816 :デフォルトの名無しさん:03/04/06 22:38
デストラクタは明示的に呼び出せる。
その後インスタンスはたまたま生きてるかも知れないが、
いつ何が起きてもおかしくないのでやらないように。

ヘッダで宣言されている「インスタンス」なんてあったっけ・・・?
あ、std::cin, std::cout, etc. があるか・・・ってそりゃ「定義」だが。

そりゃ、ヘッダでスタックに置いたならスタックに、
ヒープに置いたならヒープに取られるに決まってる。

何か話がかみ合ってない気もする。

817 :sage:03/04/06 22:39
>>813
allocatorに関して調べるとよろし


818 :デフォルトの名無しさん:03/04/06 22:43
>何か話がかみ合ってない気もする。

すんません、C++初心者なもので。
例えば、ヘッダに
class test1 {
・・・
};
class test2 {
・・・
test1 tst;
・・・
};
とか書いた場合、tstはいつ、どこに領域が取られるんでしょうか?



819 :デフォルトの名無しさん:03/04/06 22:48
VCのnewはmallocを使ってるけど

820 :デフォルトの名無しさん:03/04/06 22:51
>>818
そのヘッダをインクルードしたソースファイルごとにできる

821 :デフォルトの名無しさん:03/04/06 22:52
>>818
Test2をスッタクにおいた場合はtstもスッタクに。
タイミングはTest2の構築時とほぼ同じと思うが、それが正解なのかどうかはわからん。。

822 :sage:03/04/06 22:53
>>818
宣言と定義について書いてある本をさがして読むように。

スタックにとる場合は関数やメソッドの中で。たとえば
int foo() { test2 foo; }

起動時に静的な領域に取るなら関数の外で
test2 foo;
もしくはクラスの静的メンバとして
class zoo { static test2 foo; };
test2 zoo::foo;

ヒープに動的に取る場合は
関数やメソッドの中で
test2 *pfoo = new test2;


823 :デフォルトの名無しさん:03/04/06 23:00
>>818
それだけなら、領域は取られない。
どっかで、インスタンスを生成した時に領域が確保される。

test2 test_on_static; // (1)

void foo()
{
 test2 test_on_stack; // (2)
 test2 *test_on_heap = new test2; // (3)
 ...
}

(1) は、プログラム実行前に静敵領域に領域が確保されてて、main() の実行前にコンストラクタが呼ばれる。
(2) は、関数 foo() の入ってきた時にスタック上に領域が確保され、そのあとコンストラクタが呼ばれる。
(3) は、この文が実行された時にヒープ上に領域が確保されて、そのあとコンストラクタが呼ばれる。

>>820
一体何がソースファイル毎にできるんだ ?
もう少しちゃんと勉強しろよ。

>>821
スッタクって、アンタ...。

824 :デフォルトの名無しさん:03/04/06 23:02
書き方でスタックに取るかヒープに取るかなんて決まっていない。

825 :デフォルトの名無しさん:03/04/06 23:39
スッタク萌え

826 :デフォルトの名無しさん:03/04/06 23:55
皆さんありがとうございます。

>>823
(1) は、プログラム実行前に静敵領域に領域が確保されてて、main() の実行前にコンストラクタが呼ばれる。

(1)の場合、明示的にデストラクタを実行はできるんでしょうか?
静的領域にあることは別に問題とはならないのでしょうか?

>>816
デストラクタは明示的に呼び出せるとのことですが、BohYohのFaqに、
明示的に呼び出すことはできませんとありました。
実際のところどうなんでしょうか。

827 :デフォルトの名無しさん:03/04/06 23:59
unsigned char buf[sizeof(T)];
T* p = new (buf) T(); // これであってるかな?placement new
p->~T();

828 :デフォルトの名無しさん:03/04/07 00:09
>>827
あってるけど、間違ってる

829 :デフォルトの名無しさん:03/04/07 00:12
>>826
>デストラクタは明示的に呼び出せるとのことですが、BohYohのFaqに、
>明示的に呼び出すことはできませんとありました。

そのfaqを読み間違えてるのではないか?

830 :デフォルトの名無しさん:03/04/07 00:29
>>826
ISO/IEC 14882(C++の仕様書)の12.4.12辺りには、
「明示的にデストラクタを呼ぶときには〜」
という旨の記述があるので、できます。
各コンパイラの実装が状況はともかく、仕様上は。

ttp://www.bohyoh.com/CandCPP/FAQ/FAQ00095.html
BohYohのFAQ(↑)は読み間違いようはないけど、間違ってるね。
古い仕様に基づいているのか、仕様をあたらず特定の実装で確かめただけなのか。
何れにせよよろしくないです。

831 :デフォルトの名無しさん:03/04/07 00:38
なるほど、わかりました。仕様書まで調べていただいて感謝です。

皆さんありがとうございました。m(__)m

832 :デフォルトの名無しさん:03/04/07 00:43
 ま た 「 仕 様 書 」 か ・ ・ ・ 

833 :デフォルトの名無しさん:03/04/07 01:00
だって一番正確なんだもん。
$18ぐらい大した額じゃないっしょ。

834 :デフォルトの名無しさん:03/04/07 01:06
>>826
> (1)の場合、明示的にデストラクタを実行はできるんでしょうか?
> 静的領域にあることは別に問題とはならないのでしょうか?

実行はできるけど、実行結果は保証されないよ。
(暗黙のデストラクタ呼び出しを禁止できないから、2重にデストラクタが呼び出されれてしまうからね。)

> デストラクタは明示的に呼び出せるとのことですが、BohYohのFaqに、
> 明示的に呼び出すことはできませんとありました。
> 実際のところどうなんでしょうか。

呼び出すこと自体はできる。
ただし、暗黙にデストラクタを呼ばないようにする責任はプログラマにあるよ。
ほとんど、>>827 のケースしかないと思う。

835 :デフォルトの名無しさん:03/04/07 01:35
>>833
"Standard" ←→ 「規格」
"Specification" ←→ 「仕様」

どっちでもいいのかなぁ?

836 :デフォルトの名無しさん:03/04/07 01:37
標準書でいいじゃん

837 :デフォルトの名無しさん:03/04/07 19:41
ofstream fo;
fo.open(filename);

この場合、無いファイルは作られるのでしょうか?
よろしくお願いします。

838 :デフォルトの名無しさん:03/04/07 21:33
>>826
あれを使うのは、mallocやallocatorで取って来た、未初期化の
生のメモリを扱いたい時、たとえばコンテナを自分で実装したい
時くらいかなあ。いずれにしても、アラインメントやら例外安全
やら、面倒な問題がいっぱいあるから、C,C++のメモリの扱いを
完全に把握してから使うべし。

839 :デフォルトの名無しさん:03/04/07 22:22
C++って基礎が大事?今文字を出力したりするコード書いてるんだけど、こんなの役に立つかなぁ・・・
と思いまして。

840 :デフォルトの名無しさん:03/04/07 22:37
>>839
プログラミングにおいては、例え、ただ文字を出力するだけのコードであっても
コードを書いて慣れることに何らかの意味があると思ふ。

841 :デフォルトの名無しさん:03/04/07 22:46
何事も基礎は大切

842 :デフォルトの名無しさん:03/04/07 22:47
>>840 ありがとう。それを聞いてやる気が出ました。
     っつーわけで今「if文」を勉強中。

843 :デフォルトの名無しさん:03/04/07 23:06
>>837
std::ofstream のデフォルトは std::ios::out だから、ファイルがあっても
内容を空にする。なければ新規作成する。

844 :デフォルトの名無しさん:03/04/07 23:26
超初心者で申し訳ない。
int main() で始めるとき、intしかつかえないんですか?





845 :デフォルトの名無しさん:03/04/07 23:48
>>844
質問の意味が良く分からない

mainの戻り値はintにするしかないが

846 :デフォルトの名無しさん:03/04/07 23:49
>>844
確実なのはstringにしたら落ちるという事だ。

847 :デフォルトの名無しさん:03/04/07 23:53
デーモンとか作るときは void じゃね?

848 :デフォルトの名無しさん:03/04/08 00:18
>>844
int以外で返して、その後どうしようとしてるの?

849 :837:03/04/08 00:30
>>843
レスありがとうございました。わかりました。
あと、一行目の理由がわかるように精進します。

850 :デフォルトの名無しさん:03/04/08 17:25
以下のようなクラスAのvectorをソートしたいのですが、ソートの基準は文字列なんです。
このときの叙述関数はどのように書けばいいのでしょうか?
Cの標準関数で文字列の比較をぐぐってみたのですがstrcmpしか引っかからず、もちろんこの関数はつかえません。

class A {
char label[20];
int value;
// :
};

void foo(void)
{
vector<A> vec;
// :
sort(vec.begin(), vec.end(), cmp);
}
bool cmp(const A& a, const B& b)
{
return (a.label < b.label); // <-----ここの書き方が?
}

851 :デフォルトの名無しさん:03/04/08 17:31
>>850
なぜstrcmpが使えないのか500文字以内で述べよ。

852 :デフォルトの名無しさん:03/04/08 17:38
そもそもcmp()の第二引数の型がおかしいわけだが。
20文字以下ということならstrncmp()とか、memcmp()とか。

853 :デフォルトの名無しさん:03/04/08 17:41
>>852
ABC\0DEFGのような文字列がありうるからmemcmpはありえないと思うが。

854 :850:03/04/08 17:45
>851
すいません。
strcmpの仕様の勉強不足でした。
申し訳ありませんでした。

855 :デフォルトの名無しさん:03/04/09 01:44
switch と if〜elseif〜else って何が違うんですか?


856 :デフォルトの名無しさん:03/04/09 02:03
>>855
分岐先の数が違う。
switch : 多方向分岐
if : 2方向分岐

ついでに藻前の質問はスレ違い。

857 :デフォルトの名無しさん:03/04/09 02:06
switch は if と比べて、条件を簡潔に書ける/フォールスルーができる/コンパイラが
最適化しやすいという利点と、複雑な条件を書けないというデメリットがある。

858 :デフォルトの名無しさん:03/04/09 16:33
>>846
普通おちることはないだろ。逆なら、おちることはありうるが。

>>856
> 分岐先の数が違う。

ハァ ? if〜 else if 〜 else 〜 だぞ。
        ~~~~~~~
ついでに、なんでスレ違いなのか聞きたいもんだ。

859 :デフォルトの名無しさん:03/04/09 16:55
>>858
わかるように書け。

860 :デフォルトの名無しさん:03/04/09 17:19
>>858
結局2分岐を繰り返しているだけじゃん

861 :デフォルトの名無しさん:03/04/09 17:59
>>858
まあC言語と共有する問題はC言語スレのほうが相応しいのではないかとは思うが

862 :855:03/04/09 18:52
>>861 俺のC++参考書に載ってたんですが・・・。
すれ違いならごめんね。

863 :デフォルトの名無しさん:03/04/09 19:12
そりゃ載ってるだろう

864 :デフォルトの名無しさん:03/04/09 22:44
アカデミック買ったんだけど何やったらいいのかな

865 :デフォルトの名無しさん:03/04/09 22:49
みんな最初は2chブラウザを作って一人前になったんだよ。

866 :デフォルトの名無しさん:03/04/09 23:13
とりあえずHello,world!!やっとけ。
何それって聞くなよ。わからなかったらお前は才能がないと言う事だ。

867 :デフォルトの名無しさん:03/04/10 01:51
>>866
人間関係クラスタが気の利いた台詞を発言することを提唱。

868 :デフォルトの名無しさん:03/04/10 02:02
>>867
ZOEなのか、EVAなのか、それともそれ以外なのか、そこが問題だ。

869 :デフォルトの名無しさん:03/04/10 09:23
(´-`).。oO(ハロワ・・・)

870 :デフォルトの名無しさん:03/04/10 18:18
俺は、新しい言語を覚えるときは
とりあえずヒットアンドブローを作る。

871 :デフォルトの名無しさん:03/04/10 19:29
>>864
とりあえず、Kanimiso128を作ってくれ

872 :デフォルトの名無しさん:03/04/10 19:37
質問です。
ファイルAにある関数内から、別のファイルBに定義したクラスのメンバー関数を使うにはどうしたらよいのでしょうか?
変数や関数は、extern宣言しますが、クラスの場合もそうですか?

873 :デフォルトの名無しさん:03/04/10 19:45
自分はC言語を勉強した人間です。
C++とVC++を勉強したいのですが、
お奨めの書籍等ありましたらどうかご教授ください。

874 :デフォルトの名無しさん:03/04/10 19:48
>>873
>>4 とMSDN


875 :デフォルトの名無しさん:03/04/10 19:51
>>874
お手数掛けました。

876 :デフォルトの名無しさん:03/04/10 19:52
>>872
ヘッダファイルにクラスの定義を書いて、

877 :855:03/04/10 20:02
無限ループになるとどうなっちゃうんですか?
パソコンがフリーズしそうで試せません。

878 :デフォルトの名無しさん:03/04/10 20:18
>>872
クラスについて基本から勉強することを(略

879 :デフォルトの名無しさん:03/04/10 20:21
>>872
クラスも型なので変数と同じあつかいでいいです。


880 :デフォルトの名無しさん:03/04/10 20:22
>>877
普通のOSならフリズらないよ

881 :デフォルトの名無しさん:03/04/10 20:43
>>880 普通のOS・・・・
    友人を引っ掛けて試して見ます。

882 :872:03/04/10 21:34
>>876,878,879
レスありがとうございます。
エラーが出なくなっても、デバッガでお目当ての関数内を
トレースできなかった(なぜかスルー)ので質問させていただきました。
またよろしくお願いします。では。

883 :デフォルトの名無しさん:03/04/10 21:37
無限ループ
while(1){
cout << "\t\b\b";
}


884 :デフォルトの名無しさん:03/04/10 21:49
>>883
OSがWindowsXPだと落ちます。

885 :デフォルトの名無しさん:03/04/10 22:06
>>884 ま、まじで・・・・?
    注意します。

886 :デフォルトの名無しさん:03/04/10 23:43
質問です。
構造体の中身をゼロで初期したい場合。
struct Hoge_t{
int a,b,c;
};
memset( &Hoge_t,0,sizeof(Hoge_t) );
で 大丈夫ですよね。
それで たとえば、 構造体を public なクラスとして扱う場合に、
struct CHoge{
int a,b,c;
Hoge_t(){};
~Hoge_t(){};
};
memsetで ゼロで埋めても大丈夫でしょうか?また、メモリ確保を
malloc で とる場合(まぁ new を使えばいいんでしょうが)
CHoge = malloc( sizeof(CHoge) ); と sizeof を使用して確保しても大丈夫でしょうか?






887 :デフォルトの名無しさん:03/04/10 23:48
>>886
おとなしく初期化を使いましょう。
CHoge() : a(0), b(0), c(0) ....
malloc()使うとコンストラクタを呼び出してくれないのでやめましょう。

888 :デフォルトの名無しさん:03/04/11 01:14
クラスをクラス化したクラスをください。スクリプトにつかうので。

889 :デフォルトの名無しさん:03/04/11 01:18
Ruby では一応クラスもクラスだぞ。

890 :デフォルトの名無しさん:03/04/11 01:41
ゲーム用のスクリプトなのでRUBYではダメです
なければintとcharを駆使しますが

891 :デフォルトの名無しさん:03/04/11 01:46
状況がヨクワカラン。

892 :デフォルトの名無しさん:03/04/11 10:40
クラスオブジェクトは関数の引数として、ポインタで渡してもいいんですよね。
参照とどう違うんですかね?


893 :デフォルトの名無しさん:03/04/11 11:09
「参照 ポインタ 引数 違い」これくらいでぐぐればいいようだが。

894 :デフォルトの名無しさん:03/04/11 18:06
C++にクラスオブジェクトなんてないんだが。
たぶんクラスのインスタンスであるところの
オブジェクトのことだろうけどさ。

895 :デフォルトの名無しさん:03/04/11 19:14
>>886
コンストラクタ、デストラクタの中身がない場合なら
OK。ただし、「中身」には、メンバ変数の初期化の
ために暗黙に生成されるコードも含まれるので
注意。だから、intやらconst char *だけの構造体
でなく、std::stringみたいのを含んでいたらアウト。
あと、たまーにポインタをmemsetで潰してもNULL
ポインタにならないプラットフォームがあるので注意。

896 :デフォルトの名無しさん:03/04/11 21:23
memsetよりもこの方がいくない?
 static CHoge zero;
 *this = zero;


897 :デフォルトの名無しさん:03/04/11 23:35
>>886への解答で
仮想関数があったら駄目

という、教えが出てないのはどういうことですか?

898 :デフォルトの名無しさん:03/04/11 23:50
>>897
>>887で話は終わっている。

899 :デフォルトの名無しさん:03/04/12 03:08
ポインタのほうがすき。


900 :デフォルトの名無しさん:03/04/12 13:51
キリンさんのほうがもっと好き。

901 :デフォルトの名無しさん:03/04/12 14:00
俺のゾウさんが好きなんだろう。オラオラ

902 :デフォルトの名無しさん:03/04/12 14:19
これで象?ネズミの尻尾の間違いじゃないの

903 :デフォルトの名無しさん:03/04/12 14:23
チンポ何センチ級?俺は18〜19センチ級だと思うんだけど。

904 :デフォルトの名無しさん:03/04/12 15:49
長さに級とかつけないで・・・。ミリまでちゃんとしる。

905 :デフォルトの名無しさん:03/04/12 17:47
18.0〜19.999999999..............センチの範囲内と言うことだろうか?


906 :デフォルトの名無しさん:03/04/12 17:56
ずいぶん誤差の大きいものさしだな

907 :デフォルトの名無しさん:03/04/12 18:27
doubleで示せる20.0に一番近くて20.0未満の数字ってなんだろう。


908 :デフォルトの名無しさん:03/04/12 18:27
>>907
バイナリサーチ白

909 :デフォルトの名無しさん:03/04/12 19:26
>>907
機械イプシロンを調べればわかるかも。

910 :デフォルトの名無しさん:03/04/12 19:37
>>907
19.999999999999996

911 :デフォルトの名無しさん:03/04/12 19:39
グレト!!

912 :デフォルトの名無しさん:03/04/12 21:20
C++の基本的な部分を抑えた人が作るプログラムって何?

913 :デフォルトの名無しさん:03/04/12 21:21
>>912
Hello, world!

914 :デフォルトの名無しさん:03/04/12 21:31
>>913 それはなんだすか?

915 :デフォルトの名無しさん:03/04/12 22:13
>>914
挨拶です

916 :デフォルトの名無しさん:03/04/12 22:20
>>915 そりゃまた随分グローバルな挨拶ですね。

917 :デフォルトの名無しさん:03/04/12 22:33
>>916
返す言葉もありません。

918 :デフォルトの名無しさん:03/04/12 23:05
、、、

919 :デフォルトの名無しさん:03/04/12 23:07
             /ヽ       /ヽ
            / ヽ      / ヽ
  ______ /U ヽ___/  ヽ
  | ____ /   U    :::::::::::U:\
  | |       // ___   \  ::::::::::::::|
  | |       |  |   |     U :::::::::::::|
  | |      .|U |   |      ::::::U::::|   なにこのスレ・・・
  | |       | ├―-┤ U.....:::::::::::::::::::/
  | |____ ヽ     .....:::::::::::::::::::::::<
  └___/ ̄ ̄      :::::::::::::::::::::::::|
  |\    |           :::::::::::::::::::::::|
  \ \  \___      ::::::

920 :デフォルトの名無しさん:03/04/12 23:13
お勧めの解説本おしえてくらさい。
入門編からポインタ位までを扱った初歩的な奴、定番を教えてください。
条件は日本語で書かれてることです。

921 :デフォルトの名無しさん:03/04/12 23:15
>>920
俺の書いた本を読むか?

922 :デフォルトの名無しさん:03/04/12 23:18
>>912-919
チョトワラタ


923 :デフォルトの名無しさん:03/04/12 23:20
●●● Hello worldって死滅しちゃうの??? ●●●

924 :920:03/04/12 23:22
>>921
なんていう本でしょうか?

925 :デフォルトの名無しさん:03/04/12 23:23
>>924
10日でわかるC++ 第二版

926 :920:03/04/12 23:38
>>925
見つからない。(´・ω・`)
「標準C++の基礎知識」「標準講座C++ ― 基礎からSTLを利用したプログラミングまで」
買います。

927 :デフォルトの名無しさん:03/04/12 23:41
VisualC++3週間完全マスター

928 :デフォルトの名無しさん:03/04/12 23:58
俺は「詳説C++」と「Effective STL」で乗り切れてる

929 :デフォルトの名無しさん:03/04/13 00:02
ポインタ完全制覇を鼻で笑って流し読みできればアプリ製作でポインタに困ることはほとんどない

930 :デフォルトの名無しさん:03/04/13 00:22
コンパイラーのコンパイルエラーメッセージで十分だろ。
そういう問題じゃなくて?

931 :デフォルトの名無しさん:03/04/13 00:26
初心者はエラーを出すまでが長い

932 :デフォルトの名無しさん:03/04/13 00:27
HogeClass Hoge;
HogeClass *pHoge;
pHoge = &Hoge;
delete pHoge;
  :
  :
Hoge.Func(); // 何か処理。

ってやったら、やっぱまずいですよね。
実行時の影響ってどんなのがありますか?

933 :デフォルトの名無しさん:03/04/13 00:29
>>932
うわぁそりゃひどい。
影響とかそんなレベルじゃない。
未定義動作へ突入。

934 :デフォルトの名無しさん:03/04/13 00:30
なぜnewで得たものでない領域をdeleteしようとする。


935 :デフォルトの名無しさん:03/04/13 00:35
>>932
Hogeはヒープには存在しないから、危険です。

936 :デフォルトの名無しさん:03/04/13 00:37
>>932
未定義動作はシステムを不安定にする。
任意の小さな変更(たとえば、セミコロンを挿入する、プログラムを別の曜日に実行する、Enterキーを押し下げる前に微笑み方を変えるなど)によって
システムがどのように振舞うか(あるいは、どのように間違った振る舞いをするのか)といった大きな事象が変わってしまうかもしれない。
プログラムがファイルを削除することもあるだろうし、間違った答えが返ってくるだけかもしれない。
場合によってはまったく正常に動くかもしれない!

937 :デフォルトの名無しさん:03/04/13 00:54
struct Test
{
    void Func() {}
};
int
main()
{
    Test* t = 0;
    t->Func();
    return 0;
}

未定義ですか?
gccでやってみたら、何も起きなかったが…

938 :デフォルトの名無しさん:03/04/13 00:56
VC++だったら落ちるよ。

939 :デフォルトの名無しさん:03/04/13 00:58
public:書くのが面倒だからってstructにするなよ。

940 :デフォルトの名無しさん:03/04/13 00:58
   ( ・∀・)   | | ガッ 
  と    )    | |
    Y /ノ    人
     / )    <  >_∧∩
   _/し' //. V`Д´)/ ← >>937
  (_フ彡        /

941 :デフォルトの名無しさん:03/04/13 01:00
>>932
C++の基礎から勉強汁

942 :デフォルトの名無しさん:03/04/13 01:01
>>938
ウソは書かないように。落ちませんでしたが。

Test::Func() が非仮想メンバ関数、かつ、メンバへの参照がないので、
thisへの参照はおこなわれることがないよね。
VCの実装上も、そうなっているようです。

しかし、もしTestが多重継承だったら、勿論、話は違ってきます。


943 :937:03/04/13 01:01
ああ、これが噂のぬるぽか。よくわかりますた。
ありがとうございました。

944 :デフォルトの名無しさん:03/04/13 01:02
>>938
VC++で試したが落ちない。つーかこれは落ちなくてもフシギではない。
Func()が仮想関数だったらまず落ちるが。

これを利用したテクニックもある。

struct Foo
{
void Func()
{
if(!this)//NULLだったら処理しない。
return;

}
};

ただ、これを勧めている訳ではもちろんない。

945 :デフォルトの名無しさん:03/04/13 01:04
でも未定義なのは確かか?それとも規格上も安全?

946 :デフォルトの名無しさん:03/04/13 01:05
>>938
BCCでもOK

947 :デフォルトの名無しさん:03/04/13 01:08
VC++5.0なら落ちたが。

948 :デフォルトの名無しさん:03/04/13 01:10
#include <iostream>
using namespace std;

class Test {
public:
void Func(){ cout << "(゚∀゚)アヒャ" << endl; };
};

int main()
{
Test* t = 0;
t->Func();
return 0;
}

BCCでテスト。
「警告 't'に代入した値は使われていない」ってのが出たが、通った。

949 :デフォルトの名無しさん:03/04/13 01:12
通ったってコンパイルが?そりゃ通るだろ。

950 :デフォルトの名無しさん:03/04/13 01:16
>>949
いや、実行もできた。

951 :デフォルトの名無しさん:03/04/13 01:20
ぬるぽに決まってる!って思ってたら本当に実行できてしまった罠。

952 :デフォルトの名無しさん:03/04/13 01:24
>>950
それで、そのコードが実行できたってことでなにが主張したいの?

953 :デフォルトの名無しさん:03/04/13 01:26
>>952
動作するか検証しただけですが、何か問題でも?

954 :デフォルトの名無しさん:03/04/13 01:28
>>953
未定義動作の結果を見てなにを検証したというのか?

955 :デフォルトの名無しさん:03/04/13 01:28
ぬるぽでも動くのか。
奇怪だな。

956 :デフォルトの名無しさん:03/04/13 01:30
>>954
未定義だけど「動いた」って書いただけだろ。
何をムキになってる?


957 :デフォルトの名無しさん:03/04/13 01:34
>>956
未定義なのがわってるなら、まぁいいんだが。
>>937みたいなやつがそれ見たら、誤解しかねない。

958 :デフォルトの名無しさん:03/04/13 01:35
>>932
? に何がくるかだと思うが。

// case 1
phoge = &hoge;
delete phoge;
これはヤバい。
new されてないのを delete してる。
どうなるかは分からんが、普通は落ちる。

// case 2
phoge = new Hoge;
delete phoge;
hoge.foo();
問題なし。

// case 3
phoge = new Hoge[9];
delete phoge;
これはヤバい。
配列 new したのを単一 delete してる。
普通、配列 new した場合はその個数を配列の直前に保持しておくが、
単一 new の場合はそんなものはない。
従って、実際に確保されたメモリブロックは phoge よりちょっと前なのが普通であり、
delete に渡されたアドレスはその先頭とはずれている。
その後どういう動作になるのかは分からん。
仮にその余分なメモリを確保しない仕様のコンパイラであっても、
phoge[1] 〜 phoge[8] がデストラクトされないまま解放されてしまうだろう。

959 :デフォルトの名無しさん:03/04/13 01:37
>>957
誰も勧めちゃいないって。>>936も書いてるけどな。

960 :958:03/04/13 01:39
ミス。

// case 1
phoge = &hoge;

あと、こう置き換えて。
Hoge → HogeClass
phoge → pHoge
hoge → Hoge
foo → Func

961 :デフォルトの名無しさん:03/04/13 01:39
>>958
聞いてもいないことを長々と解説するなよ。うざいぞ。

962 :デフォルトの名無しさん:03/04/13 01:43
>>961
一応>>932の回答になってるからいいんじゃない?

963 :デフォルトの名無しさん:03/04/13 01:45
>>962
はぁ?それならcase 1で十分なうえに既出だろ。
だれも配列newの話なんかしてない。

964 :デフォルトの名無しさん:03/04/13 01:47
(・A・)まったりしろよ君たち…

965 :デフォルトの名無しさん:03/04/13 01:48
なんでこうムキになる奴が多いんだろうね(´ー`)y─┛~~

966 :デフォルトの名無しさん:03/04/13 01:49
>>965
デスマ中なんだろ
そっとしといてやれ

967 :デフォルトの名無しさん:03/04/13 01:50
だってC++だもん

968 :デフォルトの名無しさん:03/04/13 01:52
正直言って、普通とか規約とかどうでもいい。
ただ動けば問題ない。
科学と一緒。
認知できないものは存在しない。

969 :デフォルトの名無しさん:03/04/13 01:54
 スマン,ナントナク
   ( ・∀・)   | | ガッ 
  と    )    | |
    Y /ノ    人
     / )    <  >_∧∩
   _/し' //. V`Д´)/ ← >>967
  (_フ彡        /

970 :デフォルトの名無しさん:03/04/13 01:55
>>968
そのうち認知できるようになるかもな。

971 :マイク ◆yrBrqfF1Ew :03/04/13 01:56
C++は最高だよ。
2ちゃんネラは常にダメだが。

972 :デフォルトの名無しさん:03/04/13 01:57
動いているように見えてるだけかもしれない

973 :デフォルトの名無しさん:03/04/13 02:00
>>968
>>936

974 :デフォルトの名無しさん:03/04/13 02:00
科学と一緒。
認知できてから考えれば良い。

975 :デフォルトの名無しさん:03/04/13 02:02
>>974
釣られた!!

976 :デフォルトの名無しさん:03/04/13 02:03
そんな考え方だから2000年問題みたいなんが起こるんだ。

977 :デフォルトの名無しさん:03/04/13 02:14
2000年問題? 将来はもっと凄い問題が待ってるぜ!

978 :デフォルトの名無しさん:03/04/13 02:14
問題が起こった方が刺激があっていいYO!

979 :デフォルトの名無しさん:03/04/13 02:15
>>977
Java死滅?

980 :デフォルトの名無しさん:03/04/13 02:16
さて、そろそろ次スレの季節ですね。

981 :デフォルトの名無しさん:03/04/13 02:21
>刺激があっていいYO!
確かに…わくわくするな(`エ´*)

982 :デフォルトの名無しさん:03/04/13 02:26
ちょうど一ヶ月だ!

983 :デフォルトの名無しさん:03/04/13 02:31
>>932
VC++6.0とXPだと動作が不安定になる。
以降の処理で問題なく動くときもあるし、いきなり落ちるときもある。
しばらく大丈夫かと思えば、やっぱり途中で落ちたり、
Hoge.Func()が予期しない処理をしたりする。
まあ、慣れないことはしないに越したことが無いってことだ。

984 :デフォルトの名無しさん:03/04/13 02:32
どうせ誰も2038年問題のことなど何も考えてないだろ

985 :デフォルトの名無しさん:03/04/13 02:33
っていうか、慣れるって・・・
慣れたら念力で常に正常実行できるとか?(w

986 :デフォルトの名無しさん:03/04/13 02:33
>>984
その頃には最新のコンピュータが、
問題のあるコンピュータのコードを書き換えてくれるようになってるよ。

987 :デフォルトの名無しさん:03/04/13 02:46
>>984
もう死んでいるだろうしなぁ。

988 :デフォルトの名無しさん:03/04/13 03:41
20年後ってVC++使いって需要ありますかね?


989 :デフォルトの名無しさん:03/04/13 03:42
量子コンピューターが実用化されたら、
今のプログラマーは置いてきぼりかな・・・

990 :デフォルトの名無しさん:03/04/13 03:53
そのころには年金で宇宙旅行にでもいってるよ

991 :v(^・^)v:03/04/13 05:40
次スレ立てました
C++相談室 part18
http://pc2.2ch.net/test/read.cgi/tech/1050177746/

992 :デフォルトの名無しさん:03/04/13 06:14
>>991
朝早くからご苦労様

993 :デフォルトの名無しさん:03/04/13 15:49
get


994 :デフォルトの名無しさん:03/04/13 16:22
v(^・^)v

995 :デフォルトの名無しさん:03/04/13 16:57
1000取り始め

996 :デフォルトの名無しさん:03/04/13 16:57
996

997 :デフォルトの名無しさん:03/04/13 16:57
997 

998 :デフォルトの名無しさん:03/04/13 16:58
998  

999 :デフォルトの名無しさん:03/04/13 16:58
999      

1000 :デフォルトの名無しさん:03/04/13 16:58
1000!!!

1001 :1001:Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。

236 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.02.02 2014/06/23 Mango Mangüé ★
FOX ★ DSO(Dynamic Shared Object)