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


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

C++相談室 part45
1 名前:(*^ー゚)b グッジョブ!! :2005/11/26(土) 21:20:04
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
テンプレートライブラリ(STL含む)に関する質問は
専用の別スレにお願いします。
IDE(VC++など)などの使い方の質問もその開発環境のスレに
お願いします。

前スレ
http://pc8.2ch.net/test/read.cgi/tech/1128512737/


2 名前:デフォルトの名無しさん :2005/11/26(土) 21:22:41
1 http://mimizun.mine.nu:81/2chlog/tech/piza.2ch.net/tech/kako/980/980175292.html
2 http://pc.2ch.net/tech/kako/996/996640937.html
3 http://pc.2ch.net/tech/kako/1003/10038/1003832761.html
4 http://pc.2ch.net/tech/kako/1009/10090/1009071535.html
5 http://pc.2ch.net/tech/kako/1014/10142/1014217496.html
6 http://pc.2ch.net/tech/kako/1018/10184/1018454705.html
7 http://pc.2ch.net/tech/kako/1021/10217/1021787032.html
8 http://pc3.2ch.net/tech/kako/1025/10250/1025010364.html
9 http://pc3.2ch.net/tech/kako/1027/10273/1027347982.html
10 http://pc3.2ch.net/tech/kako/1029/10293/1029315669.html
11 http://pc3.2ch.net/tech/kako/1032/10323/1032345774.html
12 http://pc3.2ch.net/tech/kako/1035/10350/1035005882.html
13 http://pc3.2ch.net/tech/kako/1038/10380/1038031395.html
14 http://pc5.2ch.net/tech/kako/1041/10413/1041328679.html
15 http://pc5.2ch.net/tech/kako/1043/10436/1043605481.html

3 名前:デフォルトの名無しさん :2005/11/26(土) 21:23:26
16 http://pc5.2ch.net/tech/kako/1045/10457/1045746245.html
17 http://pc5.2ch.net/tech/kako/1047/10475/1047560042.html
18 http://pc5.2ch.net/tech/kako/1050/10501/1050177746.html
19 http://pc5.2ch.net/tech/kako/1052/10526/1052625846.html
20 http://pc5.2ch.net/tech/kako/1055/10551/1055162298.html
21 http://pc5.2ch.net/tech/kako/1057/10575/1057580107.html
22 http://pc5.2ch.net/tech/kako/1060/10603/1060361082.html
23 http://pc5.2ch.net/tech/kako/1062/10626/1062690663.html
24 http://pc5.2ch.net/tech/kako/1066/10665/1066546387.html
25 http://pc5.2ch.net/tech/kako/1067/10679/1067949669.html
26 http://pc5.2ch.net/test/read.cgi/tech/1070164402/ (迷子)
27 http://pc5.2ch.net/test/read.cgi/tech/1074454641/ (迷子)
28 http://pc5.2ch.net/test/read.cgi/tech/1077985164/
29 http://pc5.2ch.net/test/read.cgi/tech/1082047479/
30 http://pc5.2ch.net/test/read.cgi/tech/1084030770/

4 名前:デフォルトの名無しさん :2005/11/26(土) 21:24:15
31 http://pc5.2ch.net/test/read.cgi/tech/1086185282/
32 http://pc5.2ch.net/test/read.cgi/tech/1088236078/
33 http://pc5.2ch.net/test/read.cgi/tech/1090180012/
34 http://pc5.2ch.net/test/read.cgi/tech/1092018643/
35 http://pc5.2ch.net/test/read.cgi/tech/1093958200/
36 http://pc5.2ch.net/test/read.cgi/tech/1096304546/
37 http://pc5.2ch.net/test/read.cgi/tech/1098543578/
38 http://pc5.2ch.net/test/read.cgi/tech/1101473340/
39 http://pc5.2ch.net/test/read.cgi/tech/1106466303/
39(実質40) http://pc8.2ch.net/test/read.cgi/tech/1106527792/
40(実質41) http://pc8.2ch.net/test/read.cgi/tech/1113408957/
41(実質42) http://pc8.2ch.net/test/read.cgi/tech/1120190961/
43 http://pc8.2ch.net/test/read.cgi/tech/1124113879/

5 名前:デフォルトの名無しさん :2005/11/26(土) 21:24:35
#include <iostream>
using std::cout;
using std::endl;
int main()
{
cout << "乙" << endl;
return 0;
}

6 名前:デフォルトの名無しさん :2005/11/26(土) 21:25:01
■基本■
[C++ FAQ]
 http://www.parashift.com/c++-faq-lite/
 http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
  Cとその仕様を比較しながらの解説なので分かりやすい。
  ***** 質問の前に必ずこの二つに目を通してください *****

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

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

7 名前:デフォルトの名無しさん :2005/11/26(土) 21:25:48
■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/
Exceptional C++ Style
 http://www.amazon.com/exec/obidos/ASIN/0201760428/

8 名前:デフォルトの名無しさん :2005/11/26(土) 21:34:56
C++ Coding Standards
http://www.amazon.co.jp/exec/obidos/ASIN/0321113586/
http://www.amazon.co.jp/exec/obidos/ASIN/4894716860/(翻訳)

9 名前:デフォルトの名無しさん :2005/11/26(土) 21:35:13
■Books(Templateまわり)■
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/
C++ Template Metaprogramming
 http://www.amazon.com/exec/obidos/ASIN/0321227255/

10 名前:デフォルトの名無しさん :2005/11/26(土) 21:36:32
■Libraries■
[Boost]
 Boost http://www.boost.org/
 (日本語) http://www.kmonos.net/alang/boost/
 (日本語) http://shinh.skr.jp/boost/
[STL]
 STLport http://www.stlport.org/
 SGI-STL http://www.sgi.com/tech/stl/
 STLFilt http://www.bdsoft.com/tools/stlfilt.html
 (日本語) http://www005.upp.so-net.ne.jp/episteme/html/stlprog/
 (日本語) http://www.wakhok.ac.jp/~sumi/stl/
[Loki]
 http://www.moderncppdesign.com/
 LokiPort-MSVC7 http://www.geocities.com/rani_sharoni/LokiPort.html
 LokiPort-MSVC6sp5 http://fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport

11 名前:デフォルトの名無しさん :2005/11/26(土) 21:37:33
■Libraries■
[他]
 ACE http://www.cs.wustl.edu/~schmidt/
 Blitz++ http://www.oonumerics.org/blitz/
 flex++ Bison++ http://www.idiom.com/free-compilers/TOOL/BNF-15.html
[他ライブラリリンク集]
 http://www.trumphurst.com/cpplibs/cpplibs.phtml
 (日本語) http://www.kmonos.net/alang/cpp/lib.html

12 名前:デフォルトの名無しさん :2005/11/26(土) 21:38:47
■関連スレ■
【初心者歓迎】C/C++室 Ver.24【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1131691023/
【C++】STL(Standard Template Library)相談室 4
http://pc8.2ch.net/test/read.cgi/tech/1130680264/
C/C++の宿題を片付けます 53代目
http://pc8.2ch.net/test/read.cgi/tech/1132102992/
C/C++でのWindowsPrograming議論スレ(質問お断り)
http://pc8.2ch.net/test/read.cgi/tech/1049790146/
managed C++ やろうぜ!!
http://pc8.2ch.net/test/read.cgi/tech/1014486422/
【.NET】 C++/CLI について語ろうぜ 【最適】
http://pc8.2ch.net/test/read.cgi/tech/1126450441/
ATL/WTL Part3
http://pc8.2ch.net/test/read.cgi/tech/1095442366/

13 名前:v(^・^)v :2005/11/26(土) 21:42:42
テンプレは以上

14 名前:デフォルトの名無しさん :2005/11/26(土) 21:46:09


15 名前:デフォルトの名無しさん :2005/11/26(土) 21:49:58
>>1

16 名前:デフォルトの名無しさん :2005/11/26(土) 22:44:55
>>1


17 名前:デフォルトの名無しさん :2005/11/26(土) 23:33:10
STLつかうと一気に実行ファイルサイズが10倍に?!

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

19 名前:デフォルトの名無しさん :2005/11/26(土) 23:38:14
>>18
毎スレ恒例のテンプレみたいなもんだ。気にするな。

20 名前:デフォルトの名無しさん :2005/11/26(土) 23:41:42
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
#include <stdafx.h>

後氏ね。


21 名前:デフォルトの名無しさん :2005/11/26(土) 23:56:44

確かこれもテンプレ

22 名前:デフォルトの名無しさん :2005/11/27(日) 00:05:54
>>1

しかし、std::iteratorを継承して、独自のイテレータを作るの、面倒いね。
オーバーライドをきちんとしないと、予期しないコンパイルエラーの原因になる。

どっかにうまくまとめたサイトないですかね。

23 名前:デフォルトの名無しさん :2005/11/27(日) 00:12:27
>>22
boost::iterator_adaptorやboost::iterator_facadeはどうか?

24 名前:デフォルトの名無しさん :2005/11/27(日) 00:43:10
>>23
ありがとう。さっそくいじくってみます。

25 名前:デフォルトの名無しさん :2005/11/27(日) 01:21:02
実行ファイルとは違うディレクトリにあるファイルのオープンを絶対パス指定以外で
行うにはどうしたらいいのでしょうか?


26 名前:デフォルトの名無しさん :2005/11/27(日) 01:23:30
相対パス

27 名前:デフォルトの名無しさん :2005/11/27(日) 01:48:10
ワロタ

28 名前:デフォルトの名無しさん :2005/11/27(日) 01:52:44
自演乙

29 名前:デフォルトの名無しさん :2005/11/27(日) 12:14:44
>>27-28
自演乙

30 名前:デフォルトの名無しさん :2005/11/27(日) 13:39:38
webサーバー立てて、URLでファイルを取得する。

31 名前:デフォルトの名無しさん :2005/11/27(日) 17:18:53
for(int i=5, m; i < 10; i++)
{
}
のような文の時
int i=5,m;
の意味はint型の変数iとmを作ってiに5を代入するという意味でいいのしょうか?

32 名前:デフォルトの名無しさん :2005/11/27(日) 17:31:15
いいえ、代入ではなくiを5で初期化するという意味です。

33 名前:デフォルトの名無しさん :2005/11/27(日) 17:53:29
ありがとうございました

34 名前:デフォルトの名無しさん :2005/11/27(日) 18:04:42
本当にありがとうございました

35 名前:デフォルトの名無しさん :2005/11/27(日) 18:28:04
代入と初期化の違いは何ですか?

36 名前:デフォルトの名無しさん :2005/11/27(日) 18:56:50
constメンバに値をカキコできるのは初期化のときだけ

37 名前:デフォルトの名無しさん :2005/11/27(日) 19:29:07
>>35
実行されるのが代入演算子かコンストラクタか

38 名前:デフォルトの名無しさん :2005/11/27(日) 20:21:09
PODだと違いを感じない(=C言語のつもりだと区別が実感できない)けどな
C++だとコンストラクタと代入演算子で処理が変えられるから区別が必要だよな。

39 名前:デフォルトの名無しさん :2005/11/29(火) 07:04:39
staticでprivateなメンバを初期化子(もしくはそれのようなもの)
を使って初期化したいのですが、
どうにも苦戦しています。(PODではないため?)

class a_c {
private:
static int x[2];
};
int a_c::x[2] = {0,1};

どうすれば
よろしいのでしょう…コンスタラクタで初期化や継承など考えましたが、
旨くいきません。
初期化は、staticで、初期化子のように羅列する方式おこないたい
と思うのですが不可能でしょうか。

40 名前:デフォルトの名無しさん :2005/11/29(火) 07:48:33
>>39
そのコードは全然間違っていません。正しいですよ。

41 名前:デフォルトの名無しさん :2005/11/29(火) 15:26:49
>>39
つまり何が上手く言ってないのか書けと。エラーメッセージとかな。

42 名前:デフォルトの名無しさん :2005/11/29(火) 20:13:43
テンプレートクラスを作成し、
そのメンバ関数でそのテンプレート型を返す関数を作成したのですが
関数の失敗時の戻り値に何を返せばいいのか分からず悩んでおります
失敗判定の値を返したいのですが
型によって返す値を分岐するしかないのでしょうか

43 名前:42 :2005/11/29(火) 20:17:17
>型によって返す値を分岐するしかないのでしょうか
すみません、これは意味が分かりませんでした…

44 名前:デフォルトの名無しさん :2005/11/29(火) 20:29:06
>>42
つ[例外]

45 名前:42 :2005/11/29(火) 20:37:15
>>44
おお、ありがとうございます
例外処理でやってみます

46 名前:デフォルトの名無しさん :2005/11/29(火) 21:23:32
>42
Nullオブジェクト……とか思ったけど、C++だと使い物にならんな……


47 名前:デフォルトの名無しさん :2005/11/29(火) 22:28:13
struct Point {
 Point() {}
 Point(int xx, int yy) : x(xx), y(yy) {}
 Point(const Point& p) : x(p.x), y(p.y) {}
 int x, y;
};

この

 Point(int xx, int yy) : x(xx), y(yy) {}
 Point(const Point& p) : x(p.x), y(p.y) {}

この部分はどういう処理をしているのでしょうか?

48 名前:デフォルトの名無しさん :2005/11/29(火) 22:36:23
その前に、structでなくてclassじゃないの?

49 名前:デフォルトの名無しさん :2005/11/29(火) 22:43:23
これを参考にしてくれ!
http://homepage2.nifty.com/aito/cpp/node14.html

Point(int xx, int yy)、Point(const Point& p)はPointクラスのコンストラクタ。
: x(xx), y(yy)と: x(p.x), y(p.y)はxとyのコンストラクタと思われるが、不要なんじゃない?
Pointコンストラクタで初期化するだろうから。

50 名前:デフォルトの名無しさん :2005/11/29(火) 22:44:43
>>47
とりあえず
x = xx;
と同じだと考える。

51 名前:デフォルトの名無しさん :2005/11/29(火) 22:45:53
>>49
いやどう見ても初期化はしていないだろ

52 名前:デフォルトの名無しさん :2005/11/29(火) 22:47:06
メンバイニシャライズでは

53 名前:デフォルトの名無しさん :2005/11/29(火) 22:49:15
ごめん、イニシャライザでした

54 名前:デフォルトの名無しさん :2005/11/29(火) 22:50:01
>>47
後者はコピーコンストラクタだろ。

55 名前:デフォルトの名無しさん :2005/11/29(火) 22:52:26
この場合コピーコンストラクタは確かに不要(デフォルトので十分)だが、
Point(int xx, int yy)のコンストラクタはあったら便利。

void f(Point);のような関数に対してf(Point(10, 10));のように呼べ、
Pointの変数を作らなくてすむ。

56 名前:デフォルトの名無しさん :2005/11/29(火) 22:58:39
>>48
別にstructでもいいじゃん。
つーか、全メンバがpublicなら敢えてprivate宣言を省略するために
structにするというポリシーかも知れず。

>>47
前者は整数値を二つ引き数に取るコンストラクタ、
後者はその構造体へのコンスト参照を引き数に取るコンストラクタ。
#所謂コピーコンストラクタやね。

で、どちらもメンバ変数であるxとyを引き数を使って初期化している。

って、リロードしたら被ってた罠。
#でも書き込んじゃう♪

57 名前:デフォルトの名無しさん :2005/11/29(火) 23:02:13
class Point {
 Point() {x=0; y=0};
 Point(int xx, int yy) : {x=xx; y=yy};
 Point(const Point& p) : {x=p.x; y=p.y};
 int x, y;
};
でいいんじゃない?

58 名前:デフォルトの名無しさん :2005/11/29(火) 23:08:09
>>57
初期化でできることは初期化でやるべき。
どうでもいいけど、初期化ならPoint(int x, int y) : x(x), y(y) {}と書ける。

59 名前:デフォルトの名無しさん :2005/11/29(火) 23:08:51
>>57
たしかにxとyは組み込み型だからいいけど、
クラスでは初期化と代入は別物。
たとえばfstreamなんかはそういう風にできない。

60 名前:デフォルトの名無しさん :2005/11/29(火) 23:12:59
>>59
fsteamはどうなってるの?

61 名前:デフォルトの名無しさん :2005/11/29(火) 23:23:59
>>60
fstream fs("hoge");というのがあったとして下のコードはコンパイルできない。
fstream fs2;
fs2 = fs;
コンストラクタの中でも同じ。


62 名前:47 :2005/11/30(水) 02:29:42
なるほど

: x(x), y(y)

この使い方ははじめてみたので何なのかわかりませんでした。
メンバイニシャライザというのですね。普通に代入してもよさそうですが
覚えておきます。どうもでした

63 名前:デフォルトの名無しさん :2005/11/30(水) 02:44:26
: x(1), y(x)

と書いたとき y に 1 が入る保障はないな


64 名前:デフォルトの名無しさん :2005/11/30(水) 02:49:46
>>63
class foo {
foo() {//1
x = 1;
y = x;
}
foo() : x(1), y(x) {}//2
int x;
int y;
};
の場合、どちらもyに1が入ることは保証されている。

65 名前:デフォルトの名無しさん :2005/11/30(水) 03:03:06
a[4][2]に格納する値を条件によって変化させたいんですけど

int a[4][2]={{1,2},{3,4},{5,6},{7,8}};
と初期化するみたいにいい方法はないですか?

いちいち
a[0][0]=1;
a[0][1]=2;
a[1][0]=3;
・・・
はめんどうなんですけど

66 名前:デフォルトの名無しさん :2005/11/30(水) 03:03:19
: x(x), y(y)

そもそもこれ意味あるのか?

67 名前:デフォルトの名無しさん :2005/11/30(水) 03:12:29
>>66
個人的にはちょっとした構造体のときにメンバ変数と引き数を揃えることでシンプルになるのが気に入ってるが。

>>65
・構造体にして一次変数を初期化→代入
・構造体にしてカンマ演算子をオーバーロードして一気に代入
・いちいち代入する部分を関数にして、引き数をずらずら並べる
ってところじゃないかな。

68 名前:デフォルトの名無しさん :2005/11/30(水) 03:23:37
>>66
初期化されないっつーか不定だな

69 名前:デフォルトの名無しさん :2005/11/30(水) 03:51:41
2つの配列を一度に入力するにはどのように書いたらいいんでしょうか?
例えばa[ ]とb[ ]に一度に1 2 3 4 5 6みたいに入れたいのですが。
ポインタはまだわからないです。

cout<<"ベクトルを2つ入力 -->";
for(j=0;j<c;j++)
{
cin>>a[j]>>b[j];
}
自力だとこうなのですがエラーが出て…

70 名前:デフォルトの名無しさん :2005/11/30(水) 04:18:35
>>69
a[]とb[]を同じにするなら、cin >>a[j]; b[j] = a[j];

71 名前:デフォルトの名無しさん :2005/11/30(水) 04:37:02
cout<<"ベクトルを2つ入力 -->";
for(j=0;j<c;j++)
{
cin>>a[j];
}
b=a;


72 名前:デフォルトの名無しさん :2005/11/30(水) 04:38:43
>64
class foo {
foo() : y(x),x(1) {}
int x;
int y;
};
こう書いても保証されるんだっけ。

73 名前:デフォルトの名無しさん :2005/11/30(水) 04:41:49
>>71 その場合 y は不定。

74 名前:73 :2005/11/30(水) 04:42:21
アンカーミスった ×71 ○72

75 名前:デフォルトの名無しさん :2005/11/30(水) 04:42:34
>>72
初期化リストで保証されているのは、リストに書いた順に初期化が行われること。

76 名前:72 :2005/11/30(水) 04:47:19
>73,75
いつからそんな仕様になったの?

77 名前:デフォルトの名無しさん :2005/11/30(水) 04:52:51
>>76
知ってる限り、最初から。
いつならこんな仕様じゃなかったの?

78 名前:デフォルトの名無しさん :2005/11/30(水) 04:55:33
いや72は保証されてるだろ。
メンバ初期化子の順序は無視され、クラスの宣言に現れた順に初期化が行われるはず。
紛らわしいから同じ順番で書けってのがセオリー

79 名前:デフォルトの名無しさん :2005/11/30(水) 04:59:43
class foo {
int x;
int y;
foo() : x(y),y(1) {}
};

ということは、これは不定?

80 名前:デフォルトの名無しさん :2005/11/30(水) 04:59:46
ちなみに12.6.2.5ね。
> Then, nonstatic data members shall be initialized in the order they were described in the class definition
> (again regardless of the order the mem-initializers).

81 名前:デフォルトの名無しさん :2005/11/30(水) 05:00:48
だーかーらー

class foo {
int x;
int y;
foo() : x(x),y(y) {}
};

これも不定だってば。


82 名前:デフォルトの名無しさん :2005/11/30(水) 05:03:11
>>79
不定

83 名前:デフォルトの名無しさん :2005/11/30(水) 05:03:14
>77
多分最初から。
プログラミング言語C++は持ってないけど、Effective C++にも一項使って書いてある。
クラスの宣言なのはメンバのデストラクタ呼び出しの順番を固定するためだって。

>81
それはこれのことだろ。
Point(int x, int y) : x(x), y(y) {}
不定じゃない。

84 名前:73=77 :2005/11/30(水) 05:07:15
>>72,76
ああぁ、宣言順は x, y だったのな。ごめん間違い。

85 名前:デフォルトの名無しさん :2005/11/30(水) 07:33:21
どうでもいいことだが、さっきからclassで書いてるヤシは、publicつけといたほうがいいんジャマイカ

86 名前:デフォルトの名無しさん :2005/11/30(水) 07:41:28
なんか、自分の勉強不足を力一杯宣言している阿呆がいるな。

87 名前:デフォルトの名無しさん :2005/11/30(水) 09:48:04
fooがpoint型ならともかく何か分からないんだからどっちでもいい罠。
x,yって名前も適当に付けてんだし

88 名前:デフォルトの名無しさん :2005/11/30(水) 11:49:52
constオブジェクトのためには初期化子も必要ですよね?

89 名前:デフォルトの名無しさん :2005/11/30(水) 12:10:50
>>88
そんな消極的な理由で必要なわけじゃない。
基底クラスやメンバを初期化するために必要。

90 名前:デフォルトの名無しさん :2005/11/30(水) 13:55:21

初期化子に付随する、function-try-block があれば、
コンストラクタで失敗したときにログを吐く場合も有効。

struct foo
{
 auto_ptr< bar > x;
 auto_ptr< bar > y;
 
 // function-try-block が利用できる場合(非常に便利)
 foo( int v )
  try : x( new bar( v ) ), y( new bar( v ) ) {}
catch( exception const & e ) {
   cout << "初期化失敗:" << e.what() << endl;
  } // ここで例外が自動的に再スローされる。

 // function-try-block が利用できない場合(非常に不便)
 foo( int v, bad_tag )
 {
  try {
   x = auto_ptr< bar >( new bar( v ) );
   y = auto_ptr< bar >( new bar( v ) );
  }
  catch( exception const & e ) {
   cout << "初期化失敗:" << e.what() << endl;
   throw e; // 自分で再度投げる
  }
 }
};



91 名前:デフォルトの名無しさん :2005/11/30(水) 17:12:18
>>40
>>41
レスありがとうございます。
実際のコードは大きいので問題抽出してる時に間違ってしまったようです。
typedef struct {
int a[2];
} b_s;

typedef struct {
b_s bs;
} c_s;

static const c_s cs = {
{0, 1}
};

こんな感じのデータがあって、
それにクラスをかぶせたいのですが、
どうすればいいのかわかりません。

class c_c {
public:
c_c() {}
c_c(const cs& cs) {}
const b_c getC()
private:
};

static const c_c cc(cs);

この辺までで詰まってます…

92 名前:デフォルトの名無しさん :2005/11/30(水) 17:12:27
>>90
初めて知った
Thanks!


93 名前:デフォルトの名無しさん :2005/11/30(水) 17:45:15
>>88
実はコンストラクタ・デストラクタの中では全てのメンバはconstでないという扱い。
だからといって初期化子を使わなくて良いということではないが。


94 名前:デフォルトの名無しさん :2005/11/30(水) 20:44:00
struct A
{
 virtual void g() {}
 void f()
 {
  // お世話になります。
  // g がオーバーライドされていればgを呼び出す。
  // って事をしたいのですが、オーバーライドされた事を調べるにはどうしたら
  // 良いのでしょうか?
  // if(g != A::g) 見たいなシンプルな判定方法があれば教えてください。
 }
};

struct B : A
{
 void g() { /* いろいろ */ }
};

95 名前:デフォルトの名無しさん :2005/11/30(水) 20:59:25
>94
デフォルトのA::g()の中身が空なら、何も考えずにg()を呼べばいいのでは?

96 名前:94 :2005/11/30(水) 21:11:19
>>95
肝心な事を忘れていました。
gにパラメータを渡すのですが、そのパラメータの計算が結構長いのです。
gが空ならその計算ごと省略したいので、どうにかならないかと考えた訳です。

97 名前:デフォルトの名無しさん :2005/11/30(水) 21:29:37
>>96
これって結局は「fの振る舞いが型によって異なる」ということなのだから、
fを仮想関数にして、Aを継承した型が自分のf()の中でg()関連を
担当するべきなんじゃないでしょうか。

98 名前:デフォルトの名無しさん :2005/11/30(水) 21:46:22
hoge0 = hoge1 * hoge2 * 0.5;
みたいな、良くある演算子オーバーロード使用のループを

hoge0.x = hoge1.x * hoge2.x * 0.5;
hoge0.y = hoge1.y * hoge2.y * 0.5;
みたいな感じで展開してみたら、泣けるくらい実行速度が速くなりました。

計算式がまちまちな上、計算自体数百行に及ぶので、
可読性を考えると圧倒的に前者の方が助かるのですが、さりとて速度も欲しいところでして。

なにか両者を共にいただけるような方法ないッスかねぇ。

99 名前:デフォルトの名無しさん :2005/11/30(水) 22:13:00
>>98
プログラム設計には2段階あって、論理設計と物理設計の二つ。
論理設計では上の方法が好ましいんだけど、性能面(物理設計)でダメと
いうことか。
演算子オーバーロードの処理が重いんだろ。

>なにか両者を共にいただけるような方法ないッスかねぇ。
ない!(笑)


100 名前:デフォルトの名無しさん :2005/11/30(水) 22:16:22
焼け石に水だろうが、その演算子オーバーロード関数が
もしインライン関数でなければインライン関数にしておく。

101 名前:99 :2005/11/30(水) 22:24:43
>>100
なるほど、その手があったか。
演算子オーバーロードに対してinline使えたっけ?

102 名前:デフォルトの名無しさん :2005/11/30(水) 22:25:59
>>101
だって関数だもん。

103 名前:98 :2005/11/30(水) 22:41:04
>>99-102
お二人?とも、ありがとやんす〜。なるほど2段階っすか、まさに。

とりあえずinline指定してみました。が、私のやり方がまずのかなぁ…。
なんか余計なコピーでも発生してそうなので、EffectiveC++片手にもう少し詰めてみます。

104 名前:デフォルトの名無しさん :2005/11/30(水) 22:45:30
>98
遅延評価を使えばできそうな気がする。

105 名前:デフォルトの名無しさん :2005/11/30(水) 23:00:54
>>103
今使ってる処理系の complex ヘッダを読むのが解への最短距離かも。

>>140
行列ライブラリではよく使われるけど98みたいな単純な例だと逆効果にならない?

106 名前:105 :2005/11/30(水) 23:10:21
s/140/104/ です。104さん並びに未来の140さん失礼しました。

107 名前:デフォルトの名無しさん :2005/11/30(水) 23:15:14
最近どこかで読んだような、っと見つけた。
ttp://homepage1.nifty.com/herumi/prog/prog82.html

108 名前:105 :2005/11/30(水) 23:41:59
>>105
参考になりました。URLの根っこのところをお気に入りに入れました。

>N = 4 なら全部計算してしまうようで
というところが気になったんだけど、調べてみたら
#pragma inline_depth(255)
で解決しそう。


109 名前:108 :2005/11/30(水) 23:48:29
>>105じゃなくて>>107です・・・・・・
アルコールに脳みその数字認識野を破壊されたようなので逝ってきます

110 名前:デフォルトの名無しさん :2005/12/01(木) 01:37:48
class hoge
{
void f1();{f2();}
void f2(){/*長い関数*/};

};
このクラスのf1を呼ぶとf2を呼んだあとf2の1行目で落ちます。
デバッグするとアセンブルコードのところで落ちていました。
しかし長い関数の部分を削除してf2の先頭3,4行のコードを残して実行すると落ちません。
おかしいですよね。削除する前は1行目で落ちていたのに、削除したら落ちないんですから。
こんなことは5年の経験で初めてです。
いったい何が原因ですか?

111 名前:デフォルトの名無しさん :2005/12/01(木) 01:46:10
そういわれてもネェ…

112 名前:デフォルトの名無しさん :2005/12/01(木) 01:49:18
>>110
長い関数f2()を単独に実行するとどうなんでしょうか?
f1()がくさいような気がします。
どこかプログラムでぶっ壊してる?特に内部変数あたり。

113 名前:デフォルトの名無しさん :2005/12/01(木) 01:51:29
スタック壊してるね

114 名前:デフォルトの名無しさん :2005/12/01(木) 02:00:27
>>110
f1()で変なところを壊してないか確認すること。
配列のMAXを超えてデータを格納していないかとか、文字列の扱いとか。
あと、ポインタ変数の処理がきちんとされているかとか。

115 名前:デフォルトの名無しさん :2005/12/01(木) 02:43:29
class A {
public:
A();
virtual ~A();

private:
init();

};

というようなクラスを定義して、
そのコンストラクタで、プライベートメソッドを呼び、その中で一括して初期化したりmallocしたり
しても良いでしょうか? (例えばメンバー変数に可変長文字列のポインタを用意し、そこに
mallocした領域に初期化文字列を入れる等の処理)

A::A() {
init();
}

116 名前:  :2005/12/01(木) 03:34:05
クラステンプレートのメンバの実装はソースファイルではなくヘッダファイルに書くべきなのでしょうか?
このクラスを使用するとリンカエラーが出て困っております

117 名前:デフォルトの名無しさん :2005/12/01(木) 03:43:16
>>115
実は質問内容はよく分からないが
複数のコンストラクタで共通する部分をinit()などに分けて
各コンストラクタ内部でそれを呼び出すのは、よくある手法。

>>116
exportが事実上存在しない現在、
複数ファイルで使うテンプレートは全てヘッダに書くのが鉄則。

118 名前:116 :2005/12/01(木) 03:54:32
>>117
ありがとうございます!すっきりしました!

119 名前:デフォルトの名無しさん :2005/12/01(木) 04:02:39
>116
最近マイブームで、
定義をfoo.h、実装を別のヘッダ(foo.hpp)に分けて書いて、
・hppをincludeして使う時は普通にインライン実装。
・hのみをincludeして使う時は、
どこか適当なソールファイルでhppを使って明示的インスタンス化。

とかやってる。

120 名前:デフォルトの名無しさん :2005/12/01(木) 04:48:13
>>112
単独で実行すると同じように落ちました。

>>113
スタックですか。

>>114
はいf1はf2を呼び出すだけです。
極力直前に処理をさせないようにしたんですが(↓)落ちてしまいます

static hoge* h = new hoge;

int WINMAIN()
{
MSG msg;
HACCEL hAccelTable;
h->f1();h->f2();を直接呼び出しても同じ結果

return 0;
}

こうなるとf1以前にはhogeのコンストラクタしか呼び出されないので、コンストラクタを見ましたがコンストラクタでは何も処理をしていません。
かつて無いほど頭をひねりましたがわかりません。いつもならうっかりミスですぐ見つかるのですが・・・

121 名前:デフォルトの名無しさん :2005/12/01(木) 04:56:54
hoge* h = new hoge; をWINMAINの中に入れても同じですか?

int WINMAIN()
{
hoge* h = new hoge;
MSG msg;
HACCEL hAccelTable;
h->f1();h->f2();を直接呼び出しても同じ結果

return 0;
}


122 名前:デフォルトの名無しさん :2005/12/01(木) 04:59:24
>>121
はい同じでした。

123 名前:デフォルトの名無しさん :2005/12/01(木) 05:05:03
これでも、同じ?同じなんだろうな。

int WINMAIN()
{
hoge h;
h.f2();
return 0;
}


124 名前:123 :2005/12/01(木) 05:05:55
f2って引数ないの?

125 名前:デフォルトの名無しさん :2005/12/01(木) 05:10:46
>>123
試しましたが同じでした。
引数はありません。

126 名前:123 :2005/12/01(木) 05:11:23
申し訳ないですが、ギブアップです

127 名前:デフォルトの名無しさん :2005/12/01(木) 05:20:34
^д^; とんでもない。こんな時間までお付き合いいただきありがとうございます。
あとは自分でなにか見落としがないか探してみます。解決できたら報告させてください。

128 名前:デフォルトの名無しさん :2005/12/01(木) 05:21:35
ソースやばければ、f2()を呼び出してる部分のasm上げてみ?

129 名前:123 :2005/12/01(木) 05:28:54
関数名のWINMAINってあのWINMAINですか?


130 名前:デフォルトの名無しさん :2005/12/01(木) 05:31:37
ord ptr [esp+14h]
>>128
このぐらいでよろしいですか?
02A88026 add ebx,eax
02A88028 mov eax,dword ptr [esp+8]
02A8802C mul eax,ecx
02A8802E add edx,ebx
02A88030 pop ebx
02A88031 ret 10h
02A88034 push ecx
02A88035 cmp eax,1000h
02A8803A lea ecx,[esp+8]
02A8803E jb 02A88054
02A88040 sub ecx,1000h
02A88046 sub eax,1000h
02A8804B test dword ptr [ecx],eax
02A8804D cmp eax,1000h
02A88052 jae 02A88040
02A88054 sub ecx,eax
02A88056 mov eax,esp
→02A88058 test dword ptr [ecx],eax
02A8805A mov esp,ecx
02A8805C mov ecx,dword ptr [eax]
デバッグでは→のところで止まっています。

>>129
レスするときに間違えて書いていました。正確にはWinMainです。

131 名前:123 :2005/12/01(木) 05:35:36
WinMainならば、↓のように記述しないとまずいのではないですか?

int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
);


132 名前:デフォルトの名無しさん :2005/12/01(木) 05:41:50
>>131
紛らわしい書き方で申し訳ありません。レスに書くときは引数を略していました。

133 名前:デフォルトの名無しさん :2005/12/01(木) 05:45:10
>>130
そのアドレスっておまいさんのモジュールか?

134 名前:デフォルトの名無しさん :2005/12/01(木) 05:54:08
>>133
02a88058()
WinMain(HINSTANCE__ * 0x03bdba7a, HINSTANCE__ * 0x00000000, unsigned short * 0x1a04fcc0, int 5) line 52
WinMainCRTStartup(HINSTANCE__ * 0x03bdba7a, HINSTANCE__ * 0x00000000, unsigned short * 0x1a04fcc0, int 5) line 21 + 17 bytes
02a71506()
よくわかりませんが呼び出し履歴はこのようになっています

135 名前:デフォルトの名無しさん :2005/12/01(木) 06:25:38
こういうときは本人が問題ないと思ってる部分が問題になってるケースが多い

かってに省略なんかせずにソース晒せ

136 名前:デフォルトの名無しさん :2005/12/01(木) 09:15:28
>>93
コンストラクタ・デストラクタの中でも const メンバは const だよ。

137 名前:デフォルトの名無しさん :2005/12/01(木) 11:08:08
質問デス。
あるクラスのメンバ関数を、プロジェクトのグローバル領域から、
クラスのポインタを通さずに呼び出す事は可能でしょうか。

138 名前:デフォルトの名無しさん :2005/12/01(木) 11:14:48
>>137
そのメンバ関数が静的なら問題なくできます。

139 名前:137 :2005/12/01(木) 11:50:38
>>138
すばやい回答ありがとうございます。

ですが、質問の大事なところを端折っていました…orz
申し訳ありませんが、もう一度質問を…。

現在C++でActiveXDLLを作製しています。
DLLの呼出元はVBプログラムなのですが、
この時に、クラスを介せずに直接、クラスのメンバ関数を
呼出できないか、というのを調べています。

よろしくお願いします。

140 名前:デフォルトの名無しさん :2005/12/01(木) 11:58:13
>>139
そのメンバ関数が静的ならその関数を然るべき手段で呼び出せばいいと思います。
#具体的な方法は環境依存につき割愛。然るべきスレでどうぞ。

141 名前:デフォルトの名無しさん :2005/12/01(木) 12:53:48
普通にインタフェース用の関数を用意して,そっからメンバ関数を呼び出すんじゃダメか?
Sub Hoge
 foo
End Sub

int stdcall foo()
{
 return Bar::bar();
}

class Bar {
public:
 static int bar();
};
・・・みたいな

142 名前:137 :2005/12/01(木) 16:26:40
>>140.141
回答ありがとうございます。
141さんの例を参考に現在構築していますが、
ActiveXDLLとして参照できるものを作るには、色々必要なようです。

色々と試行錯誤してみます。
ありがとうございました。

143 名前:デフォルトの名無しさん :2005/12/01(木) 16:33:46
141の方式ではVB側でfooはおそらくDeclareで宣言することになるよ。

144 名前:137 :2005/12/01(木) 17:48:13
>>143
回答ありがとうございます。
実は、VB側はすでに完成しています。

VBですでに作製してあるActiveXDLLを、
C++に移植するという事をやっているため、
呼出側は基本的にそのままという方針なんです。

そういう訳で、クラスを介さない呼出とか、考えなければいけないんですが。


145 名前:デフォルトの名無しさん :2005/12/01(木) 18:24:56
>>144 他回答している香具師ら
頼むからいい加減スレ違いだと言う認識を持ってくれ。
つーか、C++に移植する段階でクラスを使わなければいいだけだろうが。
#で、ついでにextern "C"と。

146 名前:デフォルトの名無しさん :2005/12/01(木) 20:31:54
144 がここはスレ違いだと気付くのキーワードを用意した
ATL-COM IUnknown IDispatch GUID Single-Thread-Apartment

147 名前:デフォルトの名無しさん :2005/12/01(木) 21:20:05
■質問があります
std::string に格納されている「先頭の」空白文字を除去するにはどうすればいいのでしょうか?
空白文字は複数あることも、全くないこともあります。

148 名前:デフォルトの名無しさん :2005/12/01(木) 21:22:03
boost::trim_left

149 名前:147 :2005/12/01(木) 21:54:37
boostが使えない環境なのです(;_;)

150 名前:デフォルトの名無しさん :2005/12/01(木) 22:22:34
>>147
string s = " hoge";
string n;

n = s.substr(s.find_first_not_of(" \t"));

とか?

151 名前:デフォルトの名無しさん :2005/12/01(木) 23:00:10
find_first_not_ofとか、何でメンバ関数になってんだろ…?
激しくムダな気が

152 名前:デフォルトの名無しさん :2005/12/01(木) 23:08:55
ふと思ったんだが。

>>147のって、生のchar*を使うとすれば
char *s = ...;
while (isspace(*s))
 s++;
で、sをずらすだけで済むケースがあるじゃん?

で、同様にstring::c_str()を使ってみると
std::string str = ...;
const char *s = str.c_str();
while (isspace(*s))
 s++;
で、ここで、strに戻す(代入しなおす)わけだが、
sはstrの(実体の)内部を指している。
つまり、気楽に str = s; とすると、
実装の仕方によっては不具合が出る可能性がある気がするんだが、
仕様的にはこの辺どうなのか、知ってる人居る?

要は「stringの代入演算子の内部で元の文字列をdeleteするタイミング」
に規定があるのかどうか、って事だけど。

もちろん、char*ではなくiteratorを使っても同じだと思うけど、
・部分文字列を作って
・新規にstringのインスタンスを作り
・それを元のstrに代入する
の3段階の手順を踏むような、例えば
str = string(it, str.end());
みたいな形なら、間違いなく問題は無いはず。

153 名前:デフォルトの名無しさん :2005/12/01(木) 23:22:07
>>152
仕様では、charT*を引数とするoperator=は
*this = basic_string<charT, traits, Allocator>(pointer_to_string);
を行うことになっている。
つまり、一時オブジェクトが作られ、それがthisに代入されることが保証されている。

154 名前:デフォルトの名無しさん :2005/12/01(木) 23:34:18
おー、ありがとう。
安心して良いって事だね。

155 名前:デフォルトの名無しさん :2005/12/01(木) 23:35:28
効率も悪いってことだな

156 名前:デフォルトの名無しさん :2005/12/01(木) 23:38:18
std::string は可読性も上がり、シンプルにコードをかけるが
効率最悪

157 名前:デフォルトの名無しさん :2005/12/02(金) 00:01:13
>>155
文字列が丸ごとコピーされるとは限らないよ
リファレンスカウントによる実装もある

158 名前:デフォルトの名無しさん :2005/12/02(金) 00:02:25
>>157
部分文字列まで考慮したRefCountの実装って相当面倒な気がするんだけど、
実際のSTLの実装で使われてたりするんかな?

159 名前:デフォルトの名無しさん :2005/12/02(金) 00:12:35
王者が1枠に来るのを待っとったで。明日は鉄板やな。
8Rはいくらなんでも王者をバカにしすぎやわ

7R
6-2 30000

12R
1-3 10000
1-5 20000

160 名前:159 :2005/12/02(金) 00:20:14
スマン
誤爆や

161 名前:デフォルトの名無しさん :2005/12/02(金) 12:00:08
少し上のexpression templateの話題
efficient c++に書いてあるけれど、すべてをinline展開するとコードサイズが増えすぎるので注意
コードサイズが増えると、キャッシュミスが多発して効率が下がることも。

使用コンパイラが、組込型変数の場合だけRVOする場合
=のついてない算術演算子(operator+()とか)はexpression templateが必要かも
ただし、expression templateは、「演算子の種類とlhs, rhsへのポインタ」などをメンバに持つ
一時オブジェクトを生成するコストがかかる。
線形代数ライブラリみたいに巨大なオブジェクトの一時オブジェクト生成を阻止したいときならいざしらず
class hoge_t {
 int x, y;
};
みたいに小さなクラスのときは、逆効果だと思う。
どうしてもスピードがほしい部分なら、
hoge0 = hoge1; hoge0 *= hoge2; hoge0 *= 0.5;と展開するのがいいんじゃないかな。

コンパイラによっては:
int i = 10;
return i;
はRVOせず
return int(10);
はRVOするようなパターンもあるらしい。operator*()の定義を、最適化されやすいよう変えてみては。


162 名前:105 :2005/12/02(金) 20:38:47
>>161
コンパイル時に右辺の変数の値が確定している場合 expression template
を使えば、よく出来たコンパイラならコンパイル時に左辺値を計算するため
最高の実行速度と最小のコードサイズを得ることが出来る。

というのが >>107 の紹介したページの主張(の一部)だと。

163 名前:デフォルトの名無しさん :2005/12/03(土) 00:38:07
しかしそれほどクリティカルなケースがあふれてるものかね?
C++ でストレートに書いて問題になったことなどないのだが

164 名前:デフォルトの名無しさん :2005/12/03(土) 07:21:27
http://www.osl.iu.edu/~tveldhui/papers/techniques/
>This is a very elaborate, complex solution which is difficult to extend and
>maintain. It is probably not worth your effort to take this approach.
とあるように,効率のためにETが必要なほどのケースは滅多に存在しない.

165 名前:110 :2005/12/03(土) 07:46:15
解決しました。
長い関数の最初で、ある型の自動変数に同じ型の参照を代入していたせいでした。
コンパイルエラーにならないけど壊れるんですね。

166 名前:デフォルトの名無しさん :2005/12/03(土) 10:13:29
>>164
いいサイト紹介してくれてありがとう。

ただその引用の箇所は例えば boost::lambda あたりを揶揄してるっぽいので
可読性と一時オブジェクト生成コストのトレードオフについての論評じゃないと思う。

167 名前:デフォルトの名無しさん :2005/12/03(土) 11:11:08
Alt と Enterキー が同時に押されたのを検出したいのですが、
WinProc 内(WM_KEYDOWN / WM_SYSKEYDOWN)にて
検出しようというのは間違っているのでしょうか。

168 名前:デフォルトの名無しさん :2005/12/03(土) 11:25:32
間違ってる
このスレで聞くのも間違ってる

169 名前:デフォルトの名無しさん :2005/12/03(土) 12:06:37
>166 前後ちゃんと呼んでなかったスマソ

170 名前:デフォルトの名無しさん :2005/12/03(土) 12:44:18
C++勉強中です。

class A
{
private:
A();
public:
static A* Create()
{ return new A; }
};

これはどういうことでしょうか?
static関数って通常は非staticメンバ関数を呼び出せないですよね

171 名前:デフォルトの名無しさん :2005/12/03(土) 13:07:42
>>170
どこで非staticなメンバ関数を呼び出してるの?

172 名前:デフォルトの名無しさん :2005/12/03(土) 13:13:52
コンストラクタとか?そんなわけないよな

173 名前:デフォルトの名無しさん :2005/12/03(土) 13:19:43
コンストラクタって非staticなメンバ関数じゃないんすか。そうですか。

174 名前:デフォルトの名無しさん :2005/12/03(土) 13:34:22
誰が呼び出したかに注意するといいよ

175 名前:デフォルトの名無しさん :2005/12/03(土) 14:44:51
たぶん private: にコンストラクタがあるので staic メンバ関数内で
インスタンス化したときになんでコンパイルエラー出ないのか?
ってことを言いたいんだと思うのだが、それの答えは。

staticメンバ関数は friend みたく非公開メンバにアクセスできるから。


176 名前:デフォルトの名無しさん :2005/12/03(土) 14:53:09
一方「非staticメンバ関数を呼び出せない」に引っかかっているんだとしたら
その文面を「暗黙の this-> を省略できない」と読みかえればいいだにょん。

177 名前:170 :2005/12/03(土) 15:03:40
「暗黙の this-> を省略できない」
なるほど。
理解できました。ありがとうございました。

178 名前:デフォルトの名無しさん :2005/12/03(土) 16:34:52
質問をプログラマ板に書いたところ、ここの掲示板が良いと紹介されました。
質問:
http://pc8.2ch.net/test/read.cgi/prog/1129609762/440
よろしくおながいします。
学生ではなく現在はH/W設計もかけもちしています。
長年プログラムを組んで食ってきましたが、オブジェクト指向の言語は未経験です。



179 名前:デフォルトの名無しさん :2005/12/03(土) 16:44:18
>>178
推薦図書スレ行ったら・・・と言おうとしたけど荒れてるね。
演習的なのをやりたいのならExceptional C++かな?
ただWisdomSoftのを読んだだけだと厳しいかもしれない。

#マ板の割にはいいレス付いてるなw
#俺がひどいスレしか見てないだけかもしれんが。

180 名前:デフォルトの名無しさん :2005/12/03(土) 17:41:19
>>168
失礼しました。

181 名前:デフォルトの名無しさん :2005/12/03(土) 17:43:44
>>179
K&Rは感動の良書で、そんな演習の入ったC++本を探していますが、
気に入ったもの見つからないのです。
K&Rは1章の問題(1日で踏破できた)をやるだけで、ひととおり
C言語プログラムが書けるように工夫して書かれてました。

コンストラクタ、ディストラクタの概念などは、C言語にはなかったじゃない
ですか。なのでC++仕様の大きさには感心しています。
ただ正直のところは、クラスの定義について、どのような考え方で
システム構成を構築するか、あるいはシステムをどのように分割して
クラスに分解する?・・・みたいな考え方も知りたいところです。

あとは、どんなの応用を想定して、クラスの継承をできるようにC++ではしているのか、
その根本的思想を知りたい、と思います。

なお、
マ板は、読むと精神的に良くないのですが、酷い会社環境で
苦労している人(自分もそう)の話から、自分の知らない
世の中の現実から、学べ取れるものがあります。



182 名前:デフォルトの名無しさん :2005/12/03(土) 17:48:39
クラス、オーバーロード、オーバーライド、ポリモフィズム、例外、テンプレート、STL

大雑把に言えば、C++の基礎文法はこんなとこ。後ろに行くほど分野によって不要だったりもする。
上記でまだ分からないものがあれば、ウェブなり、入門書なりでまずは補完すること。
このレベルなら独習シリーズでいいんじゃね?

で、C++の機能の多くはオブジェクト志向の実装のためにあるわけだからオブジェクト指向もかじっ
ておかないと、意味わからないことも多いと思われる。

ただし、組み込みみたいに特殊な分野だと、また文化が違ったりするから、目的がはっきりしている
なら、その点ハッキリさせて質問したほうがいいと思われ。

183 名前:デフォルトの名無しさん :2005/12/03(土) 17:55:22
>>181
>システム構成を構築するか、あるいはシステムをどのように分割して
>クラスに分解する?・・・みたいな考え方も知りたいところです。
>あとは、どんなの応用を想定して、クラスの継承をできるようにC++ではしているのか、
>その根本的思想を知りたい、と思います。

それはもう言語の話じゃないな。

184 名前:デフォルトの名無しさん :2005/12/03(土) 18:08:08
_beginthreadexで作ったスレッドをメインスレッドから強制的に終了させる方法ってないすか?

185 名前:デフォルトの名無しさん :2005/12/03(土) 18:19:48
ワーカスレッドでない場合は、クラスで隠蔽して、起動前にフラグ立てて、
デストラクタ処理で終了待ちのループさせるとかしか思いつかんけど。

186 名前:デフォルトの名無しさん :2005/12/03(土) 20:32:08
>>184
環境依存の話はスレ違いなのです。。。

【初心者歓迎】C/C++室 Ver.24【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1131691023/

こちらへどうぞ

187 名前:デフォルトの名無しさん :2005/12/03(土) 21:02:38
>>178
言語仕様や文法がどうこうというのを気にするんじゃなくて

オブジェクト指向とはどういうものか、というのを一度
言語という枠を超えて(SmalltalkとかRubyとか)勉強して、
理解してからC++に戻ってきても遅くないと思うよ。

188 名前:デフォルトの名無しさん :2005/12/04(日) 01:39:42
class A
{
public:
  int i;
  A( int _i ):i( _i ){};
  A(){ A(1); }
};

A a;
printf("%d\n", a.i );

で分けわからない数値が出力されます。
コンストラクタ内で別のコンストラクタを呼び出すのはダメなんでしょうか?

189 名前:デフォルトの名無しさん :2005/12/04(日) 01:40:42
ダメです

190 名前:デフォルトの名無しさん :2005/12/04(日) 03:33:48
>188
呼び出しても一時オブジェクトが生成されるだけだよ。
デフォルト引数使って逃げるか、init() みたいな関数に共通処理をくくり出すか(初期化じゃなくなっちゃうけど)かな。

191 名前:デフォルトの名無しさん :2005/12/04(日) 06:24:58
class A
{
public:
  int i;
  A( int _i = 1 ):i( _i ){};
};


class A
{
public:
  int i;
  A( int _i ) { init(_i); };
  A(){ init(1); }
  void init( int _i ) { i = _i; };
};


192 名前:デフォルトの名無しさん :2005/12/04(日) 09:57:43
A(int i=1): i(i){}

193 名前:デフォルトの名無しさん :2005/12/04(日) 10:12:55
A(int i=1): { i = i; }

194 名前:188 :2005/12/04(日) 11:45:37
一時オブジェクトが生成されるだけなんですか。
解りました。ありがとうございました。

195 名前:デフォルトの名無しさん :2005/12/04(日) 12:14:25
>>194
どこだか忘れたけど、C++入門なんて偉そうに書いてるWebSiteでその手の間違いを堂々と書いてたな。
ご丁寧に勘違いに基づいた結果に合うようなサンプルまで用意して。
もしあんたがそのサイトで勉強しているならとっととそのページをブックマーク、キャッシュごと捨ててしまえ。

196 名前:デフォルトの名無しさん :2005/12/04(日) 14:39:38
なんで何も知らないのに入門なんか書こうとするんだろうなあ・・・

197 名前:デフォルトの名無しさん :2005/12/04(日) 14:46:06
自分が無知なことを知らないから
(というより、自分は結構詳しいと勘違いしているから)

198 名前:デフォルトの名無しさん :2005/12/04(日) 14:57:14
http://www.amazon.co.jp/exec/obidos/ASIN/475611895X/
http://www.amazon.co.jp/exec/obidos/ASIN/4797328541/
>>178はこれら読むしかないんじゃないの?
それかオブジェクト指向の本


199 名前:デフォルトの名無しさん :2005/12/04(日) 15:06:55
コンストラクタについての質問です。
独習C++で勉強した後、VC++(MFC)の勉強をしていたら、
次のような文を何気なく使われているのを発見しました。

class TestView: public CView
{
/*各種オブジェクトの宣言*/
private:Crect m_rectEllipse;
}

CMyView :: CMyView : m_rectEllipse(0,0,200,200) //←ココ
{
/* CMyViewのコンストラクタ
.
.
.
*/
}

"ココ"の文っていろいろ調べたんですが、載ってなくて。
こういう初期化の書き方ってありなんでしょうか。
それとも何か別の意味があるんでしょうか。

200 名前:デフォルトの名無しさん :2005/12/04(日) 15:09:42
>>199
初期化リストでぐぐってみ。
基底クラスのコンストラクタを呼び出す意味と、メンバを初期化する意味がある。

201 名前:199 :2005/12/04(日) 16:01:30
解決しました。ありがとうございました。

デフォルトコンストラクタを持たないクラスのオブジェクト、
const 宣言されたメンバ、リファレンスメンバ
はメンバ初期設定リストによって初期化されなければならない。

202 名前:デフォルトの名無しさん :2005/12/04(日) 16:36:08
>>201
そんな限定的に使うんじゃなくて、なるべく全部
初期化リストで初期化するようにしような。

203 名前:デフォルトの名無しさん :2005/12/04(日) 18:17:30
CMyView::と{の間に : m_Hogehogeとかが大量に入るのが当たり前だったのか

204 名前:デフォルトの名無しさん :2005/12/04(日) 18:27:35
引数なしのデフォルトコンストラクタが用意されてないとそうなる罠

205 名前:デフォルトの名無しさん :2005/12/04(日) 21:22:37
メンバ変数の初期化リストなんてあんま見ないなと思ったら
そもそもPODじゃないデータを初期化でコピーした記憶が無かった

206 名前:デフォルトの名無しさん :2005/12/04(日) 21:54:35
hogeというクラスがあって

int KANSUU(hoge *a){}
という関数があった場合hogeを継承したhogehogeクラスを引数にとることはできるんでしょうか?

207 名前:デフォルトの名無しさん :2005/12/04(日) 21:55:43
>>206 試してみたら?

208 名前:デフォルトの名無しさん :2005/12/04(日) 23:50:50
>>206
継承を理解していればそんな質問を投げないぞ。

209 名前:デフォルトの名無しさん :2005/12/05(月) 00:09:48
>178
http://www.pearsoned.co.jp/washo/prog/wa_pro51-j.html

これは誰も紹介しないのか……初心者にちょうどいいとおもうけど。


210 名前:デフォルトの名無しさん :2005/12/05(月) 00:12:21
BruceEckelのThinking in C++ってどうなの?
Thinking in Javaが名著なだけに、是非読んでみたいと思ってるんだけど
邦訳が出てないようだし・・・
原著買うしかないかなぁ

211 名前:デフォルトの名無しさん :2005/12/05(月) 00:32:27
基底クラスに派生クラスのアドレスを代入したときの動きのメカニズムや
クラス情報がどのようにメモリに配置されるかなどを図で説明した本はないでしょうか?

212 名前:デフォルトの名無しさん :2005/12/05(月) 00:45:10
>>211
EffectiveC++にもvptr周りは図付きで説明されてた気がするが
もうちょっと詳しく知りたいならARMかD&Eじゃね?

213 名前:デフォルトの名無しさん :2005/12/05(月) 02:04:32
>>212
ARMはともかくD&Eなら近くの本屋さんにあると思うので調べてみます。
ありがとうございました

214 名前:デフォルトの名無しさん :2005/12/05(月) 02:06:33
ARMやD&Eが何の略かわかりません(><)

215 名前:デフォルトの名無しさん :2005/12/05(月) 02:14:57
>>214
ARM http://www.amazon.co.jp/exec/obidos/ASIN/4901280392/
D&E http://www.amazon.co.jp/exec/obidos/ASIN/4797328541/

216 名前:デフォルトの名無しさん :2005/12/05(月) 02:16:02
ARM : The Annotated C++ Reference Manual : プログラミング言語C++
D&E : The Design And Evolution of C++ : C++の設計と進化

217 名前:デフォルトの名無しさん :2005/12/05(月) 04:00:21
>>216
>ARM : The Annotated C++ Reference Manual : プログラミング言語C++
邦訳タイトルが違う >>215 が正しい

218 名前:デフォルトの名無しさん :2005/12/05(月) 05:26:34
>>211
"vtable c++"でぐぐってみるとか。手っ取り早く知るにはまずこれ。

219 名前:デフォルトの名無しさん :2005/12/05(月) 05:28:56
それにしても今晩はよく雷が落ちるなあ。さっきからUPSが3回も作動した。

220 名前:デフォルトの名無しさん :2005/12/05(月) 07:13:51
C言語で関数ポインタを使って

typedef {
 int (*func)(int param);
}funcList[]={
 func1,func2,func3・・・
};

int callFunc(int funcNum,int param)
{
 return funcList[funcNum].func(param);
}

のような実装をC++のクラスでできますか?
関数ポインタによるリスト化したいのは protected なメソッドです。
そのクラスは継承されるのが前提でひとつのプログラム内部で複数のインスタンスが生成されるのでクラスの外に定義するのはしたくありません。
switch文で分岐もメソッド数が200以上になりそうなので実用的でないし。


221 名前:デフォルトの名無しさん :2005/12/05(月) 07:37:47
>>220
ttp://www.emit.jp/prog/prog_cpp0.html

222 名前:デフォルトの名無しさん :2005/12/05(月) 08:02:08
>>219
地震の前兆です

223 名前:デフォルトの名無しさん :2005/12/05(月) 11:47:41
どなたか、教えてください。以下で func3() の値がおかしくなってしまいます。

class base_1 {
public:
base_1() : data_( 123 ) {}
int get() { return data_; }
int data_;
};
class base : public base_1 {
public:
typedef base_1 base_1_type;
public:
int GET() { return base::base_1_type::get(); }
};
class other { public: int dummy_; };
class derived : public other, public base {
public:
int func1() { return base::base_1::get(); }
int func2() { return base::GET(); }
int func3() { return base::base_1_type::get(); }
};
int main( int argc, char * argv[] )
{
derived D;
printf( "%d\n", D.func1() );
printf( "%d\n", D.func2() );
printf( "%d\n", D.func3() );// おかしい!
}


224 名前:デフォルトの名無しさん :2005/12/05(月) 11:55:22
>>223
cygwin g++ 3.4.4 で動かしたら 123 が3個表示された。
ただし、先頭に #include <cstdio> を足した。

なんかマイナーなコンパイラ使ってる?

225 名前:223 :2005/12/05(月) 11:58:05
Microsoft VC++.NETです。
どうもbase_1のthisポインタがsizeof(other)だけずれるんです。

226 名前:デフォルトの名無しさん :2005/12/05(月) 13:26:12
2003で試したけど、thisが&D+4byteを指してないといけないのに+8byteのところ指してた。

227 名前:デフォルトの名無しさん :2005/12/05(月) 13:38:10
class derived : public base, public other {
public:

228 名前:223 :2005/12/05(月) 14:12:51
みなさん、どうも。
自分の環境だけでなかったので、コンパイラの癖みたいなものでしょうか?

いろいろおかしいところはあって、
・func3()で base::get() とか base_1_type::get() だと問題は発生しない。
・たとえばotherとかにメンバ関数get()を持たせると問題は発生しない。
・base内でのtypedefをprivateにしてもコンパイルビルドはできてしまう。
・派生させるクラスの順序によって症状が変わる

もともと、base_1はtemplateだったんですが、単純化するとこうなりました。
template名が長かったのでtypedefしたんですが…


229 名前:デフォルトの名無しさん :2005/12/05(月) 15:10:07
>>228
http://lab.msdn.microsoft.com/productfeedback/SearchResults.aspx?stype=1&fields=1&category=11
このページの下のほうにバグレポートなるリンクがある。

230 名前:223 :2005/12/05(月) 16:13:36
>>229
ありがとう。いろいろあるみたいですね。折をみて聞いてきます。
とりあえず、不便ですが回避したコードでやってます。

231 名前:181 :2005/12/05(月) 20:53:07
みなさん、色々な本の紹介やアドバイスありがとうございます。
情報はすべてメモしました。

今日はとりあえず、先日見つけたWEBの演習を始めました。
今日はコンストラクタ関数と、そのオーバーロードによる
初期化の具体的やり方がわかりますた。
実際に演習で組むと、頭が良くなったような錯覚に陥りますw

紹介いただいた本は、本屋さんで眺めてから、自分に合うか
見極めようと思います。

232 名前:デフォルトの名無しさん :2005/12/05(月) 21:37:40
181 はどのサイトで勉強しているのだろう。ちょっと気になる。

233 名前:デフォルトの名無しさん :2005/12/05(月) 23:12:12
すいません、C++の勉強をしているんですが。
fstreamでファイルから読み込みをする際に
区切り文字を設定する事はできないのでしょうか?
csvのファイルを読み込むときはどうしたら良いのかわからなくて…。
スペース区切りがデフォルトですよね?


234 名前:デフォルトの名無しさん :2005/12/05(月) 23:18:34
>>233
たとえばboost::tokenizer

235 名前:デフォルトの名無しさん :2005/12/06(火) 00:40:22
トークン文字が複数の場合は面倒だがgetlineじゃダメなのか?

236 名前:デフォルトの名無しさん :2005/12/06(火) 01:42:04
STLとかイテレータとかまだ全然理解できてないです。。。
getlineでできそうでした。
ありがとうございました。

237 名前:181 :2005/12/06(火) 23:44:29
>>232
http://wisdom.sakura.ne.jp/programming/cpp/
ここを全部、読解しました。

昨日から、下の演習をやっています。最初のほうは飛ばして、クラスから
はいっています。
http://www.sist.ac.jp/~suganuma/learn/enshu.htm

・・・ここも探しあてにけっこう時間かけて苦労して見つけました。


238 名前:デフォルトの名無しさん :2005/12/07(水) 00:01:37
そんなんでいいのか。
OOなんて出番なさそうな演習だな。


239 名前:232 :2005/12/07(水) 01:11:33
>>237
>>237
http://wisdom.sakura.ne.jp/programming/cpp/ を読んでみた。
今まで見たC++入門サイトの中では最高の部類だとおもた。よく見つけてきたなぁ。

http://www.sist.ac.jp/~suganuma/learn/enshu.htm も読んでみた。
ちょっとあれだけど・・・。実際C++で良質の演習問題を提供するって難しい。

240 名前:デフォルトの名無しさん :2005/12/07(水) 01:13:05
・・・・そうか?
それのCの方を見たことあるが、
一部用語が統一されてなかったりして、
書いてる本人もわかってるのかいなってところがあったが・・・。

241 名前:デフォルトの名無しさん :2005/12/07(水) 01:16:10
>>239
Rogue Wave


242 名前:デフォルトの名無しさん :2005/12/07(水) 01:19:19
ケチらんで本買えと

>実際C++で良質の演習問題を提供するって難しい。
禿本の演習問題があるじゃん

243 名前:デフォルトの名無しさん :2005/12/07(水) 01:26:26
禿禿うっさいぞ( ゚Д゚)ゴルァ!!

244 名前:239 :2005/12/07(水) 01:30:28
>>240
ごまかしはあるけどあからさまな嘘は書いていないので好印象。
レイアウトに気を配って重要なところに自然に目がいくように
配慮されているとこがすごく良いと思った(印刷物だとお金が掛かるのでやりたくても出来ない)。


245 名前:デフォルトの名無しさん :2005/12/07(水) 01:33:12
Kittyってサイトが上がるたびに叩かれてる記憶が

246 名前:239 :2005/12/07(水) 01:42:02
>>241
Rogue Wave が tools++ を提供しているところで
エピステーメーが推奨しているってとこまでは知ってるけど・・・

Rogue Wave が日本語の演習問題を出しているのか?
Rogue Wave 有名すぎて調べにくいぞ。



247 名前:239 :2005/12/07(水) 01:47:29
>>242
プップー!
237 は 買ってみた上で翻訳が糞なんでもっと効率の良いソースを求めているのだ。

248 名前:デフォルトの名無しさん :2005/12/07(水) 02:37:35
俺が演習問題出してやる。


問1
自動販売機を分析して、C++で制御プログラムを作成せよ。

問2
エレベータシステムを分析して、C++で制御プログラムを実装せよ。


各 6時間



249 名前:デフォルトの名無しさん :2005/12/07(水) 02:41:46
うっわー出たよ  自販機問題とエレベータ問題wwっwwwwww


250 名前:デフォルトの名無しさん :2005/12/07(水) 04:37:40
あとは巡回セールスマン問題ができたら完璧だな


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