C++相談室 part45
レス数が1000を超えています。これ以上書き込みはできません。
0001(*^ー゚)b グッジョブ!!
2005/11/26(土) 21:20:04ただし質問の前にはFAQに一通り目を通してください。
テンプレートライブラリ(STL含む)に関する質問は
専用の別スレにお願いします。
IDE(VC++など)などの使い方の質問もその開発環境のスレに
お願いします。
前スレ
http://pc8.2ch.net/test/read.cgi/tech/1128512737/
0002デフォルトの名無しさん
2005/11/26(土) 21:22:412 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
0003デフォルトの名無しさん
2005/11/26(土) 21:23:2617 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/
0004デフォルトの名無しさん
2005/11/26(土) 21:24:1532 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/
0005デフォルトの名無しさん
2005/11/26(土) 21:24:35using std::cout;
using std::endl;
int main()
{
cout << "乙" << endl;
return 0;
}
0006デフォルトの名無しさん
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/ (日本語)
0007デフォルトの名無しさん
2005/11/26(土) 21:25:48amazon.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/
0008デフォルトの名無しさん
2005/11/26(土) 21:34:56http://www.amazon.co.jp/exec/obidos/ASIN/0321113586/
http://www.amazon.co.jp/exec/obidos/ASIN/4894716860/(翻訳)
0009デフォルトの名無しさん
2005/11/26(土) 21:35:13Effective 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/
0010デフォルトの名無しさん
2005/11/26(土) 21:36:32[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
0011デフォルトの名無しさん
2005/11/26(土) 21:37:33[他]
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
0012デフォルトの名無しさん
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/
0013v(^・^)v
2005/11/26(土) 21:42:420014デフォルトの名無しさん
2005/11/26(土) 21:46:090015デフォルトの名無しさん
2005/11/26(土) 21:49:580016デフォルトの名無しさん
2005/11/26(土) 22:44:55乙
0017デフォルトの名無しさん
2005/11/26(土) 23:33:100018デフォルトの名無しさん
2005/11/26(土) 23:36:28俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。
0019デフォルトの名無しさん
2005/11/26(土) 23:38:14毎スレ恒例のテンプレみたいなもんだ。気にするな。
0020デフォルトの名無しさん
2005/11/26(土) 23:41:42C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
#include <stdafx.h>
後氏ね。
0021デフォルトの名無しさん
2005/11/26(土) 23:56:44確かこれもテンプレ
0022デフォルトの名無しさん
2005/11/27(日) 00:05:54しかし、std::iteratorを継承して、独自のイテレータを作るの、面倒いね。
オーバーライドをきちんとしないと、予期しないコンパイルエラーの原因になる。
どっかにうまくまとめたサイトないですかね。
0023デフォルトの名無しさん
2005/11/27(日) 00:12:27boost::iterator_adaptorやboost::iterator_facadeはどうか?
0024デフォルトの名無しさん
2005/11/27(日) 00:43:10ありがとう。さっそくいじくってみます。
0025デフォルトの名無しさん
2005/11/27(日) 01:21:02行うにはどうしたらいいのでしょうか?
0026デフォルトの名無しさん
2005/11/27(日) 01:23:300027デフォルトの名無しさん
2005/11/27(日) 01:48:100028デフォルトの名無しさん
2005/11/27(日) 01:52:440029デフォルトの名無しさん
2005/11/27(日) 12:14:44自演乙
0030デフォルトの名無しさん
2005/11/27(日) 13:39:380031デフォルトの名無しさん
2005/11/27(日) 17:18:53{
}
のような文の時
int i=5,m;
の意味はint型の変数iとmを作ってiに5を代入するという意味でいいのしょうか?
0032デフォルトの名無しさん
2005/11/27(日) 17:31:150033デフォルトの名無しさん
2005/11/27(日) 17:53:290034デフォルトの名無しさん
2005/11/27(日) 18:04:420035デフォルトの名無しさん
2005/11/27(日) 18:28:040036デフォルトの名無しさん
2005/11/27(日) 18:56:500037デフォルトの名無しさん
2005/11/27(日) 19:29:07実行されるのが代入演算子かコンストラクタか
0038デフォルトの名無しさん
2005/11/27(日) 20:21:09C++だとコンストラクタと代入演算子で処理が変えられるから区別が必要だよな。
0039デフォルトの名無しさん
2005/11/29(火) 07:04:39を使って初期化したいのですが、
どうにも苦戦しています。(PODではないため?)
class a_c {
private:
static int x[2];
};
int a_c::x[2] = {0,1};
どうすれば
よろしいのでしょう…コンスタラクタで初期化や継承など考えましたが、
旨くいきません。
初期化は、staticで、初期化子のように羅列する方式おこないたい
と思うのですが不可能でしょうか。
0040デフォルトの名無しさん
2005/11/29(火) 07:48:33そのコードは全然間違っていません。正しいですよ。
0041デフォルトの名無しさん
2005/11/29(火) 15:26:49つまり何が上手く言ってないのか書けと。エラーメッセージとかな。
0042デフォルトの名無しさん
2005/11/29(火) 20:13:43そのメンバ関数でそのテンプレート型を返す関数を作成したのですが
関数の失敗時の戻り値に何を返せばいいのか分からず悩んでおります
失敗判定の値を返したいのですが
型によって返す値を分岐するしかないのでしょうか
004342
2005/11/29(火) 20:17:17すみません、これは意味が分かりませんでした…
0044デフォルトの名無しさん
2005/11/29(火) 20:29:06つ[例外]
0046デフォルトの名無しさん
2005/11/29(火) 21:23:32Nullオブジェクト……とか思ったけど、C++だと使い物にならんな……
0047デフォルトの名無しさん
2005/11/29(火) 22:28:13Point() {}
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) {}
この部分はどういう処理をしているのでしょうか?
0048デフォルトの名無しさん
2005/11/29(火) 22:36:230049デフォルトの名無しさん
2005/11/29(火) 22:43:23http://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コンストラクタで初期化するだろうから。
0050デフォルトの名無しさん
2005/11/29(火) 22:44:43とりあえず
x = xx;
と同じだと考える。
0051デフォルトの名無しさん
2005/11/29(火) 22:45:53いやどう見ても初期化はしていないだろ
0052デフォルトの名無しさん
2005/11/29(火) 22:47:060053デフォルトの名無しさん
2005/11/29(火) 22:49:150054デフォルトの名無しさん
2005/11/29(火) 22:50:01後者はコピーコンストラクタだろ。
0055デフォルトの名無しさん
2005/11/29(火) 22:52:26Point(int xx, int yy)のコンストラクタはあったら便利。
void f(Point);のような関数に対してf(Point(10, 10));のように呼べ、
Pointの変数を作らなくてすむ。
0056デフォルトの名無しさん
2005/11/29(火) 22:58:39別にstructでもいいじゃん。
つーか、全メンバがpublicなら敢えてprivate宣言を省略するために
structにするというポリシーかも知れず。
>>47
前者は整数値を二つ引き数に取るコンストラクタ、
後者はその構造体へのコンスト参照を引き数に取るコンストラクタ。
#所謂コピーコンストラクタやね。
で、どちらもメンバ変数であるxとyを引き数を使って初期化している。
って、リロードしたら被ってた罠。
#でも書き込んじゃう♪
0057デフォルトの名無しさん
2005/11/29(火) 23:02:13Point() {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;
};
でいいんじゃない?
0058デフォルトの名無しさん
2005/11/29(火) 23:08:09初期化でできることは初期化でやるべき。
どうでもいいけど、初期化ならPoint(int x, int y) : x(x), y(y) {}と書ける。
0059デフォルトの名無しさん
2005/11/29(火) 23:08:51たしかにxとyは組み込み型だからいいけど、
クラスでは初期化と代入は別物。
たとえばfstreamなんかはそういう風にできない。
0060デフォルトの名無しさん
2005/11/29(火) 23:12:59fsteamはどうなってるの?
0061デフォルトの名無しさん
2005/11/29(火) 23:23:59fstream fs("hoge");というのがあったとして下のコードはコンパイルできない。
fstream fs2;
fs2 = fs;
コンストラクタの中でも同じ。
006247
2005/11/30(水) 02:29:42: x(x), y(y)
この使い方ははじめてみたので何なのかわかりませんでした。
メンバイニシャライザというのですね。普通に代入してもよさそうですが
覚えておきます。どうもでした
0063デフォルトの名無しさん
2005/11/30(水) 02:44:26と書いたとき y に 1 が入る保障はないな
0064デフォルトの名無しさん
2005/11/30(水) 02:49:46class foo {
foo() {//1
x = 1;
y = x;
}
foo() : x(1), y(x) {}//2
int x;
int y;
};
の場合、どちらもyに1が入ることは保証されている。
0065デフォルトの名無しさん
2005/11/30(水) 03:03:06int a[4][2]={{1,2},{3,4},{5,6},{7,8}};
と初期化するみたいにいい方法はないですか?
いちいち
a[0][0]=1;
a[0][1]=2;
a[1][0]=3;
・・・
はめんどうなんですけど
0066デフォルトの名無しさん
2005/11/30(水) 03:03:19そもそもこれ意味あるのか?
0067デフォルトの名無しさん
2005/11/30(水) 03:12:29個人的にはちょっとした構造体のときにメンバ変数と引き数を揃えることでシンプルになるのが気に入ってるが。
>>65
・構造体にして一次変数を初期化→代入
・構造体にしてカンマ演算子をオーバーロードして一気に代入
・いちいち代入する部分を関数にして、引き数をずらずら並べる
ってところじゃないかな。
0068デフォルトの名無しさん
2005/11/30(水) 03:23:37初期化されないっつーか不定だな
0069デフォルトの名無しさん
2005/11/30(水) 03:51:41例えばa[ ]とb[ ]に一度に1 2 3 4 5 6みたいに入れたいのですが。
ポインタはまだわからないです。
cout<<"ベクトルを2つ入力 -->";
for(j=0;j<c;j++)
{
cin>>a[j]>>b[j];
}
自力だとこうなのですがエラーが出て…
0070デフォルトの名無しさん
2005/11/30(水) 04:18:35a[]とb[]を同じにするなら、cin >>a[j]; b[j] = a[j];
0071デフォルトの名無しさん
2005/11/30(水) 04:37:02for(j=0;j<c;j++)
{
cin>>a[j];
}
b=a;
0072デフォルトの名無しさん
2005/11/30(水) 04:38:43class foo {
foo() : y(x),x(1) {}
int x;
int y;
};
こう書いても保証されるんだっけ。
0073デフォルトの名無しさん
2005/11/30(水) 04:41:49007473
2005/11/30(水) 04:42:210075デフォルトの名無しさん
2005/11/30(水) 04:42:34初期化リストで保証されているのは、リストに書いた順に初期化が行われること。
007672
2005/11/30(水) 04:47:19いつからそんな仕様になったの?
0077デフォルトの名無しさん
2005/11/30(水) 04:52:51知ってる限り、最初から。
いつならこんな仕様じゃなかったの?
0078デフォルトの名無しさん
2005/11/30(水) 04:55:33メンバ初期化子の順序は無視され、クラスの宣言に現れた順に初期化が行われるはず。
紛らわしいから同じ順番で書けってのがセオリー
0079デフォルトの名無しさん
2005/11/30(水) 04:59:43int x;
int y;
foo() : x(y),y(1) {}
};
ということは、これは不定?
0080デフォルトの名無しさん
2005/11/30(水) 04:59:46> 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).
0081デフォルトの名無しさん
2005/11/30(水) 05:00:48class foo {
int x;
int y;
foo() : x(x),y(y) {}
};
これも不定だってば。
0082デフォルトの名無しさん
2005/11/30(水) 05:03:11不定
0083デフォルトの名無しさん
2005/11/30(水) 05:03:14多分最初から。
プログラミング言語C++は持ってないけど、Effective C++にも一項使って書いてある。
クラスの宣言なのはメンバのデストラクタ呼び出しの順番を固定するためだって。
>81
それはこれのことだろ。
Point(int x, int y) : x(x), y(y) {}
不定じゃない。
0085デフォルトの名無しさん
2005/11/30(水) 07:33:210086デフォルトの名無しさん
2005/11/30(水) 07:41:280087デフォルトの名無しさん
2005/11/30(水) 09:48:04x,yって名前も適当に付けてんだし
0088デフォルトの名無しさん
2005/11/30(水) 11:49:520089デフォルトの名無しさん
2005/11/30(水) 12:10:50そんな消極的な理由で必要なわけじゃない。
基底クラスやメンバを初期化するために必要。
0090デフォルトの名無しさん
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; // 自分で再度投げる
}
}
};
0091デフォルトの名無しさん
2005/11/30(水) 17:12:18>>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);
この辺までで詰まってます…
0092デフォルトの名無しさん
2005/11/30(水) 17:12:27初めて知った
Thanks!
0093デフォルトの名無しさん
2005/11/30(水) 17:45:15実はコンストラクタ・デストラクタの中では全てのメンバはconstでないという扱い。
だからといって初期化子を使わなくて良いということではないが。
0094デフォルトの名無しさん
2005/11/30(水) 20:44:00{
virtual void g() {}
void f()
{
// お世話になります。
// g がオーバーライドされていればgを呼び出す。
// って事をしたいのですが、オーバーライドされた事を調べるにはどうしたら
// 良いのでしょうか?
// if(g != A::g) 見たいなシンプルな判定方法があれば教えてください。
}
};
struct B : A
{
void g() { /* いろいろ */ }
};
0095デフォルトの名無しさん
2005/11/30(水) 20:59:25デフォルトのA::g()の中身が空なら、何も考えずにg()を呼べばいいのでは?
009694
2005/11/30(水) 21:11:19肝心な事を忘れていました。
gにパラメータを渡すのですが、そのパラメータの計算が結構長いのです。
gが空ならその計算ごと省略したいので、どうにかならないかと考えた訳です。
0097デフォルトの名無しさん
2005/11/30(水) 21:29:37これって結局は「fの振る舞いが型によって異なる」ということなのだから、
fを仮想関数にして、Aを継承した型が自分のf()の中でg()関連を
担当するべきなんじゃないでしょうか。
0098デフォルトの名無しさん
2005/11/30(水) 21:46:22みたいな、良くある演算子オーバーロード使用のループを
hoge0.x = hoge1.x * hoge2.x * 0.5;
hoge0.y = hoge1.y * hoge2.y * 0.5;
みたいな感じで展開してみたら、泣けるくらい実行速度が速くなりました。
計算式がまちまちな上、計算自体数百行に及ぶので、
可読性を考えると圧倒的に前者の方が助かるのですが、さりとて速度も欲しいところでして。
なにか両者を共にいただけるような方法ないッスかねぇ。
0099デフォルトの名無しさん
2005/11/30(水) 22:13:00プログラム設計には2段階あって、論理設計と物理設計の二つ。
論理設計では上の方法が好ましいんだけど、性能面(物理設計)でダメと
いうことか。
演算子オーバーロードの処理が重いんだろ。
>なにか両者を共にいただけるような方法ないッスかねぇ。
ない!(笑)
0100デフォルトの名無しさん
2005/11/30(水) 22:16:22もしインライン関数でなければインライン関数にしておく。
010199
2005/11/30(水) 22:24:43なるほど、その手があったか。
演算子オーバーロードに対してinline使えたっけ?
0102デフォルトの名無しさん
2005/11/30(水) 22:25:59だって関数だもん。
010398
2005/11/30(水) 22:41:04お二人?とも、ありがとやんす〜。なるほど2段階っすか、まさに。
とりあえずinline指定してみました。が、私のやり方がまずのかなぁ…。
なんか余計なコピーでも発生してそうなので、EffectiveC++片手にもう少し詰めてみます。
0104デフォルトの名無しさん
2005/11/30(水) 22:45:30遅延評価を使えばできそうな気がする。
0105デフォルトの名無しさん
2005/11/30(水) 23:00:54今使ってる処理系の complex ヘッダを読むのが解への最短距離かも。
>>140
行列ライブラリではよく使われるけど98みたいな単純な例だと逆効果にならない?
0106105
2005/11/30(水) 23:10:210107デフォルトの名無しさん
2005/11/30(水) 23:15:14ttp://homepage1.nifty.com/herumi/prog/prog82.html
0108105
2005/11/30(水) 23:41:59参考になりました。URLの根っこのところをお気に入りに入れました。
>N = 4 なら全部計算してしまうようで
というところが気になったんだけど、調べてみたら
#pragma inline_depth(255)
で解決しそう。
0110デフォルトの名無しさん
2005/12/01(木) 01:37:48{
void f1();{f2();}
void f2(){/*長い関数*/};
};
このクラスのf1を呼ぶとf2を呼んだあとf2の1行目で落ちます。
デバッグするとアセンブルコードのところで落ちていました。
しかし長い関数の部分を削除してf2の先頭3,4行のコードを残して実行すると落ちません。
おかしいですよね。削除する前は1行目で落ちていたのに、削除したら落ちないんですから。
こんなことは5年の経験で初めてです。
いったい何が原因ですか?
0111デフォルトの名無しさん
2005/12/01(木) 01:46:100112デフォルトの名無しさん
2005/12/01(木) 01:49:18長い関数f2()を単独に実行するとどうなんでしょうか?
f1()がくさいような気がします。
どこかプログラムでぶっ壊してる?特に内部変数あたり。
0113デフォルトの名無しさん
2005/12/01(木) 01:51:290114デフォルトの名無しさん
2005/12/01(木) 02:00:27f1()で変なところを壊してないか確認すること。
配列のMAXを超えてデータを格納していないかとか、文字列の扱いとか。
あと、ポインタ変数の処理がきちんとされているかとか。
0115デフォルトの名無しさん
2005/12/01(木) 02:43:29public:
A();
virtual ~A();
private:
init();
};
というようなクラスを定義して、
そのコンストラクタで、プライベートメソッドを呼び、その中で一括して初期化したりmallocしたり
しても良いでしょうか? (例えばメンバー変数に可変長文字列のポインタを用意し、そこに
mallocした領域に初期化文字列を入れる等の処理)
A::A() {
init();
}
このクラスを使用するとリンカエラーが出て困っております
0117デフォルトの名無しさん
2005/12/01(木) 03:43:16実は質問内容はよく分からないが
複数のコンストラクタで共通する部分をinit()などに分けて
各コンストラクタ内部でそれを呼び出すのは、よくある手法。
>>116
exportが事実上存在しない現在、
複数ファイルで使うテンプレートは全てヘッダに書くのが鉄則。
0119デフォルトの名無しさん
2005/12/01(木) 04:02:39最近マイブームで、
定義をfoo.h、実装を別のヘッダ(foo.hpp)に分けて書いて、
・hppをincludeして使う時は普通にインライン実装。
・hのみをincludeして使う時は、
どこか適当なソールファイルでhppを使って明示的インスタンス化。
とかやってる。
0120デフォルトの名無しさん
2005/12/01(木) 04:48:13単独で実行すると同じように落ちました。
>>113
スタックですか。
>>114
はいf1はf2を呼び出すだけです。
極力直前に処理をさせないようにしたんですが(↓)落ちてしまいます
static hoge* h = new hoge;
int WINMAIN()
{
MSG msg;
HACCEL hAccelTable;
h->f1();h->f2();を直接呼び出しても同じ結果
return 0;
}
こうなるとf1以前にはhogeのコンストラクタしか呼び出されないので、コンストラクタを見ましたがコンストラクタでは何も処理をしていません。
かつて無いほど頭をひねりましたがわかりません。いつもならうっかりミスですぐ見つかるのですが・・・
0121デフォルトの名無しさん
2005/12/01(木) 04:56:54int WINMAIN()
{
hoge* h = new hoge;
MSG msg;
HACCEL hAccelTable;
h->f1();h->f2();を直接呼び出しても同じ結果
return 0;
}
0122デフォルトの名無しさん
2005/12/01(木) 04:59:24はい同じでした。
0123デフォルトの名無しさん
2005/12/01(木) 05:05:03int WINMAIN()
{
hoge h;
h.f2();
return 0;
}
0124123
2005/12/01(木) 05:05:550125デフォルトの名無しさん
2005/12/01(木) 05:10:46試しましたが同じでした。
引数はありません。
0126123
2005/12/01(木) 05:11:230127デフォルトの名無しさん
2005/12/01(木) 05:20:34あとは自分でなにか見落としがないか探してみます。解決できたら報告させてください。
0128デフォルトの名無しさん
2005/12/01(木) 05:21:350129123
2005/12/01(木) 05:28:540130デフォルトの名無しさん
2005/12/01(木) 05:31:37>>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です。
0131123
2005/12/01(木) 05:35:36int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
);
0132デフォルトの名無しさん
2005/12/01(木) 05:41:50紛らわしい書き方で申し訳ありません。レスに書くときは引数を略していました。
0133デフォルトの名無しさん
2005/12/01(木) 05:45:10そのアドレスっておまいさんのモジュールか?
0134デフォルトの名無しさん
2005/12/01(木) 05:54:0802a88058()
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()
よくわかりませんが呼び出し履歴はこのようになっています
0135デフォルトの名無しさん
2005/12/01(木) 06:25:38かってに省略なんかせずにソース晒せ
0136デフォルトの名無しさん
2005/12/01(木) 09:15:28コンストラクタ・デストラクタの中でも const メンバは const だよ。
0137デフォルトの名無しさん
2005/12/01(木) 11:08:08あるクラスのメンバ関数を、プロジェクトのグローバル領域から、
クラスのポインタを通さずに呼び出す事は可能でしょうか。
0138デフォルトの名無しさん
2005/12/01(木) 11:14:48そのメンバ関数が静的なら問題なくできます。
0139137
2005/12/01(木) 11:50:38すばやい回答ありがとうございます。
ですが、質問の大事なところを端折っていました…orz
申し訳ありませんが、もう一度質問を…。
現在C++でActiveXDLLを作製しています。
DLLの呼出元はVBプログラムなのですが、
この時に、クラスを介せずに直接、クラスのメンバ関数を
呼出できないか、というのを調べています。
よろしくお願いします。
0140デフォルトの名無しさん
2005/12/01(木) 11:58:13そのメンバ関数が静的ならその関数を然るべき手段で呼び出せばいいと思います。
#具体的な方法は環境依存につき割愛。然るべきスレでどうぞ。
0141デフォルトの名無しさん
2005/12/01(木) 12:53:48Sub Hoge
foo
End Sub
int stdcall foo()
{
return Bar::bar();
}
class Bar {
public:
static int bar();
};
・・・みたいな
0142137
2005/12/01(木) 16:26:40回答ありがとうございます。
141さんの例を参考に現在構築していますが、
ActiveXDLLとして参照できるものを作るには、色々必要なようです。
色々と試行錯誤してみます。
ありがとうございました。
0143デフォルトの名無しさん
2005/12/01(木) 16:33:460144137
2005/12/01(木) 17:48:13回答ありがとうございます。
実は、VB側はすでに完成しています。
VBですでに作製してあるActiveXDLLを、
C++に移植するという事をやっているため、
呼出側は基本的にそのままという方針なんです。
そういう訳で、クラスを介さない呼出とか、考えなければいけないんですが。
0145デフォルトの名無しさん
2005/12/01(木) 18:24:56頼むからいい加減スレ違いだと言う認識を持ってくれ。
つーか、C++に移植する段階でクラスを使わなければいいだけだろうが。
#で、ついでにextern "C"と。
0146デフォルトの名無しさん
2005/12/01(木) 20:31:54ATL-COM IUnknown IDispatch GUID Single-Thread-Apartment
0147デフォルトの名無しさん
2005/12/01(木) 21:20:05std::string に格納されている「先頭の」空白文字を除去するにはどうすればいいのでしょうか?
空白文字は複数あることも、全くないこともあります。
0148デフォルトの名無しさん
2005/12/01(木) 21:22:030149147
2005/12/01(木) 21:54:370150デフォルトの名無しさん
2005/12/01(木) 22:22:34string s = " hoge";
string n;
n = s.substr(s.find_first_not_of(" \t"));
とか?
0151デフォルトの名無しさん
2005/12/01(木) 23:00:10激しくムダな気が
0152デフォルトの名無しさん
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());
みたいな形なら、間違いなく問題は無いはず。
0153デフォルトの名無しさん
2005/12/01(木) 23:22:07仕様では、charT*を引数とするoperator=は
*this = basic_string<charT, traits, Allocator>(pointer_to_string);
を行うことになっている。
つまり、一時オブジェクトが作られ、それがthisに代入されることが保証されている。
0154デフォルトの名無しさん
2005/12/01(木) 23:34:18安心して良いって事だね。
0155デフォルトの名無しさん
2005/12/01(木) 23:35:280156デフォルトの名無しさん
2005/12/01(木) 23:38:18効率最悪
0157デフォルトの名無しさん
2005/12/02(金) 00:01:13文字列が丸ごとコピーされるとは限らないよ
リファレンスカウントによる実装もある
0158デフォルトの名無しさん
2005/12/02(金) 00:02:25部分文字列まで考慮したRefCountの実装って相当面倒な気がするんだけど、
実際のSTLの実装で使われてたりするんかな?
0159デフォルトの名無しさん
2005/12/02(金) 00:12:358Rはいくらなんでも王者をバカにしすぎやわ
7R
6-2 30000
12R
1-3 10000
1-5 20000
0160159
2005/12/02(金) 00:20:14誤爆や
0161デフォルトの名無しさん
2005/12/02(金) 12:00:08efficient 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*()の定義を、最適化されやすいよう変えてみては。
0162105
2005/12/02(金) 20:38:47コンパイル時に右辺の変数の値が確定している場合 expression template
を使えば、よく出来たコンパイラならコンパイル時に左辺値を計算するため
最高の実行速度と最小のコードサイズを得ることが出来る。
というのが >>107 の紹介したページの主張(の一部)だと。
0163デフォルトの名無しさん
2005/12/03(土) 00:38:07C++ でストレートに書いて問題になったことなどないのだが
0164デフォルトの名無しさん
2005/12/03(土) 07:21:27>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が必要なほどのケースは滅多に存在しない.
0165110
2005/12/03(土) 07:46:15長い関数の最初で、ある型の自動変数に同じ型の参照を代入していたせいでした。
コンパイルエラーにならないけど壊れるんですね。
0166デフォルトの名無しさん
2005/12/03(土) 10:13:29いいサイト紹介してくれてありがとう。
ただその引用の箇所は例えば boost::lambda あたりを揶揄してるっぽいので
可読性と一時オブジェクト生成コストのトレードオフについての論評じゃないと思う。
0167デフォルトの名無しさん
2005/12/03(土) 11:11:08WinProc 内(WM_KEYDOWN / WM_SYSKEYDOWN)にて
検出しようというのは間違っているのでしょうか。
0168デフォルトの名無しさん
2005/12/03(土) 11:25:32このスレで聞くのも間違ってる
0169デフォルトの名無しさん
2005/12/03(土) 12:06:370170デフォルトの名無しさん
2005/12/03(土) 12:44:18class A
{
private:
A();
public:
static A* Create()
{ return new A; }
};
これはどういうことでしょうか?
static関数って通常は非staticメンバ関数を呼び出せないですよね
0171デフォルトの名無しさん
2005/12/03(土) 13:07:42どこで非staticなメンバ関数を呼び出してるの?
0172デフォルトの名無しさん
2005/12/03(土) 13:13:520173デフォルトの名無しさん
2005/12/03(土) 13:19:430174デフォルトの名無しさん
2005/12/03(土) 13:34:220175デフォルトの名無しさん
2005/12/03(土) 14:44:51インスタンス化したときになんでコンパイルエラー出ないのか?
ってことを言いたいんだと思うのだが、それの答えは。
staticメンバ関数は friend みたく非公開メンバにアクセスできるから。
0176デフォルトの名無しさん
2005/12/03(土) 14:53:09その文面を「暗黙の this-> を省略できない」と読みかえればいいだにょん。
0177170
2005/12/03(土) 15:03:40なるほど。
理解できました。ありがとうございました。
0178デフォルトの名無しさん
2005/12/03(土) 16:34:52質問:
http://pc8.2ch.net/test/read.cgi/prog/1129609762/440
よろしくおながいします。
学生ではなく現在はH/W設計もかけもちしています。
長年プログラムを組んで食ってきましたが、オブジェクト指向の言語は未経験です。
0179デフォルトの名無しさん
2005/12/03(土) 16:44:18推薦図書スレ行ったら・・・と言おうとしたけど荒れてるね。
演習的なのをやりたいのならExceptional C++かな?
ただWisdomSoftのを読んだだけだと厳しいかもしれない。
#マ板の割にはいいレス付いてるなw
#俺がひどいスレしか見てないだけかもしれんが。
0180デフォルトの名無しさん
2005/12/03(土) 17:41:19失礼しました。
0181デフォルトの名無しさん
2005/12/03(土) 17:43:44K&Rは感動の良書で、そんな演習の入ったC++本を探していますが、
気に入ったもの見つからないのです。
K&Rは1章の問題(1日で踏破できた)をやるだけで、ひととおり
C言語プログラムが書けるように工夫して書かれてました。
コンストラクタ、ディストラクタの概念などは、C言語にはなかったじゃない
ですか。なのでC++仕様の大きさには感心しています。
ただ正直のところは、クラスの定義について、どのような考え方で
システム構成を構築するか、あるいはシステムをどのように分割して
クラスに分解する?・・・みたいな考え方も知りたいところです。
あとは、どんなの応用を想定して、クラスの継承をできるようにC++ではしているのか、
その根本的思想を知りたい、と思います。
なお、
マ板は、読むと精神的に良くないのですが、酷い会社環境で
苦労している人(自分もそう)の話から、自分の知らない
世の中の現実から、学べ取れるものがあります。
0182デフォルトの名無しさん
2005/12/03(土) 17:48:39大雑把に言えば、C++の基礎文法はこんなとこ。後ろに行くほど分野によって不要だったりもする。
上記でまだ分からないものがあれば、ウェブなり、入門書なりでまずは補完すること。
このレベルなら独習シリーズでいいんじゃね?
で、C++の機能の多くはオブジェクト志向の実装のためにあるわけだからオブジェクト指向もかじっ
ておかないと、意味わからないことも多いと思われる。
ただし、組み込みみたいに特殊な分野だと、また文化が違ったりするから、目的がはっきりしている
なら、その点ハッキリさせて質問したほうがいいと思われ。
0183デフォルトの名無しさん
2005/12/03(土) 17:55:22>システム構成を構築するか、あるいはシステムをどのように分割して
>クラスに分解する?・・・みたいな考え方も知りたいところです。
>あとは、どんなの応用を想定して、クラスの継承をできるようにC++ではしているのか、
>その根本的思想を知りたい、と思います。
それはもう言語の話じゃないな。
0184デフォルトの名無しさん
2005/12/03(土) 18:08:080185デフォルトの名無しさん
2005/12/03(土) 18:19:48デストラクタ処理で終了待ちのループさせるとかしか思いつかんけど。
0186デフォルトの名無しさん
2005/12/03(土) 20:32:08環境依存の話はスレ違いなのです。。。
【初心者歓迎】C/C++室 Ver.24【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1131691023/
こちらへどうぞ
0187デフォルトの名無しさん
2005/12/03(土) 21:02:38言語仕様や文法がどうこうというのを気にするんじゃなくて
オブジェクト指向とはどういうものか、というのを一度
言語という枠を超えて(SmalltalkとかRubyとか)勉強して、
理解してからC++に戻ってきても遅くないと思うよ。
0188デフォルトの名無しさん
2005/12/04(日) 01:39:42{
public:
int i;
A( int _i ):i( _i ){};
A(){ A(1); }
};
A a;
printf("%d\n", a.i );
で分けわからない数値が出力されます。
コンストラクタ内で別のコンストラクタを呼び出すのはダメなんでしょうか?
0189デフォルトの名無しさん
2005/12/04(日) 01:40:420190デフォルトの名無しさん
2005/12/04(日) 03:33:48呼び出しても一時オブジェクトが生成されるだけだよ。
デフォルト引数使って逃げるか、init() みたいな関数に共通処理をくくり出すか(初期化じゃなくなっちゃうけど)かな。
0191デフォルトの名無しさん
2005/12/04(日) 06:24:58{
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; };
};
0192デフォルトの名無しさん
2005/12/04(日) 09:57:430193デフォルトの名無しさん
2005/12/04(日) 10:12:550194188
2005/12/04(日) 11:45:37解りました。ありがとうございました。
0195デフォルトの名無しさん
2005/12/04(日) 12:14:25どこだか忘れたけど、C++入門なんて偉そうに書いてるWebSiteでその手の間違いを堂々と書いてたな。
ご丁寧に勘違いに基づいた結果に合うようなサンプルまで用意して。
もしあんたがそのサイトで勉強しているならとっととそのページをブックマーク、キャッシュごと捨ててしまえ。
0196デフォルトの名無しさん
2005/12/04(日) 14:39:380197デフォルトの名無しさん
2005/12/04(日) 14:46:06(というより、自分は結構詳しいと勘違いしているから)
0198デフォルトの名無しさん
2005/12/04(日) 14:57:14http://www.amazon.co.jp/exec/obidos/ASIN/4797328541/
>>178はこれら読むしかないんじゃないの?
それかオブジェクト指向の本
0199デフォルトの名無しさん
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のコンストラクタ
.
.
.
*/
}
"ココ"の文っていろいろ調べたんですが、載ってなくて。
こういう初期化の書き方ってありなんでしょうか。
それとも何か別の意味があるんでしょうか。
0200デフォルトの名無しさん
2005/12/04(日) 15:09:42初期化リストでぐぐってみ。
基底クラスのコンストラクタを呼び出す意味と、メンバを初期化する意味がある。
0201199
2005/12/04(日) 16:01:30デフォルトコンストラクタを持たないクラスのオブジェクト、
const 宣言されたメンバ、リファレンスメンバ
はメンバ初期設定リストによって初期化されなければならない。
0202デフォルトの名無しさん
2005/12/04(日) 16:36:08そんな限定的に使うんじゃなくて、なるべく全部
初期化リストで初期化するようにしような。
0203デフォルトの名無しさん
2005/12/04(日) 18:17:300204デフォルトの名無しさん
2005/12/04(日) 18:27:350205デフォルトの名無しさん
2005/12/04(日) 21:22:37そもそもPODじゃないデータを初期化でコピーした記憶が無かった
0206デフォルトの名無しさん
2005/12/04(日) 21:54:35int KANSUU(hoge *a){}
という関数があった場合hogeを継承したhogehogeクラスを引数にとることはできるんでしょうか?
0207デフォルトの名無しさん
2005/12/04(日) 21:55:430208デフォルトの名無しさん
2005/12/04(日) 23:50:50継承を理解していればそんな質問を投げないぞ。
0209デフォルトの名無しさん
2005/12/05(月) 00:09:48つ http://www.pearsoned.co.jp/washo/prog/wa_pro51-j.html
これは誰も紹介しないのか……初心者にちょうどいいとおもうけど。
0210デフォルトの名無しさん
2005/12/05(月) 00:12:21Thinking in Javaが名著なだけに、是非読んでみたいと思ってるんだけど
邦訳が出てないようだし・・・
原著買うしかないかなぁ
0211デフォルトの名無しさん
2005/12/05(月) 00:32:27クラス情報がどのようにメモリに配置されるかなどを図で説明した本はないでしょうか?
0212デフォルトの名無しさん
2005/12/05(月) 00:45:10EffectiveC++にもvptr周りは図付きで説明されてた気がするが
もうちょっと詳しく知りたいならARMかD&Eじゃね?
0213デフォルトの名無しさん
2005/12/05(月) 02:04:32ARMはともかくD&Eなら近くの本屋さんにあると思うので調べてみます。
ありがとうございました
0214デフォルトの名無しさん
2005/12/05(月) 02:06:330215デフォルトの名無しさん
2005/12/05(月) 02:14:57ARM http://www.amazon.co.jp/exec/obidos/ASIN/4901280392/
D&E http://www.amazon.co.jp/exec/obidos/ASIN/4797328541/
0216デフォルトの名無しさん
2005/12/05(月) 02:16:02D&E : The Design And Evolution of C++ : C++の設計と進化
0217デフォルトの名無しさん
2005/12/05(月) 04:00:21>ARM : The Annotated C++ Reference Manual : プログラミング言語C++
邦訳タイトルが違う >>215 が正しい
0218デフォルトの名無しさん
2005/12/05(月) 05:26:34"vtable c++"でぐぐってみるとか。手っ取り早く知るにはまずこれ。
0219デフォルトの名無しさん
2005/12/05(月) 05:28:560220デフォルトの名無しさん
2005/12/05(月) 07:13:51typedef {
int (*func)(int param);
}funcList[]={
func1,func2,func3・・・
};
int callFunc(int funcNum,int param)
{
return funcList[funcNum].func(param);
}
のような実装をC++のクラスでできますか?
関数ポインタによるリスト化したいのは protected なメソッドです。
そのクラスは継承されるのが前提でひとつのプログラム内部で複数のインスタンスが生成されるのでクラスの外に定義するのはしたくありません。
switch文で分岐もメソッド数が200以上になりそうなので実用的でないし。
0221デフォルトの名無しさん
2005/12/05(月) 07:37:47ttp://www.emit.jp/prog/prog_cpp0.html
0222デフォルトの名無しさん
2005/12/05(月) 08:02:08地震の前兆です
0223デフォルトの名無しさん
2005/12/05(月) 11:47:41class 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() );// おかしい!
}
0224デフォルトの名無しさん
2005/12/05(月) 11:55:22cygwin g++ 3.4.4 で動かしたら 123 が3個表示された。
ただし、先頭に #include <cstdio> を足した。
なんかマイナーなコンパイラ使ってる?
0225223
2005/12/05(月) 11:58:05どうもbase_1のthisポインタがsizeof(other)だけずれるんです。
0226デフォルトの名無しさん
2005/12/05(月) 13:26:120227デフォルトの名無しさん
2005/12/05(月) 13:38:10public:
0228223
2005/12/05(月) 14:12:51自分の環境だけでなかったので、コンパイラの癖みたいなものでしょうか?
いろいろおかしいところはあって、
・func3()で base::get() とか base_1_type::get() だと問題は発生しない。
・たとえばotherとかにメンバ関数get()を持たせると問題は発生しない。
・base内でのtypedefをprivateにしてもコンパイルビルドはできてしまう。
・派生させるクラスの順序によって症状が変わる
もともと、base_1はtemplateだったんですが、単純化するとこうなりました。
template名が長かったのでtypedefしたんですが…
0229デフォルトの名無しさん
2005/12/05(月) 15:10:07http://lab.msdn.microsoft.com/productfeedback/SearchResults.aspx?stype=1&fields=1&category=11
このページの下のほうにバグレポートなるリンクがある。
0231181
2005/12/05(月) 20:53:07情報はすべてメモしました。
今日はとりあえず、先日見つけたWEBの演習を始めました。
今日はコンストラクタ関数と、そのオーバーロードによる
初期化の具体的やり方がわかりますた。
実際に演習で組むと、頭が良くなったような錯覚に陥りますw
紹介いただいた本は、本屋さんで眺めてから、自分に合うか
見極めようと思います。
0232デフォルトの名無しさん
2005/12/05(月) 21:37:400233デフォルトの名無しさん
2005/12/05(月) 23:12:12fstreamでファイルから読み込みをする際に
区切り文字を設定する事はできないのでしょうか?
csvのファイルを読み込むときはどうしたら良いのかわからなくて…。
スペース区切りがデフォルトですよね?
0234デフォルトの名無しさん
2005/12/05(月) 23:18:34たとえばboost::tokenizer
0235デフォルトの名無しさん
2005/12/06(火) 00:40:220236デフォルトの名無しさん
2005/12/06(火) 01:42:04getlineでできそうでした。
ありがとうございました。
0237181
2005/12/06(火) 23:44:29http://wisdom.sakura.ne.jp/programming/cpp/
ここを全部、読解しました。
昨日から、下の演習をやっています。最初のほうは飛ばして、クラスから
はいっています。
http://www.sist.ac.jp/~suganuma/learn/enshu.htm
・・・ここも探しあてにけっこう時間かけて苦労して見つけました。
0238デフォルトの名無しさん
2005/12/07(水) 00:01:37OOなんて出番なさそうな演習だな。
0239232
2005/12/07(水) 01:11:33>>237
http://wisdom.sakura.ne.jp/programming/cpp/ を読んでみた。
今まで見たC++入門サイトの中では最高の部類だとおもた。よく見つけてきたなぁ。
http://www.sist.ac.jp/~suganuma/learn/enshu.htm も読んでみた。
ちょっとあれだけど・・・。実際C++で良質の演習問題を提供するって難しい。
0240デフォルトの名無しさん
2005/12/07(水) 01:13:05それのCの方を見たことあるが、
一部用語が統一されてなかったりして、
書いてる本人もわかってるのかいなってところがあったが・・・。
0241デフォルトの名無しさん
2005/12/07(水) 01:16:10Rogue Wave
0242デフォルトの名無しさん
2005/12/07(水) 01:19:19>実際C++で良質の演習問題を提供するって難しい。
禿本の演習問題があるじゃん
0243デフォルトの名無しさん
2005/12/07(水) 01:26:260244239
2005/12/07(水) 01:30:28ごまかしはあるけどあからさまな嘘は書いていないので好印象。
レイアウトに気を配って重要なところに自然に目がいくように
配慮されているとこがすごく良いと思った(印刷物だとお金が掛かるのでやりたくても出来ない)。
0245デフォルトの名無しさん
2005/12/07(水) 01:33:120246239
2005/12/07(水) 01:42:02Rogue Wave が tools++ を提供しているところで
エピステーメーが推奨しているってとこまでは知ってるけど・・・
Rogue Wave が日本語の演習問題を出しているのか?
Rogue Wave 有名すぎて調べにくいぞ。
0248デフォルトの名無しさん
2005/12/07(水) 02:37:35問1
自動販売機を分析して、C++で制御プログラムを作成せよ。
問2
エレベータシステムを分析して、C++で制御プログラムを実装せよ。
各 6時間
0249デフォルトの名無しさん
2005/12/07(水) 02:41:46w
0250デフォルトの名無しさん
2005/12/07(水) 04:37:400251デフォルトの名無しさん
2005/12/07(水) 07:49:230252デフォルトの名無しさん
2005/12/07(水) 07:57:14>ただし、綺麗で保守的なプログラムを書きたいのであれば
>適当な位置で変数を宣言するのではなく、ブロックの先頭でまとめて宣言するべきです
こんなこと書いてるよ。
0253デフォルトの名無しさん
2005/12/07(水) 08:11:52保守的っていうがC89からの習慣や伝統を守るっていう意味だと正しいだろ。
0254デフォルトの名無しさん
2005/12/07(水) 08:14:44そもそも変数の宣言箇所についてはC言語の伝統を守ること自体が間違いだと思われ。
0255デフォルトの名無しさん
2005/12/07(水) 08:54:200256デフォルトの名無しさん
2005/12/07(水) 09:05:34健全だと思われ
0257デフォルトの名無しさん
2005/12/07(水) 13:07:33実際のコーディングに関してわからない点があるため質問をさせてください。
変更が不可能な既存のクラスClassAとClassBがすでに存在し
コード中で
ClassA a;
ClassB b;
a=b;
あるいは
b=a;
などのように代入演算子を使えるようにしたいとします。
その場合にはClassAとClassBを継承するクラスをそれぞれ作成し
代入演算子をオーバーロードするしか方法はないのでしょうか?
0258デフォルトの名無しさん
2005/12/07(水) 13:15:54friend使えば継承しなくていい。
0259デフォルトの名無しさん
2005/12/07(水) 13:16:56かなりおかしな事をしなくてはいけない。
0260257
2005/12/07(水) 13:44:36ならないため使えませんでした。
ClassAとClassBはヘッダファイルも含めてまったく変更不可という場合には
やはり継承クラスを作って対処するしかありませんか・・・?
0261257
2005/12/07(水) 13:52:07それぞれのクラス内のデータは適当な関数などを使って取り出せるので
アクセス権限などは問題になりません
0262デフォルトの名無しさん
2005/12/07(水) 14:36:45なぜ代入演算でなければならないのですか?
どう考えても設計ミスなので他の手段を考えましょう。
0263デフォルトの名無しさん
2005/12/07(水) 14:41:190264デフォルトの名無しさん
2005/12/07(水) 14:53:43privateメンバはどうやってアクセスするの?friendしかないでそ。
0265デフォルトの名無しさん
2005/12/07(水) 15:10:26>>261
0266263
2005/12/07(水) 15:11:110267257
2005/12/07(水) 16:02:12>>263
たしかにおっしゃるとおりだと思います。
代入演算子を使おうと思った理由は、ClassAとClassBが本質的には
同じ内容のデータを管理するからです。具体的には顧客情報です。
>>264
それぞれのクラスには取り出しようの関数と格納用の関数が備わっているので
privateメンバでも問題はありません。
このクラス設計がおかしいのは私も承知しておりますが
引き継いできたソース(変更不可)を流用せよという指示があるので
こうせざるを得ません。
C++流のエレガントな記述方法があるのではないかという思いから
書き込ませてもらいました。
こういう場合は263の方法をとるのが一番最適なのでしょうか?
0268デフォルトの名無しさん
2005/12/07(水) 16:46:10>こういう場合は263の方法をとるのが一番最適なのでしょうか?
設計者とプロジェクトリーダーをぶん殴る
0269デフォルトの名無しさん
2005/12/07(水) 16:50:110270デフォルトの名無しさん
2005/12/07(水) 17:48:33class TestClass;
っていう文法を見たんですが、
これってC++標準ですか?
みたところ、TestClassがクラスだよとコンパイラに教えて、
ヘッダーインクルードは実装部(.cpp)にのみしてるっぽいんですが、
そういう使い方ですか?
0271デフォルトの名無しさん
2005/12/07(水) 17:50:510272デフォルトの名無しさん
2005/12/07(水) 17:59:21AとBを保持するclassCでも作ったら?
>>270
普通に使う。
0273270
2005/12/07(水) 18:29:29標準構文ですか。
「class」がキーワードなのでググルでも調べれなくて困ってますた。
でもヘッダーファイルに実体宣言するとエラーで、
使えるのはポインタ宣言だけなんですね。
C++言語文法自体がポインタ嫌いなので、
ちょっと不整合な感じもしなくも無いですね。
でも、どうせBCB/VCL使ってるとクラスのポインタ使いまくりですが。
0274デフォルトの名無しさん
2005/12/07(水) 18:42:11単にグローバル(名前空間)な二項演算子をオーバーロードするだけでいけるんじゃないの?
0275デフォルトの名無しさん
2005/12/07(水) 18:49:520276デフォルトの名無しさん
2005/12/07(水) 19:09:01ファイルの内容は
日付 to 送信先IP from 送信元IP:port
です。
送信元IPだけを特定する手順を教えてくださる方いませんでしょうか?
0277デフォルトの名無しさん
2005/12/07(水) 19:09:55どっちかがポインタじゃないと、コンストラクタの呼び出しが終わらないでしょw
A -> A::B -> A::B::A -> A::B::A::B -> ...
0278デフォルトの名無しさん
2005/12/07(水) 19:18:01「from 」を検索して、その次の文字から「:」までの間を切り出すだけじゃないのか?
0279デフォルトの名無しさん
2005/12/07(水) 19:57:45そういうのはperlの18番でつ
0280デフォルトの名無しさん
2005/12/07(水) 20:37:30コンストラクタの呼び出しが終わらない、というか、そもそも
A の中に B のインスタンスが入り、 B の中に A のインスタンスが入る
という状況なのでクラスメンバの配置が確定しないんだな
0281デフォルトの名無しさん
2005/12/07(水) 21:05:00それは前方参照と言われる。
ちなみにポインタだけでなく参照も平気。
0282デフォルトの名無しさん
2005/12/07(水) 21:47:080283デフォルトの名無しさん
2005/12/07(水) 21:51:16やってしもた。
0285デフォルトの名無しさん
2005/12/08(木) 09:19:04説明サンクス。
参照でも良いのね。
でも、クラスで参照使うとコンパイルエラー出まくりで苦手。
自分vectorの1行取得位にしか使えない。
0286デフォルトの名無しさん
2005/12/08(木) 10:16:30んなこたぁない。
0287デフォルトの名無しさん
2005/12/08(木) 10:27:06そりゃ、おまいさんの頭がエラーだらけなんでそ。
0288285
2005/12/08(木) 10:41:070289デフォルトの名無しさん
2005/12/08(木) 11:40:38当たり前です。参照するものがあって始めて参照型を宣言できるわけですから。
そういうこともあるので、>252のようなことが書かれた入門講座はダメなのです。
0290デフォルトの名無しさん
2005/12/08(木) 11:42:31しているようですが、何故volatileが必要なんでしょうか?
0291276
2005/12/08(木) 14:56:37検索してfromをみつけることは分かったのですが、fromから次の文字を切り取るにはどうすればいいのでしょうか?
0292デフォルトの名無しさん
2005/12/08(木) 15:20:56たまに string str; に対し str = "";
という方法で文字列をクリアしてるのを見かけるのですが、
これは string::clear() を使うより効率がいいとかなんでしょうか?
また、string::reserve() で設定したサイズは
string::clear()で解除されたりするんでしょうか?
以上、よろしくお願いします
0293デフォルトの名無しさん
2005/12/08(木) 16:26:27前者は特に規格では規定されていないが、効率は多分clear()の
方が速いだろう。単に見やすさのために空文字列を代入していると
思われる。
後者は、非強制的な要求であり、必ずしも解除されるとは保証
されていない。reserve()で確保した領域を解除するには、
str.clear();
str.swap(str);
と二段階のステップを踏むとよい。
0294デフォルトの名無しさん
2005/12/08(木) 16:36:11的確な返答ありがとうございました。
0295デフォルトの名無しさん
2005/12/08(木) 16:37:10std::string().swap(str);
と書けば、1ステップで、string::reserve で確保された領域を
解放できる。
また、特に string::clear せずに string::swap を適用した場合は、
”きっちり詰められる”事は規格では保証されていない。2の累乗の
大きさとか、要するに処理系依存の領域になる。
0296デフォルトの名無しさん
2005/12/08(木) 17:50:23public:
virtual Foo() = 0;
};
class Concrete : public Base {
public:
Foo() { Bar(); }
};
という具合になってて
Base* base = new Concrete;
base->Foo();
とか
Concrete c;
Base& b = c;
b.Foo();
とかがいけるのはわかるのだけど
Base& base = Concrete;
base.Foo();
みたいにまとめて書くことはできないのでしょうか?
g++だとコンパイルは通らないけど、
VC++だとコンパイルが通って動いてしまうのが謎
0297デフォルトの名無しさん
2005/12/08(木) 17:54:39VC++って6か?7.1か?
6なら糞だぞ。そんなコードを通すなら、安心してプログラムができない。
0298デフォルトの名無しさん
2005/12/08(木) 17:56:37Base& base = Concrete;
これ通るのはまずいような....
非const参照に一時オブジェクトが束縛されている
0299デフォルトの名無しさん
2005/12/08(木) 18:00:12cygwin環境とVC++と、両方でコンパイルできるように書いてますが、
他にもこりゃー間違いだろ、というコードをプログラマの意図を汲んで(?)
通してくれたことがありました
あれは何だったっけなあ・・・
>>298
そうそう
g++だと、そういうエラーメッセージが出ます
0300デフォルトの名無しさん
2005/12/08(木) 18:01:46boostがよく通るので、出た当時は喜んでいたものだが。
0301デフォルトの名無しさん
2005/12/08(木) 18:25:07こっちで出たけどよそでも出てないかなと気になる。
0302デフォルトの名無しさん
2005/12/08(木) 18:33:09private:
boost::function<void ()> fn;
public:
void Foo() {
// fn = boost::bind(Foo, this);
fn = boost::bind(&Test::Foo, this);
}
};
VC++7.1だと上のコメントアウトでもコンパイルが通るんだけど
文法的には可?不可?
0303デフォルトの名無しさん
2005/12/08(木) 20:33:40ISO的には不可。
0304デフォルトの名無しさん
2005/12/08(木) 20:47:01補足しておくとISO/IECの5.3.1.3のNote参照。
gccでは、MFCでその形式が使われているのに対処するために
-fms-extensionsオプションをつけることでコンパイルを通せる。
どちらにしろ独自拡張(拡大解釈?)。
0305デフォルトの名無しさん
2005/12/08(木) 21:47:17詳細な解説ありがとう
MFCでも使われてるのか・・・
0306デフォルトの名無しさん
2005/12/09(金) 05:05:33Level4なら警告がでるはず
0307デフォルトの名無しさん
2005/12/09(金) 08:50:50class SingletonHolder {
static PtrInstanceType pInstance_;
...
};
PtrInstanceType SingletonHolder::pInstance_;
という感じの宣言をしておいて、
pInstance が NULL かどうかでインスタンスを作るか選択しています。
このようにグローバルスコープ?で宣言した変数は、
明示的に初期化しなくても0が入っている、とみなして良いでしょうか?
gccやVCでテストした限りでは、グローバルスコープで宣言した変数は
初期化しなくても0が入っているようです
また、それを前提として、グローバルスコープに下記の記述をしても良いのでしょうか
b.cppでは、ptrがNULLで初期化されていることを前提にしています
明示的な代入で値を入れる場合、異なる翻訳単位では初期化順が不定になるようですが、
この場合、代入で初期化しておらず、その規則が当てはまるのかわかりません。
-- a.cpp --
void *ptr
-- b.cpp --
int TestValue() {
if (ptr == NULL) ptr = new TestClass();
return ptr->GetValue();
}
int n = TestValue();
0308デフォルトの名無しさん
2005/12/09(金) 10:35:24C++だとそれに加えて、クラスのメンバ変数がデフォルトコンストラクタで初期化されるとNULLになる。
0309デフォルトの名無しさん
2005/12/09(金) 10:50:17C++の場合は0と言え。
0310デフォルトの名無しさん
2005/12/09(金) 11:27:100 と言ってはいけない理由でも?
0311デフォルトの名無しさん
2005/12/09(金) 11:27:530312デフォルトの名無しさん
2005/12/09(金) 11:35:36そんくらいぐぐれ
0313デフォルトの名無しさん
2005/12/09(金) 11:44:23レスサンクス
その自動で0に初期化されるタイミングは、
他のグローバルスコープの(明示的な)初期化が実行されるより前、
と考えて良いのでしょうか
0314デフォルトの名無しさん
2005/12/09(金) 11:46:060315デフォルトの名無しさん
2005/12/09(金) 13:25:53頼むからEffectiveC++に書かれている内容くらい理解してからレスしてください。
0316デフォルトの名無しさん
2005/12/09(金) 13:53:56Effective C++ のどこ? もし25項って言うつもりなら「いけない」と「べきじゃない」を混同してない?
0317デフォルトの名無しさん
2005/12/09(金) 14:04:580318デフォルトの名無しさん
2005/12/09(金) 14:22:05まぁどっちゃでもいいんだけど
0319デフォルトの名無しさん
2005/12/09(金) 14:29:040320デフォルトの名無しさん
2005/12/09(金) 14:37:58C++の設計と進化P291〜
コンパイラの定義によっては、まずい事がある。
0321デフォルトの名無しさん
2005/12/09(金) 14:40:42NULL を 0 と define してしまうようになっているから問題ない。
0322デフォルトの名無しさん
2005/12/09(金) 15:00:250323デフォルトの名無しさん
2005/12/09(金) 15:04:530324デフォルトの名無しさん
2005/12/09(金) 15:05:05スマソ、その本持ってないんだ。概要だけでいいので説明頼む。
0325デフォルトの名無しさん
2005/12/09(金) 15:09:41§18.1.4
The macro NULL is an implementation-defined C++ null pointer constant
in this International Standard.180)
180) Possible definitions include 0 and 0L, but not (void*)0.
0326デフォルトの名無しさん
2005/12/09(金) 15:11:070327デフォルトの名無しさん
2005/12/09(金) 15:11:15>>320に書いてある事は>>325と同じ。
つまり、(void*)0はC++ではNULLには使えない。それだけ。
0328324
2005/12/09(金) 15:30:44サンクス。でもそれは知ってるわ。
このレベルで規格に準拠してないような処理系について考えてたらキリが無さそうなので、
もうちょっと本質的な例がほしかった。それなりに仕様に準拠してやつでもヤバイような。
0329デフォルトの名無しさん
2005/12/09(金) 15:48:55そうそう。漢ならexportとかもガンガン使ってコーディングするよな。
0330デフォルトの名無しさん
2005/12/09(金) 15:49:330331デフォルトの名無しさん
2005/12/09(金) 16:13:140332デフォルトの名無しさん
2005/12/09(金) 16:29:370333デフォルトの名無しさん
2005/12/09(金) 16:38:210334デフォルトの名無しさん
2005/12/09(金) 16:46:080335デフォルトの名無しさん
2005/12/09(金) 16:46:190336デフォルトの名無しさん
2005/12/09(金) 17:06:060337デフォルトの名無しさん
2005/12/09(金) 17:17:07printf(fmt, 0, (char)0, (void*)0, (int*)0, (int(*)())0);
0338デフォルトの名無しさん
2005/12/09(金) 17:32:570339デフォルトの名無しさん
2005/12/09(金) 17:42:06#define NULL 0
#else
#define NULL ((void *)0)
#endif
0340デフォルトの名無しさん
2005/12/09(金) 18:06:240341デフォルトの名無しさん
2005/12/09(金) 18:38:530342デフォルトの名無しさん
2005/12/09(金) 18:51:09#undef NULL
#define NULL 0
#endif
0343デフォルトの名無しさん
2005/12/09(金) 19:02:45include順によってはとんでもないことになりそうだな
0344デフォルトの名無しさん
2005/12/09(金) 19:08:240345デフォルトの名無しさん
2005/12/09(金) 21:43:30と ) | | ミノガストオモッタカ
Y /ノ 人
/ ) < >__Λ∩
_/し' //. V`Д´)/
(_フ彡 / ←>>341
0346デフォルトの名無しさん
2005/12/09(金) 23:21:070347デフォルトの名無しさん
2005/12/10(土) 00:35:23void f0(void);
void f1(int);
}f;
boost::functionでメンバ関数のクラスポインタを束縛した関数オブジェクトが
ほしいのですが、
boost::function0<void> ff0(メンバ関数ポインタ,クラスポインタ);
と書けないのはなぜなのでしょうか?
bind(&F::f0,&f)
bind(&F::f1,&f,_1)
とすればできるのですが、引数の数に応じて_1,_2,_3....としていかないと
いけません。
何か手はあるのでしょうか?
0348デフォルトの名無しさん
2005/12/10(土) 00:58:28>引数の数に応じて_1,_2,_3....としていかないと いけません。
それ以前に、引数の数が変わると function の型も変わります。
function0<void> f0(bind(&F::f1, &f));
function1<void, int> f1(bind(&F::f1, &f, _1));
だから、面倒くささは function のコンストラクタを
メンバ関数ポインタ等を受け取るように拡張しても結局変わらないと思います。
> boost::function0<void> ff0(メンバ関数ポインタ,クラスポインタ);
> と書けないのはなぜなのでしょうか?
この変換は boost::bind の仕事であって boost::function の仕事ではないと
boost の人たちが考えているからではないでしょうか。
0349347
2005/12/10(土) 02:16:34なるほど。
Function<void(int)>という記法にこだわる限り
コンストラクタで受け取るまで型(クラス)がわからないから
メンバ変数にできないのからああいう仕組みになってるのかも。
Class<F>::Function<void(int)>という感じでクラス情報があれば
メンバ関数ポインタとクラスポインタをFunctionに持てるんだろうけど...。
0350デフォルトの名無しさん
2005/12/10(土) 03:42:39ttp://www.amazon.co.jp/exec/obidos/ASIN/4797328541/249-0385649-2590737
0351デフォルトの名無しさん
2005/12/10(土) 04:18:26本人のHPに発音したWAVがあるよ。
0352デフォルトの名無しさん
2005/12/10(土) 04:26:440353デフォルトの名無しさん
2005/12/10(土) 04:29:59How do you pronounce "Bjarne Stroustrup?"
http://www.research.att.com/~bs/bs_faq.html#pronounce
上記のfaqで本人の発音も聞くことができる。
「ビョーン」より「ビャーネ」の方が近いと思う。
名前の後半部分は「スト *ラウ* ストラップ」より「スト *ル* ヴストルップ」の方が
英語圏では理解されやすいらしい。
0354デフォルトの名無しさん
2005/12/10(土) 04:48:120355デフォルトの名無しさん
2005/12/10(土) 08:36:55boost::mem_fn
0356313
2005/12/10(土) 11:18:19どうかご教授お願いします。
グローバルスコープに宣言した値型の変数は0に初期化されると教わりましたが、
この初期化タイミングはどうなるのでしょう。
-- a.cpp --
int a = 3;
-- b.cpp --
int b;
-- c.cpp --
int c = a;
int d = b;
という場合、
1. プログラムの起動時に a, b, c, d が 0 で初期化
2. a, c, d の代入による初期化が行われる (順序は不定)
3. c は 0 が入るか 3 が入るかわからない
4. d は必ず 0 が入る
5. プログラムのエントリポイントに入る
という認識で合っていますでしょうか?
0357デフォルトの名無しさん
2005/12/10(土) 11:34:490358デフォルトの名無しさん
2005/12/10(土) 12:18:370359デフォルトの名無しさん
2005/12/10(土) 12:19:533で初期化しているジャン。
0360デフォルトの名無しさん
2005/12/10(土) 12:29:390361デフォルトの名無しさん
2005/12/10(土) 12:45:27(3.6.2) を厳密に解釈すると
1. a, b, c, d が 0 で初期化 (zero-initialization) される.
2. a が 3 で初期化される.
("static initialization" のうちの "constant expression" による初期化)
3. c, d がこの順で各々 a, b で初期化される.
("dynamic initialization".ただし実装は,この初期化をエントリポイント以降で
真に初期化が必要とされる瞬間まで遅延することが許される)
になるかと思います.従って,c == 3 も保証されるかと思います.
0362356
2005/12/10(土) 13:29:57>>361
なるほど・・・
c が a に依存すると初期化が遅延される、といった仕組みがあるのですね
-- a.cpp --
std::list<int> istack;
int push() { istack.push(1); return istack.size(); }
-- b.cpp --
int b = push();
こんな感じ (b.cpp と同様のものが複数ある) のコードがあったのですが、
MSVC だと istack のサイズは 1 => 2 => 3 => 1 => 2
gcc だと istack のサイズは -127 => -126 => -125 => 1 => 2
といった具合で、内部的な依存があるとやはりまずいようですね
真っ先に 0 での初期化が入ることが規定されているのであれば、
istack をポインタにして対処できると思います。
勉強になりました。ありがとうございました。
0363デフォルトの名無しさん
2005/12/10(土) 13:32:01依存を見ているのではなく、
dynamic initialization の前に static initialization があるから
c == 3 は確定するのですね・・・
0364デフォルトの名無しさん
2005/12/11(日) 11:57:07switch-case文で、処理の割り振りをしようと思っているのですが
無論switchには、数値か文字定数しか使えないわけでして。。。
どなたか、if文での代用無しにこれを実現する方法がありましたら教えて下さい
0365デフォルトの名無しさん
2005/12/11(日) 12:24:54方法その1:std::map を使って文字列から関数ポインタまたはファンクタへ写像する。
0366デフォルトの名無しさん
2005/12/11(日) 13:39:190367デフォルトの名無しさん
2005/12/11(日) 14:50:50殆どが数行程度の処理の為、関数を作って飛ばさず
case文の中で処理しようと思っているので
>>366さんのやり方で、実装に取り掛かったのですが
case hash("aaa"): でもコンパイラに怒られます。。
「error C2051: case 式は、整数型定数でなければなりません。」
予め計算したテーブルを作るという手もありますが、、、どうにかならない物でしょうか
0368デフォルトの名無しさん
2005/12/11(日) 15:23:58>>366は
> 予め計算したテーブルを作るという手
を意図したのだと思われ。
0369デフォルトの名無しさん
2005/12/11(日) 15:31:23自分で計算するのがいやならtemplateでやってしまえ
0370デフォルトの名無しさん
2005/12/11(日) 15:52:50標準じゃないけどLoki::Factoryを使う
0371デフォルトの名無しさん
2005/12/11(日) 15:55:19数行程度でも(処理に名前を付けるつもりで)関数にしてしまうのが吉。
最適化なんざコンパイラに任せるのがよろしいかと。
0372デフォルトの名無しさん
2005/12/11(日) 16:17:51ええ、イヤなのでtemplateについて調べてみています。
実行時に再帰的に定数部分を計算させる?というもので
ハッシュを計算させれば達成できそうですね。
>>370,371
仰るとおり関数にしてしまえば、文字列と関数ポインタをまとめた
構造体を作るだけで解決できるんですけどね。
どうしてもやってみたかったという事で・・・
0373デフォルトの名無しさん
2005/12/11(日) 16:46:36実行時じゃなくてコンパイル時ね
0374デフォルトの名無しさん
2005/12/11(日) 21:42:06とりあえずハッシュ関数は簡単なもので、
Wikipediaのハッシュ関数というページにあるC言語で書かれた8行を
templateを用いてコンパイル時に計算させる関数に書き換えようとしています。
ぐぐると一番に出てきた、templateとenumを使い、コンパイル時に再帰的に
階乗を求めるやり方を参考に弄ってみていますが、
テンプレート引数には整数しか使えないとか、どうにも上手くいきません…
長々とすみませんが、案がありましたらもう一声頂ければと思います。
0375デフォルトの名無しさん
2005/12/11(日) 21:46:140376デフォルトの名無しさん
2005/12/11(日) 21:56:27そして、それが出来ないから、
完全ハッシュ関数を作って、その値をラベルに使えということだと思うが
それを何とかマジックナンバーではなくしたいんだろう。
俺はそんな無茶しないで
素直にmapなりを使うべきだと思うが。
0377デフォルトの名無しさん
2005/12/11(日) 22:02:05どのようなものを求めてるかをまとめます。
文字列(型は問いません)を受け取り、そのハッシュを作成し整数定数型で返す関数です。
"コンパイル時"に定数として埋め込まれる事を想定していることがポイントです。
できた関数は、enum { aaa = hash("aaa"), bbb = hash("bbb") } のような感じで使えることが理想なのですが…
ここまで書いたのですが、言いたい事は>>376さんのが全てです
無茶なのは承知の上ですが、ここまで来ると諦めが付かなくて。。
0378デフォルトの名無しさん
2005/12/11(日) 22:02:55そうしたくないケースもあるんだよね.速度気にする場合とか.
まあ,そういう時は string で渡すなとも思うけど・・・.
0379デフォルトの名無しさん
2005/12/11(日) 22:07:440380デフォルトの名無しさん
2005/12/11(日) 22:15:15混同するなって。
ハッシュ云々はコンパイル時にcaseの条件を定数にする話だよ。
0381デフォルトの名無しさん
2005/12/11(日) 22:19:01mapなりhashなりを使って文字列->定数への表を作っておいて
その定数部分をcaseのラベルにするという意味だろ。
0382デフォルトの名無しさん
2005/12/11(日) 22:45:36#include <stdio.h>
main()
{
char x[] = "bbbb";
switch(*((unsigned int*)x))
{
case 'aaaa':
printf("a*4");
break;
case 'bbbb':
printf("b*4");
break;
case 'cccc':
printf("c*4");
break;
}
0383デフォルトの名無しさん
2005/12/11(日) 22:46:40それはたまたまxがunsigned intのサイズと同じだったからでしょ?
0384デフォルトの名無しさん
2005/12/11(日) 23:05:120385デフォルトの名無しさん
2005/12/11(日) 23:06:090386デフォルトの名無しさん
2005/12/11(日) 23:07:550387デフォルトの名無しさん
2005/12/11(日) 23:11:45#include <stdio.h>
#include <string.h>
main()
{
char x[256] = "";
strcat(x, "aa");
strcat(x, "a");
strcat(x, "a");
switch(*((unsigned int*)x))
{
case 'aaaa':
printf("a*4");
break;
case 'bbbb':
printf("b*4");
break;
case 'cccc':
printf("c*4");
break;
}
}
0388デフォルトの名無しさん
2005/12/11(日) 23:19:48処理系依存なわけだが。
0389デフォルトの名無しさん
2005/12/11(日) 23:21:03'abcd'だけじゃなくて、'ab'がそもそも処理系依存だ。
もちろん'あ'とL'あ'も含めて。
0390デフォルトの名無しさん
2005/12/11(日) 23:21:550391デフォルトの名無しさん
2005/12/11(日) 23:23:55*(int *)"abcd" == 'abcd'
が成り立つとは限らないと言うこと。
もちろん、'abcd'が使われている時点で警告が出る処理系もある。
0392デフォルトの名無しさん
2005/12/11(日) 23:27:450393デフォルトの名無しさん
2005/12/11(日) 23:47:52えええ
L'あ'は平気だと信じてきたのに。
0394デフォルトの名無しさん
2005/12/11(日) 23:51:440395デフォルトの名無しさん
2005/12/11(日) 23:52:27そもそも文字列を定数式としてコンパイル時に評価すること自体できないんだから、
どうあがいても無理じゃね。
0396デフォルトの名無しさん
2005/12/11(日) 23:52:420397デフォルトの名無しさん
2005/12/11(日) 23:53:41それをやるトリックを教えれって話でしょ
0398デフォルトの名無しさん
2005/12/12(月) 00:14:16文字列自体を定数式にできないのなら、それをハッシュ数値にすればどうかという試みです。
templateでも何でもいいんですが、
コンパイル時にそのハッシュ値を計算させる事ができないものかと…
0399デフォルトの名無しさん
2005/12/12(月) 00:15:07マジでC++って糞だな
0400デフォルトの名無しさん
2005/12/12(月) 00:17:280401デフォルトの名無しさん
2005/12/12(月) 00:18:29とカギカッコつきでディレクションしたにもかかわらず
バカ、低脳、初心者未満と罵られて超カワイソ・・・
0402デフォルトの名無しさん
2005/12/12(月) 00:19:55じゃあswitch文で文字列つかえる言語でコード吐いてみな。
if-elseif・・・のチェインに展開されてるから。
0403デフォルトの名無しさん
2005/12/12(月) 00:46:18定数式でないものから定数式を作ることが無理だって解らない?
0404デフォルトの名無しさん
2005/12/12(月) 01:25:320405デフォルトの名無しさん
2005/12/12(月) 01:27:37そういう問題じゃないんだけど。
バカ?
0406デフォルトの名無しさん
2005/12/12(月) 02:27:36switch文なんか使うなよ。
0407デフォルトの名無しさん
2005/12/12(月) 07:33:08とりあえずD言語が文字列のswitchが出来るから試してみた(gdc -S test.d)。
吐き出したアセンブリを見ると2分探索で目的の位置を探していて、
if elseのチェインなんて非効率な実装じゃなかったです。
0408デフォルトの名無しさん
2005/12/12(月) 08:28:25struct static_hash1 { static const unsigned int value = (0*137+c0)%1987; };
template< char c0, char c1 >
struct static_hash2 { static const unsigned int value = ((0*137+c0)*137+c1)%1987; };
template< char c0, char c1, char c2 >
struct static_hash3 { static const unsigned int value = (((0*134+c0)*137+c1)*137+c2)%1987; };
template< char c0, char c1 = 0, char c2 = 0 >
struct static_hash : static_hash3<c0,c1,c2> { };
template< char c0 >
struct static_hash<c0> : static_hash1<c0> { };
template< char c0, char c1 >
struct static_hash<c0,c1> : static_hash2<c0,c1> { };
int main() {
char const *s = "ef";
unsigned int v = dynamic_hash(s);
switch (v) {
case static_hash<'a','b','c'>::value:
std::cout << "abc" << std::endl;
break;
case static_hash<'e','f'>::value:
std::cout << "ef" << std::endl;
break;
default:
std::cout << "default" << std::endl;
}
}
めんどいと思ったらBOOST MPL辺りを検索
0409デフォルトの名無しさん
2005/12/12(月) 08:47:35それぞれのcase文に埋め込めたとしても
完全ハッシュにするんだったら全文字列リテラルを受け取って
その何番目って感じでテンプレート引数つけて
毎回全部再実行するようなものになるんだろうな。
面倒すぎ
0410デフォルトの名無しさん
2005/12/12(月) 09:57:54C#(Microsoft(R) Visual C# .NET Compiler version 7.10.6001.4)でのテスト結果
選択肢が1〜7の場合:if〜else〜に展開
選択肢が8〜の場合:Hashtableを作成
0411デフォルトの名無しさん
2005/12/12(月) 10:14:37だから何だって言いたいんだろう・・・・スレ違いなんだが。
0412デフォルトの名無しさん
2005/12/12(月) 10:23:17まぁ、C++で同様の仕事を実現するのにどうすべきか考える参考には
なるんじゃない?
0413デフォルトの名無しさん
2005/12/12(月) 13:11:11結局map使えばいい話では
0414デフォルトの名無しさん
2005/12/12(月) 15:04:440415デフォルトの名無しさん
2005/12/12(月) 15:28:11いいえ。
>>377
>ここまで来ると諦めが付かなくて。。
こやつが諦めれば済む話です。
つか、
static const char* tbl[] = {
"aaa", // =0
"bbb", // =1
"ccc", // =2
};
int idx
for (idx=0; idx<sizeof tbl / sizeof *tbl; idx++)
if (strcmp(hoge, tbl[i]) == 0)
break;
switch (idx) {
case 0:
case 1:
case 2:
else
}
もうこれでいいよ。
0416デフォルトの名無しさん
2005/12/12(月) 15:59:22むかし川で溺れてるところをswitch文に助けられたとかそんなのか?
0417デフォルトの名無しさん
2005/12/12(月) 19:11:320418デフォルトの名無しさん
2005/12/12(月) 19:14:00まともに動く static hash なら効率は犠牲どころか向上すると思うけど
0419デフォルトの名無しさん
2005/12/12(月) 21:35:00そういうこだわりが昔俺もあった。
で、結局、非効率極まりない処理をあれこれシコシコ弄り倒して
悩んでたって事に気づいた時は愕然としたものだよ
0420デフォルトの名無しさん
2005/12/12(月) 21:42:02それを乗り越えた奴だけが先に進める
0421デフォルトの名無しさん
2005/12/12(月) 21:43:380422デフォルトの名無しさん
2005/12/12(月) 22:02:36ってか、「下手な考え〜」だと思ってたよ( ゚∀゚)'`,、'`,、
0423デフォルトの名無しさん
2005/12/12(月) 23:19:23そういうことに気付くのって結構重要な経験だと思うんだよね。
あれこれ試行錯誤することは、たとえ結果が失敗だとしても何もしないよりはずっといいよ。
0424デフォルトの名無しさん
2005/12/13(火) 02:36:51表記上の問題じゃない? 効率が少々犠牲になっても、表記がキレイになって
可読性・メンテナンス性が上がるなら選択肢としてありだと思うし。
あと、やっぱり抽象的なレベルで考えた時に switch な分岐を
コードに落とすときに if 列にせにゃならんってのはどうもすっきりせん。
0425デフォルトの名無しさん
2005/12/13(火) 16:58:30ハードディスクから読み込んだファイルに書いてある文字列を
配列に格納する方法がわかりません。
どなたかhelp me...
0426デフォルトの名無しさん
2005/12/13(火) 17:00:550427デフォルトの名無しさん
2005/12/13(火) 17:07:40ファイルポインタの使い方がんばって勉強してみます!!
0428デフォルトの名無しさん
2005/12/13(火) 17:25:080429デフォルトの名無しさん
2005/12/13(火) 18:26:20class MCIControl
{
private:
char mciStrBuffer[1024];
public:
char filename[256];
MCIERROR errorcode;
int open()
{
wsprintf(mciStrBuffer,"open \"%s\" alias test",filename);
errorcode = mciSendString(mciStrBuffer,NULL,0,NULL);
return 0;
}
int play()
{
errorcode = mciSendString("play test",NULL,0,NULL);
return 0;
}
int close()
{
errorcode = mciSendString("close test",NULL,0,NULL);
return 0;
}
};
のようなクラスを作って、main関数より位置的に上に書いたときはいい(うまく動作した)んだが、
別ファイルにすると当然ながらクラスの存在を認識できない。
変数をexternするように、別ファイルのクラスを認識させるにはどうしたらいいの?
0430デフォルトの名無しさん
2005/12/13(火) 18:51:410431デフォルトの名無しさん
2005/12/13(火) 19:20:280432デフォルトの名無しさん
2005/12/13(火) 19:27:44誰を殺すかは言わずもがな
0433デフォルトの名無しさん
2005/12/13(火) 19:35:57必ず0を返すんだ・・・
エラーコードを返さないでどうするw
0434デフォルトの名無しさん
2005/12/13(火) 19:41:52おいおい、マジでその提案はやめてくれよ。
三年ほど前に、とりあえずコピペし、include順などで名前が衝突したら
関数名の末尾に1や2や_newをつけて解決すればいいと豪語した奴がいる。
もちろん、効率(インライン展開の促進など)とは関係なく、な。
この考えを、Cどころかプログラムを知らないボスが承認してしまい
今みんなそのツケを払わされてる
0435デフォルトの名無しさん
2005/12/13(火) 20:02:52IHTMLDocument2
IHTMLDocument3
‥‥‥
なんて名前付けてるOSがある件について⊂(。Д。⊂⌒`つ
0436デフォルトの名無しさん
2005/12/13(火) 20:07:330437デフォルトの名無しさん
2005/12/13(火) 20:19:28>>429のソースをmcictrl.cppに移動して、
mcictrl.hにclass MCIControl;とだけ書いてmain.cppからインクルードしても変化なかった。
もしかして
private:
char mciStrBuffer[1024];
public:
char filename[256];
MCIERROR errorcode;
int open();
int play();
int close();
の部分だけmcictrl.hに移動して、mcictrl.cppの中に、
int MCIControl::open()
{
wsprintf(mciStrBuffer,"open \"%s\" alias test",filename);
errorcode = mciSendString(mciStrBuffer,NULL,0,NULL);
return 0;
}
というようにすればいいのだろうか?
0438デフォルトの名無しさん
2005/12/13(火) 20:19:590440デフォルトの名無しさん
2005/12/13(火) 20:51:34さらに拡張したらどうなります?
0441デフォルトの名無しさん
2005/12/13(火) 20:55:390442デフォルトの名無しさん
2005/12/13(火) 21:24:250443デフォルトの名無しさん
2005/12/16(金) 13:32:030444ハーピィ
2005/12/17(土) 18:44:570445デフォルトの名無しさん
2005/12/19(月) 19:50:48C++で書かれた一番有名なソフトウェアってなんですか?
Linux?
0446デフォルトの名無しさん
2005/12/19(月) 20:05:260447デフォルトの名無しさん
2005/12/19(月) 20:13:28有名なゲーム部門?も知りたいお。
0448デフォルトの名無しさん
2005/12/19(月) 20:14:180449デフォルトの名無しさん
2005/12/19(月) 20:19:09ttp://www.research.att.com/~bs/applications.html
ざっと目を通すと
Adobe 製品のほとんど、Amazon のシステム、google、
Mars rover driving system(多分ご本尊の方)、
Windows、MSOffice、Winamp、HotSpot Java VM、
OpenOffice、CDE、KDE、SETI@Home
「一番有名」なのはやっぱWindowsかな…。
0450デフォルトの名無しさん
2005/12/19(月) 20:29:04こんなページあるんすか。すげー。
ちなみにLinuxは書いてないけど、どうなの?
0451デフォルトの名無しさん
2005/12/19(月) 21:03:16手元のLinux-2.4.27のソースコードは、ぱっと見た感じC(≠C++)。
0452デフォルトの名無しさん
2005/12/19(月) 21:10:090453デフォルトの名無しさん
2005/12/19(月) 22:02:530454デフォルトの名無しさん
2005/12/19(月) 23:32:260455デフォルトの名無しさん
2005/12/20(火) 13:19:03socketでデータ通信したいのですが、構造体をパックして送る方法は柔軟性が無いので
シリアライズ化したいと思っています。
0456デフォルトの名無しさん
2005/12/20(火) 13:23:14つーか、シリアライズって汎用性あったっけ?
0457デフォルトの名無しさん
2005/12/20(火) 13:28:57テキスト化できないのです。
私も、テキスト化して、できればXMLか何かで送りたかったのですが、
所詮、プログラマなのでSEに逆らえません。
0458デフォルトの名無しさん
2005/12/20(火) 13:36:15MIMEエンコードで。つーか、SEは転送内容まで設計していないの?
#だとしたら無能だ。
あ、余り続くとスレ違いなので適当に。
そもそもバイナリ転送で設計されているならバッファに構造体からmemcpy()、
何も設計されてないならMIMEなりヘキサダンプなりでテキスト化が無難かと。
#ネットワークプログラミングスレ向きかな? 私は見てないのだけど。
0459デフォルトの名無しさん
2005/12/20(火) 13:42:51回答ありがとうございます
ちょっとそこら辺のキーワードで調べてみます。
0460デフォルトの名無しさん
2005/12/20(火) 14:39:16シリアライズとネットワークは直接関係は無いでしょ。
ファイルに書いて読んで同じ意味のオブジェクトが出来ればいいんだし、
後はそれを送受信すればいいだけ。
memcpy()ってポインタはどうすんのさ?
0461デフォルトの名無しさん
2005/12/20(火) 14:46:29>ファイルに書いて読んで同じ意味のオブジェクトが出来ればいいんだし
シリアライズに汎用性があるならそれでもいいかと。
>memcpy()ってポインタはどうすんのさ?
んなもん、適切にポイント先をコピーすればいいべさ。
要は、オブジェクトの型情報までは送る必要がないでしょ、と。
0462デフォルトの名無しさん
2005/12/20(火) 14:49:15MIMEってバイナリのテキスト化ですよね?
データの構造が決まっていて、構造体をパックして送っていたのを、
シリアライズ化し、送りたいのですが。
データの種類が増えるといちいち構造体を何百個も作るわけには
いかないのでシリアライズ化したいのです。
0463デフォルトの名無しさん
2005/12/20(火) 14:53:00ttp://www.s34.co.jp/cpptechdoc/article/serialize/
0464デフォルトの名無しさん
2005/12/20(火) 14:56:12ありがとうございます!大変わかりやすいです。
0465デフォルトの名無しさん
2005/12/20(火) 15:39:12boost::serializationはいいかも
0466デフォルトの名無しさん
2005/12/21(水) 00:03:31下のようにしても、最初の出力だけが5幅で、2つ目からは元に戻ってしまうのですが。
#include <iostream>
#include <iomanip>
using namespace std;
int main(){
cout << hex << setfill('0') << setw(5);
//cout.width(5); // これでもだめ。
cout << 10 << endl;
cout << 20 << endl;
cout << 30 << endl;
}
0467デフォルトの名無しさん
2005/12/21(水) 01:04:41widthだけは元に戻るのよん。諦めましょう。
0468デフォルトの名無しさん
2005/12/21(水) 03:31:280469デフォルトの名無しさん
2005/12/21(水) 06:05:51News 2005-12-19: The 2005-12 mailing is available (1600 kb tar.gz, .zip 1600 kb) individual papers
News 2005-12-17: The C++ Standard Library Issues List (Revision 40) is available (.tar.gz)
News 2005-12-17: C++ Standard Core Language Issues List (Revision 39) is available, also committee version
0470デフォルトの名無しさん
2005/12/21(水) 10:29:390471デフォルトの名無しさん
2005/12/21(水) 10:50:270472デフォルトの名無しさん
2005/12/21(水) 13:04:510473デフォルトの名無しさん
2005/12/21(水) 19:19:170474デフォルトの名無しさん
2005/12/21(水) 19:58:05strcpy(&x[0], "あいうえお");
strcat(&x[0], "かきくけこ");
0475デフォルトの名無しさん
2005/12/22(木) 09:28:35std::vector<char> ならOKなんだけどな
0476デフォルトの名無しさん
2005/12/22(木) 09:31:48>469 からの流れをよく読もうな。
0477デフォルトの名無しさん
2005/12/22(木) 10:25:58一発で変換できるから一応
std::string s(vect.begin(), vect.end())
0478デフォルトの名無しさん
2005/12/22(木) 18:13:57public:
void foo(void);
};
void main(void){
hg laser[10];
};
とかやると、メンバ関数foo()は10個、メモリに展開されるの?
0479デフォルトの名無しさん
2005/12/22(木) 18:16:10非仮想メンバ関数は、普通、this引数を余計に持つだけの通常の関数としてコンパイルされる。
0481デフォルトの名無しさん
2005/12/22(木) 18:39:12私はVB6とVB.net2003の経験しかありません。
C言語関連を学ぶには、Cから初めてC++に移行すべきでしょうか?
いきなりC++は無理ですか?
また、もうひとつ教えてほしいのですが、
Cと比べてC++は、どのような恩恵があるのですか?
私の知人からはCを薦められています。
たしかにCは基礎知識として必要だと思います。
C++の利点とか開発のしやすさとか、ありますか?
0482デフォルトの名無しさん
2005/12/22(木) 19:09:49プログラムとしての本質を学びたいならC++やると良いよ。面白い。
VBはGUIアプリに関しては楽といえば楽だし、それが仕事なら無理して覚える事も無いと思います。
開発で覚える必要があるなら、早いうちに覚えた方が楽ですね。
ちなみに、C・・・サブルーチンを関数としてまとめる事ができる、ポインタで変数の値を直接書き換えられる
C++・・・Cをオブジェクト指向にしたようなもの
大雑把杉ですが自分はこういう認識です。
0485デフォルトの名無しさん
2005/12/22(木) 19:49:54C++のCに対するメリット。
・型の拘束が強い。
・クラスを作れる。
・テンプレートを使える。
・演算子オーバーロードができる。
って書いてもよく判らんだろうから具体的に言うと、
間違いを指摘してくれるチャンスが増えてオブジェクト指向プログラミングができて
同じようなことを何度も書く(或いはコピペを繰り返す)ことを避けたプログラミングができる。
まぁ、やってみろ。いいものだ。
0486デフォルトの名無しさん
2005/12/22(木) 20:59:42むしろいきなりC++から初めてあとからCの制限の中でやってみることを
お勧め。色々工夫するからCの範囲の中でもかなり工夫する能力が上がる。
0487486
2005/12/22(木) 21:00:290488デフォルトの名無しさん
2005/12/22(木) 23:48:12const でクラス変数を宣言しても呼ぶことが出来るようになる事を知りました。
もしかして、ゲッターメソッドにconstを付けるのは常識だったりします?
また、データリードしか行わないメンバ関数には
constをなるべく付けた方が良いのでしょうか?
0489デフォルトの名無しさん
2005/12/22(木) 23:52:070490デフォルトの名無しさん
2005/12/22(木) 23:52:16struct B { /* 〜 */ };
struct C
{
A func()
{
B b;
return a_;
}
A a_;
};
C::funcで、bのデストラクタはa_の戻り値コピーの後に行われました。
この順番は保証されているのでしょうか?
0492デフォルトの名無しさん
2005/12/23(金) 00:46:32A, B, C, D, E
};
とした時に、HOGEに含まれる列挙子の数(=5)を
HOGEを後で変更しても支障が無いように求める事はできますか?
0493デフォルトの名無しさん
2005/12/23(金) 00:48:16A, B, C, D, E, END_OF_NUM
};
0494デフォルトの名無しさん
2005/12/23(金) 00:49:01まぁ、なんでもいいんだけど。
0495デフォルトの名無しさん
2005/12/23(金) 00:59:57ありがとうございました。
0496デフォルトの名無しさん
2005/12/23(金) 01:00:51A, B, C, D=100, E=200,
enum HOGE {
#include "hoge.csv"
};
const int HOGE_ARRAY[] = {
#include "hoge.csv"
};
const int HOGE_NUM = sizeof(HOGE_ARRAY)/sizeof(HOGE_ARRAY[0]);
...自分で書いてても、ちょっとどうかと思った。
0497デフォルトの名無しさん
2005/12/23(金) 05:13:22イエス。スコープ抜けたあとに解体処理が走る。
あと、structをclassの代わりに使うのはお勧めしない
(struct使うと、明示的にprivate指定しないと変数も関数も
フルオープンなので)。
0498デフォルトの名無しさん
2005/12/23(金) 10:39:27ありがとう。冷静に考えたらそうですよね。
>structをclassの代わりに使うのはお勧めしない
カキコするときpublic:を書くのが面倒くさくてstructにしました。
その辺は心得ています。
0499デフォルトの名無しさん
2005/12/23(金) 12:03:44テンプレートメタプログラミングを扱った本はないでしょうか?
0500デフォルトの名無しさん
2005/12/23(金) 23:07:220501デフォルトの名無しさん
2005/12/24(土) 00:04:360502デフォルトの名無しさん
2005/12/24(土) 00:15:400503デフォルトの名無しさん
2005/12/24(土) 01:29:02Concepts、Tools、and Techniques from Boost and Beyond
とか。これも英文だけど。中身はBoost MPLの解説だし。
0504499
2005/12/24(土) 11:45:37中学生程度の英語力しかない自分が読んで理解できるかな・・・
0505デフォルトの名無しさん
2005/12/24(土) 12:50:01っていう俺は低学歴DQNなんだろうか
0506デフォルトの名無しさん
2005/12/24(土) 13:09:520507デフォルトの名無しさん
2005/12/24(土) 15:14:59英会話でのボディーランゲージに当たるものとしてソースコードがあるという感じ。
0508デフォルトの名無しさん
2005/12/25(日) 01:15:45const CExtControlBar * CExtMiniDockFrameWnd::GetControlBarExt() const
関数の両方にconstがついてるけども、
左側は返り値に対してCONST。
だけども、右側のconstはどういう意味なの?
0509デフォルトの名無しさん
2005/12/25(日) 01:15:550510デフォルトの名無しさん
2005/12/25(日) 01:22:25hoge.GetControlBarExt();
が呼び出せるようになる。 右のconstがないとconstなオブジェクトに対して呼び出せない。
0511508
2005/12/25(日) 01:32:40ありがとうございます。
constなオブジェクトに対しては、通常のメンバ関数は呼び出せないんですね。
呼び出したい場合は、右にconstをつけると。
0512デフォルトの名無しさん
2005/12/25(日) 01:40:43書き換えないという意味では?
そのためconstオブジェクトが呼び出せる
0513デフォルトの名無しさん
2005/12/25(日) 02:27:54右にconstをつけたメンバ関数内でメンバ変数を変更してたりすると
コンパイルエラーが出る
0514デフォルトの名無しさん
2005/12/25(日) 02:31:260515デフォャ泣gの名無しさb
2005/12/25(日) 02:41:06エラーがでるたび mutable か。カオスだな。
0516デフォルトの名無しさん
2005/12/25(日) 03:01:58HOGE(BUF) << A << B << C << D << E;
といった感じの、阿呆げな作りにできるのでニッチな人には便利なコです。
0517デフォルトの名無しさん
2005/12/25(日) 03:07:130518デフォルトの名無しさん
2005/12/25(日) 04:56:31const_cast 一発で済ませたほうがよくないか?
0519デフォルトの名無しさん
2005/12/25(日) 10:14:020520デフォルトの名無しさん
2005/12/25(日) 10:23:54だからmutableが使えない環境で仕方なく使う。fake thisとか
0521デフォルトの名無しさん
2005/12/25(日) 13:33:140522デフォルトの名無しさん
2005/12/25(日) 15:16:270523デフォルトの名無しさん
2005/12/25(日) 17:42:39ある機能を薄くラップしたAクラスがあり、その機能の一部を制限し、かつ独自の機能を
追加したBクラスを作成したいとします。このときの実装方法として適切なものはどういうものでしょうか?
特に、制限するところで困ってます(´・ω・`)
プラン1.
class B : public A;
問題点:Aの機能をフルに使えてしまう(制限できない)。
Aに仮想関数xがあったとして、それを制限するために継承したとしてもb.A::x()とすれば呼び出し可能。
まぁコーディング規約としてそういう呼び出し方さえ禁止すれば問題ないんだけど。
なによりも、使用する側に回ったときに、Bのすべての機能についてAからどこが改変されたかを
Aの機能とは別に調べないといけない。
プラン2.
class B{A a;}として、使いたい機能はB::x(){a.x();}としてひとつずつ追加していく。
問題点?:has-a関係って何か間違ってるような気が・・・。
プラン3.
class B : private A;で、使いたい機能だけusing A::xする。プラン2よりは自然な気がする。
問題点:特に無いような気がするけど、ホントに今後困らないかよく分からない。
いいところ:usingしたメソッドはAのものであることが保障されてるのでBの使用者はAのメソッドに
関する知識がそのまま安心して使える。
今のところプラン3で実装しているんですが、なんか根本的に違うような気もしてます。
こういうときに定石としてよく使う方法とかパターンってありますか?よろしくお願いします。
0524デフォルトの名無しさん
2005/12/25(日) 17:47:44それさえ守られていれば、あたは少しのドキュメントでライブラリの使い方に直感を働かせることができる。
0525デフォルトの名無しさん
2005/12/25(日) 17:55:17{ ・・・ }
として、if_hoge 経由でアクセスさせるとか。
0526デフォルトの名無しさん
2005/12/25(日) 17:57:04Bクラスを、「Aクラスによって実装されるクラス」と捉えるならば、
Exceptional C++ 項目22のガイドラインに従って
継承を使う必要がある場合(BがAのprotectedメンバにアクセスする場合や、
仮想関数をオーバーライドする必要がある場合)を除いて
プラン2の包括を使うべき
0527523
2005/12/25(日) 20:06:36回答どうもありがとうございます。
526さんのレスを参考にしつつ、EffectiveC++の6章あたりを読んでたのですが、
ラッパクラスを使用して似ているけど別のクラスを作ろうとしていると解釈すれば、
"has-a"か"実装の手段とする"のどちらかの手法をとるようにすべきだと結論付けました。
で、よく考えたら一部機能を実装するためには継承する必要があるのでプラン2は駄目でした。
そんなわけで問題が見つかるまではこのまま3で行くことにしました。
どうもありがとうございました。
0528デフォルトの名無しさん
2005/12/25(日) 21:10:08これに何か引っかかりを感じるのって俺だけ?
まー詳細分からないからなんとも言えないけれど
0529デフォルトの名無しさん
2005/12/25(日) 21:42:570530デフォルトの名無しさん
2005/12/25(日) 22:20:00同意。一部機能を実装するだけでは
継承はふさわしくないな。has-aで十分。
0531デフォルトの名無しさん
2005/12/25(日) 22:30:53class B{
const &A a;
B(const &A x) : a(x){}
void x(){a.x();}
};
困ったらとりあえずこんな感じにしてるけどな、
使わない実装はコンパイル時に弾いてくれるかもしれないし。
0532デフォルトの名無しさん
2005/12/26(月) 22:26:47ま、tietewの過去ログ公開はいつかトラブると思ってたけど。
FreeMLで伏せ字にしているメールアドレスまで公開してるんだもんな。
0533デフォルトの名無しさん
2005/12/26(月) 22:33:31誰なんだろうなぁ。
しかしメーリングリストに投稿したのに、ログを削除してくれとは・・・
0534デフォルトの名無しさん
2005/12/26(月) 22:35:07そしたら誰だかわかるのに(w
0535デフォルトの名無しさん
2005/12/26(月) 22:39:46kwsk
0536デフォルトの名無しさん
2005/12/26(月) 23:30:00過去ログの削除完了してる。
0537デフォルトの名無しさん
2005/12/27(火) 00:11:04すげー気になる。
どの投稿NOが削除されたか分かるやついない?
過去ログは全部あるから、教えてくれたら晒してもいいぜ
0539デフォルトの名無しさん
2005/12/27(火) 00:34:41なんせこれだろ? もうバカかと!アホかと!
-----------------------------------------------
通知書
1. 貴殿管理下のメーリングリスト掲示板”C++:language&libraries”(あて先
[email protected])への私の参加においては、「FreeMLユーザー規約
(http://www.freeml.com/help/sinkiyaku.html)」(以下ユーザー規約)が、
メーリングリストの運営会社(GMOメディア株式会社、以下運営会社)との
唯一の合意文書です。
2. 貴殿ご指摘の"一般に公開"については、これが"ML情報"欄
http://www.freeml.com/ctrl/html/MLInfoForm/[email protected]
の"保存メッセージ: 一般に公開"を示すとの意味であれば、上記表示は
運営会社の表示であり、著作権に関する許諾を意味するものではござい
ません。
3. 著作物の複製権を貴殿に許諾した事実はございません。著作物の複製
権に関しては、ユーザー規約第9条(著作権等) 第2項に定める通りです。
4. 従って、貴殿から第三者への複製権許諾が事実ならば、著作権法に基
づく財産権の侵害にあたる旨を本日警告するものです。
5. 本件に関する違法状態の回復が速やかにはかられない場合、ユーザー
規約第14条(準拠法および管轄裁判所)にもとづく法的措置をとる旨、
予めご承知おき下さい。
6. 本状の受領について確認する旨をご連絡ください。確認連絡がない
場合には別途内容証明郵便にて本内容を貴殿に伝達致します。
平成17年12月26日
0540デフォルトの名無しさん
2005/12/27(火) 00:35:27手遅れだと思うな、正直。
0541デフォルトの名無しさん
2005/12/27(火) 00:36:54ちょっと……ね。もう遅いと思うよ。
0542デフォルトの名無しさん
2005/12/27(火) 00:37:24うん、わかってる。でも出所はひとつでも少ないに越したことはないと思うんで。
0543デフォルトの名無しさん
2005/12/27(火) 00:40:17流石にcppllとかしたらばとかに転載したらアレだとは思うが。
0544デフォルトの名無しさん
2005/12/27(火) 00:40:21IT系昔から関わってる(と思われる)人たちのMLでこんなこと起きるんだね〜
信じられんよ 漏れは
0545デフォルトの名無しさん
2005/12/27(火) 00:44:30複素数の配列を動的に作りたいのですが、
complexクラスを用いて作る方法って無いのでしょうか…?
std::complex<double> *cstr;
for(i=0;i<10;i++){
cstr[i] = new std::complex<double>;
}
上のようにするとstd::complex*に二項演算は定義さていない
との旨のエラーが出てしまい上手くいきません。
詳しい方、何卒宜しくお願いします。
0546デフォルトの名無しさん
2005/12/27(火) 00:46:59多分君がしたいのはこう
std::complex<double> *cstr = new std::complex<double>[10];
0547デフォルトの名無しさん
2005/12/27(火) 00:47:46new が返すのはポインタだよな。
二項演算子以前にやってることがおかしい。
0548デフォルトの名無しさん
2005/12/27(火) 00:49:04有難う御座いました!
0549デフォルトの名無しさん
2005/12/27(火) 00:50:08そのコードはcstr[i]ってどこにアクセスにいってるんだ…
vectorつかえば?
0550デフォルトの名無しさん
2005/12/27(火) 00:53:260551デフォルトの名無しさん
2005/12/27(火) 00:58:20過去に二次元配列ばかり作ってしばらくプログラムつくってなかったので
エラーが出て悩んでしまったのです。失礼しました。
0552デフォルトの名無しさん
2005/12/27(火) 01:00:18先頭要素のポインタは&cstr[0]
std:vectorの要素はメモリ上で連続してることが保障されています。
関数で一時的に使うバッファとか確保するときにはvector使うと便利
newだと、制御が帰る場所ごとにdelete呼ばないといけないけれど、
vectorでauto変数にしてしまえば関数抜けるときに開放してくれるので。
0553デフォルトの名無しさん
2005/12/27(火) 01:05:25二次元配列だろうが何だろうが>>545みたいに
確保してないアドレスにアクセスするのはおかしいですよ?
0554デフォルトの名無しさん
2005/12/27(火) 01:05:32削除された投稿って1個なの?
486-496がなくなってるみたいだけど・・
0556επιστημη
2005/12/27(火) 01:10:37僕の不行き届きで無様をお見せすることになりました。
無用なトラブルは極力避けたいと考えます。
これ以上の詮索をなさらぬよう、伏してお願い申し上げます。
0557デフォルトの名無しさん
2005/12/27(火) 01:12:23ちょっ・・おま・・
消されてもgoogleキャッシュとかで見えちゃうんだよ!
誰だかわかっちゃったじゃねぇか!
0558デフォルトの名無しさん
2005/12/27(火) 01:14:250559επιστημη
2005/12/27(火) 01:18:07今回の削除要求は投稿者のmail-adr.が、というわけではなく、
投稿された本文中に個人情報がふくまれているから、という理由でした。
tietewさんとこのログ表示にmail-adr.が含まれていることが直接の
問題ではなかった旨、添えさせてください。
事を荒立てるのは極力避けたいと思っています。
ご理解を賜りたく。
0560デフォルトの名無しさん
2005/12/27(火) 01:18:13そうなの
FreeMLと過去ログ両方ないのが252だったので252だと思ってたよ。
削除したのも1つのようだったし。
0561デフォルトの名無しさん
2005/12/27(火) 01:20:55252は元々無いよ。
webarchive とか google cache とかどうするつもりなんだろね>投稿者
0562デフォルトの名無しさん
2005/12/27(火) 01:21:20そうしないと書き込みの度に、このスレッドがスレッド一覧でトップに来るから。
0564デフォルトの名無しさん
2005/12/27(火) 01:24:47余計目立つよ?
0565デフォルトの名無しさん
2005/12/27(火) 01:25:31今までずっと公開されて来てるってのに。
ご丁寧にシグネチャに住所とかまで書いてさぁ〜
0566デフォルトの名無しさん
2005/12/27(火) 01:26:29会社の宣伝をしたかったんじゃないか。
その後世の中が物騒になったので消してくれと。
0567デフォルトの名無しさん
2005/12/27(火) 01:27:290568デフォルトの名無しさん
2005/12/27(火) 01:28:20ヤツの方だ、と思ったり思わなかったり。
0569デフォルトの名無しさん
2005/12/27(火) 01:34:08引っかかるけど、ちゃんと作者と連絡先が書いてあるんだよなぁ・・
なんでcppllに対してこんな態度とってんのこいつ?
しかも会社には自分の写真まで載せてるしさぁ〜。わけわかんね。
何が気に入らなかったんだ?
0570デフォルトの名無しさん
2005/12/27(火) 01:38:12もう多分手遅れでしょう。
あなたの削除の行動は浅慮だったとは思いますけれど、
過去ログの資産としての価値を認識し、削除の伺いを公に問う行動は
きちんと筋が通っているし、削除も迅速に(笑)対応しただけの話。
後はそれが晒されようがどうしようがあなたの管理責任の範疇外でしょう。
正直、後は野となれ山となれ。俺は知〜らないっと。
0571デフォルトの名無しさん
2005/12/27(火) 01:40:22このメーリングリスト用のシグネチャをつけて送信したとかじゃないか。
0572デフォルトの名無しさん
2005/12/27(火) 01:43:370573επιστημη
2005/12/27(火) 01:43:44> あなたの削除の行動は浅慮だったとは思いますけれど、
はい、いささか性急に過ぎたかと反省しています。
「いついつまでに削除せんと出るとこ出るぞ」と
先方からの通告を受けてからでも遅くはなかったのかも知れません。
「依頼に応じ、速やかに削除しました」と言い訳も立ちますけれど。
0574デフォルトの名無しさん
2005/12/27(火) 01:45:17まぁ、削除依頼主の期待に応えてあげただけなんだから、あんま気ぃを落とすなよw
0575デフォルトの名無しさん
2005/12/27(火) 01:46:01こいつの場合他(会社のWebSiteやvectorなど)のPublicな場所に<自分から>公開しているので、
たとえcppllでその情報が公開されても、警告を受ける筋合いはないんだが・・
0576デフォルトの名無しさん
2005/12/27(火) 01:47:44つーわけで、比較用に置いておく。
http://web.archive.org/web/*/http://www.tietew.jp/
0577デフォルトの名無しさん
2005/12/27(火) 01:49:10それってここに晒されても無問題ってことでFA?
0579デフォルトの名無しさん
2005/12/27(火) 01:52:17C++相談室の内容じゃないぞ、それは
ところで、聞いてるとその方は会社を持ってたり、
フリーソフト作ったり結構C++の技術力がありそうですね?
技術的な参考にしたいので、その方の作ったフリーソフトを
紹介してもらえませんか?
0581デフォルトの名無しさん
2005/12/27(火) 01:55:26うむ。その質問は That's make sense.
無問題ですな。誰か教えたったり。
0582デフォルトの名無しさん
2005/12/27(火) 01:55:440583Addicted to C++ ◆nrBjarne.g
2005/12/27(火) 01:57:060584デフォルトの名無しさん
2005/12/27(火) 01:58:13なんにしても cppll のログはお蔵入り、次に ML を建てるときには
入会申請時に「投稿したメールは公開されます」と明記して、承諾
してもらう方向ですわな。
早めに引っ越し先が見つかることを期待しとります。
0585デフォルトの名無しさん
2005/12/27(火) 01:58:450586デフォルトの名無しさん
2005/12/27(火) 03:02:55で、規約見直しはしたの?
CCの帰属 - 非営利 - 同一条件許諾 2.0 日本に同意させてから
投稿させるようにしたら?
0587デフォルトの名無しさん
2005/12/27(火) 03:06:27こんなん送られてきたらそりゃ、ビビッて相手の言う通りに削除するわなw
0588デフォルトの名無しさん
2005/12/27(火) 03:17:480589デフォルトの名無しさん
2005/12/27(火) 05:26:55残念ながら非標準だが
int deleteKorean(Person *target);
0590デフォルトの名無しさん
2005/12/27(火) 05:30:120591デフォルトの名無しさん
2005/12/27(火) 06:08:030592デフォルトの名無しさん
2005/12/27(火) 06:17:00そのヘッダを入れたプロジェクトは、必ず失敗します。法則の発動。
0593デフォルトの名無しさん
2005/12/27(火) 08:50:310594デフォルトの名無しさん
2005/12/27(火) 10:34:54ttp://jbbs.livedoor.jp/computer/5651/
0595デフォルトの名無しさん
2005/12/27(火) 12:28:28「横浜市緑区」
の人かい?
0596デフォルトの名無しさん
2005/12/27(火) 12:49:07いや、お前。メル欄含めて。
0597名無し募集中。。。
2005/12/27(火) 16:37:47今からでも入会させてくださいませ
0598デフォルトの名無しさん
2005/12/27(火) 16:54:070599デフォルトの名無しさん
2005/12/27(火) 17:41:040600デフォルトの名無しさん
2005/12/27(火) 18:07:140601デフォルトの名無しさん
2005/12/27(火) 21:37:090602デフォルトの名無しさん
2005/12/27(火) 22:22:530603デフォルトの名無しさん
2005/12/27(火) 22:31:390604デフォルトの名無しさん
2005/12/27(火) 22:52:59{
listHoge.push_back( Hoge() ); //listHogeはHoge型リスト
Hoge* created_hoge = &(listHoge.back());
sort(); //内部ではswap等を使ってコムソートしてます
return created_hoge;
}
今がチャンス。リストにHogeを追加し、追加したHogeへのポインタを返す関数を作りたいのですが、
上のだとsortした時に、created_hogeの内容が変わっちまって悩んでます。
なにか上手い手はないでしょうか。
0605デフォルトの名無しさん
2005/12/27(火) 23:02:56× std::sort
○ list::sort
0606デフォルトの名無しさん
2005/12/27(火) 23:22:24こんなご時世(spam他)なのにいつまでも公開したままなのは
申し訳ないが過去ログサイト管理人の怠慢としか思えないですよ。
0607デフォルトの名無しさん
2005/12/27(火) 23:22:48ここの意味がわからないんだがw
0608デフォルトの名無しさん
2005/12/27(火) 23:29:02> >>562
>
> あ、余計に目立たせてしまいましたか。
> 2chは初めてなもので。失礼しました。
>
ありぁ、このスレで答えてんのは全部επιστημηさんだとずっと思ってたよw
0609デフォルトの名無しさん
2005/12/27(火) 23:32:19同じクラス内のメンバ関数を呼ぶにはどう書けば良いのか、教えて欲しいです。
普通に呼び出そうとしても、ポインタを取ってきてもだめ・・・
0610デフォルトの名無しさん
2005/12/27(火) 23:34:53class Hoge {
static void fugo(void* hoge) {
Hoge* self = hoge;
self
Hoge hoge;
_beginthread(Hoge::fugo, hoge)
0611デフォルトの名無しさん
2005/12/27(火) 23:35:37すんません、どういう意味かよく…
sortはこちらのを使わせて貰ってます
ttp://www.s34.co.jp/cpptechdoc/article/sort/
>>607
いやー、ずっと書き込みづらい話題だったので>>603で待ってましたと
0612デフォルトの名無しさん
2005/12/27(火) 23:36:31class Hoge {
static void fugo(void* hoge) {
Hoge* self = hoge;
self->func()
}
Hoge hoge;
_beginthread(Hoge::fugo, &hoge);
やりようはいくらでもある。
0613デフォルトの名無しさん
2005/12/27(火) 23:47:37ありがとうございます。
見せて頂いたのはクラス外から呼び出した、スレッドのメンバ関数"の中"から
別のメンバ関数を呼ぶというコードだと思いますが、
class Hoge {
void fugo(void* p) {}
void hoge() { _beginthread(Hoge::fugo, 0, 0); }
};
このようにクラスのメンバ関数から、
別のメンバ関数を_beginthreadに使う方法がありましたらお願いしたいです。
上記だと、void (void *)からvoid(__cdecl *)(void*)に変換できません、と。。
0614デフォルトの名無しさん
2005/12/28(水) 00:12:54ttp://www.hey-to.net/ML-archive/vcppML/1999/msg10223.html
スレッドの中からまたメンバ関数を呼び出そうとも思っていたため、
>>612さんのはとても参考になりました。ありがとうございます。
0615デフォルトの名無しさん
2005/12/28(水) 05:40:46奴は逆にこのスレでは質問する立場になるだろうな。
正直なところ、このスレのほうが cppll よりも話題のレベル、
反応速度、最近では S/N 比までが優れていると思う。
0616デフォルトの名無しさん
2005/12/28(水) 10:42:560617デフォルトの名無しさん
2005/12/28(水) 11:00:33なんか策ない? >えぴの人とか道化の人とか
0618デフォルトの名無しさん
2005/12/28(水) 11:05:26いい加減他所でやれって。
知育発達不全なのか?
0619デフォルトの名無しさん
2005/12/28(水) 12:02:560620デフォルトの名無しさん
2005/12/28(水) 14:40:180621デフォルトの名無しさん
2005/12/28(水) 19:41:10一つのメンバ関数の定義だけを特殊化したいんですが、どうしたらいいんでしょうか?
0622デフォルトの名無しさん
2005/12/28(水) 19:50:09template<typename T>
struct a
{...}//ここに共通の機能
template<typename T>
struct b : a
{...};//bに差分の機能
みたいに書いてbを特殊化させるとか
0623622
2005/12/28(水) 19:50:55○struct b : a<T>
0624デフォルトの名無しさん
2005/12/28(水) 20:12:20やっぱそういう風にするしかないんですかね。ありがとうございます。
普通に一つづつの関数について特殊化できてもいい気がするんですけどね。
0625デフォルトの名無しさん
2005/12/28(水) 20:17:540626デフォルトの名無しさん
2005/12/28(水) 20:26:32定義を特殊化するのではなくて、
実装を特殊化するという方法なのでやりたいこととは違うかもしれんが。
#include<stdio.h>
template<typename T>struct A{void foo();};
template<typename T>
void A<T>::foo(){printf("foo\n");}
void A<int>::foo(){printf("int foo\n");}
int main(){
A<int*> c;
A<int> d;
c.foo();
d.foo();
}
0627デフォルトの名無しさん
2005/12/28(水) 20:43:52正にそういうことがやりたいです。
#include<cstdio>
template<typename T, class M>struct A{void foo();};
template<typename T, class M>
void A<T, M>::foo(){std::printf("foo\n");}
template<class M>
void A<int, M>::foo(){std::printf("int foo\n");}
//template<>
//void A<int, int>::foo(){std::printf("int foo\n");}
int main(){
A<int*, int> c;
A<int, int> d;
c.foo();
d.foo();
}
こうするとエラーなんですよね。コメントアウトしてるところは大丈夫なんですが。
0628デフォルトの名無しさん
2005/12/28(水) 22:31:08それがコンパイルエラーになるのはクラステンプレートの部分特殊化が抜けているからでは。
template<class M>struct A<int, M> {void foo();};
これを追加したらコンパイルできた(VisualC++2005Express)。
コメントアウトしてるのが大丈夫なのは関数テンプレートの特殊化と解釈されるからだと思う。
関数テンプレートの部分特殊化は出来ないというのが今の言語仕様だったはず。
0629デフォルトの名無しさん
2005/12/28(水) 22:39:47それはクラスごと特殊化してるんですよね。
一つのメンバ関数だけ特殊化したいので >>622みたくやるしかないですかね。
0630628
2005/12/28(水) 22:59:25関数テンプレートの全パラメータを特殊化するのであればメンバ関数でもできるけど、
部分特殊化を使いたいならクラス定義が必要ということです(これはC++文法の話)。
629さんの要求を推察するに、622さんのレスどおり継承ベースの手法があってるように思えます。
0631デフォルトの名無しさん
2005/12/28(水) 22:59:56メンバーテンプレート関数にすればいいだけでは。
0632デフォルトの名無しさん
2005/12/28(水) 23:54:42入門書の解説は適当だし他の本はそこら辺の知識を前提として書かれてて・・・
Cのポインタ本みたいにテンプレートについてもりもり書かれて比較的やさしい
ちょうどいい感じのないのかな
0633デフォルトの名無しさん
2005/12/29(木) 00:04:43C++Primer第3版(日本語)
英文でもよかったら、絶対お勧めなのが、
C++ Templates
0634デフォルトの名無しさん
2005/12/29(木) 00:42:210635デフォルトの名無しさん
2005/12/29(木) 05:16:43テンプレートの文法、型を置き換える程度のことしか知らない状態だったけど、
一通り読んだ後はテンプレートのコード見るのも苦にならなくなったな
まえがきでCTAssert見たときは、サッパリ意味不明でどうなることかと思ったものだが
template<cool>とか書いてあるし
0636デフォルトの名無しさん
2005/12/29(木) 13:29:38クラステンプレートの継承とか引数にテンプレートとかやっちゃってて
理解不能・・・
やっぱり>>633の挙げてる本読んでおかないとダメなのかな
0637デフォルトの名無しさん
2005/12/29(木) 15:16:12C++のクラスの継承についてお願いします。。
例えば
class A{ ... }と宣言され
class B:public A{ ... }としますと、
Aのコンストラクタ及びデストラクタ(もちろんprivateメンバもです)はコピーされませんよね?
0638デフォルトの名無しさん
2005/12/29(木) 15:22:12コピー?
0639デフォルトの名無しさん
2005/12/29(木) 15:22:36コンストラクタがコピーされるって何のこと?
0640デフォルトの名無しさん
2005/12/29(木) 15:25:03"継承"ですね
0641デフォルトの名無しさん
2005/12/29(木) 15:25:260642デフォルトの名無しさん
2005/12/29(木) 15:28:36調べ方
・コンストラクタの中で cout してみる
・B に A と同様の初期値を与えてみる
0643デフォルトの名無しさん
2005/12/29(木) 15:32:08一応動作検証して
BにはAのコンストラクタは継承されてない事は確認したのですが、仕様としてはどうなのかなーと
0644デフォルトの名無しさん
2005/12/29(木) 15:39:44http://www.jisc.go.jp/
0645デフォルトの名無しさん
2005/12/29(木) 18:07:31Base* b = new Derived;
...
delete b;
としたときに、~Derived()を呼び出してくれること。
0646デフォルトの名無しさん
2005/12/29(木) 18:09:05Bの構築時にAのコンストラクタは呼ばれるよ
あなたの言っている「継承されてない」が何を意味しているかによるけど
0647デフォルトの名無しさん
2005/12/29(木) 18:23:11struct A
{
A(int){}
};
struct B : public A
{
};
B(1);//エラー
0648デフォルトの名無しさん
2005/12/29(木) 18:28:500649デフォルトの名無しさん
2005/12/29(木) 18:29:10継承とか関係なく、デフォルトの実装が暗黙的に実装される。
じゃなかったっけ?
0650デフォルトの名無しさん
2005/12/29(木) 18:57:36この時点でまだそんなこと言ってる奴は鈍すぎ
0651デフォルトの名無しさん
2005/12/29(木) 19:20:08確か、そんな感じ。
無ければ自動で生成される類は、継承されない。
0652デフォルトの名無しさん
2005/12/29(木) 19:41:000653デフォルトの名無しさん
2005/12/29(木) 20:19:14int hoge(int *hogehoge)
と
int hoge(int &hogehoge)
はどう使い分けるんですか?
0654デフォルトの名無しさん
2005/12/29(木) 20:25:21ポインタが必要なら前者、そうでないなら後者。
0655デフォルトの名無しさん
2005/12/29(木) 20:28:13#まぁ、後者にも無理やりnullを渡せますけどね
0656デフォルトの名無しさん
2005/12/29(木) 20:39:06参照でなくポインタを使うってのがあったな。
0657デフォルトの名無しさん
2005/12/29(木) 20:52:11って案もあるな。
0658デフォルトの名無しさん
2005/12/29(木) 20:55:47すんげー曖昧な指針だな
参照カウントとか使うケースほどでもなく
値で渡すのも何だからみたいな
ある特定の事情ってことか?
もっと単純にガッする場合のあるなしじゃね?
0659デフォルトの名無しさん
2005/12/29(木) 21:02:10NULLを扱う場合の有無ももちろんだけど、それに加えてってことだろ。
0660デフォルトの名無しさん
2005/12/29(木) 22:12:17クラス内のプライベートな配列メンバを作るのはよくないでしょうか?
そのドライバルーチンからそのメンバを読み(書きはしない)たいのです。
こういう設計自体が間違ってるのかな?
超初心者の質問ですが、よろしくお願いします。
0661デフォルトの名無しさん
2005/12/29(木) 22:21:32この場合はドライバとは言わないですよね・・・すみません。
0662デフォルトの名無しさん
2005/12/29(木) 22:26:56まともな日本語で書け。main()ルーチンって何だ?routineは
“関数”じゃないぞ?
0663660
2005/12/29(木) 22:31:19main()とは限らないですよね・・・
0664デフォルトの名無しさん
2005/12/29(木) 22:32:48>クラス内のプライベートな配列メンバを作るのはよくないでしょうか?
何でそう思ったの?
0665660
2005/12/29(木) 22:39:08パブリックメンバ関数のreturnしかないからです。メンバへのポインタを外部に持たせて云々
とかは言わないで下さい。
配列の場合、CやC++では、インスタンスをそのままreturn できないので、
ポインタを返すしかありません。
そのポインタを介して読み書きするのは、エレガントとはいえないです。
(っていうか、できない?)
こういう場合は、どんな方法を取ったらいいのでしょうか?
0666デフォルトの名無しさん
2005/12/29(木) 22:40:330667666
2005/12/29(木) 22:42:520668デフォルトの名無しさん
2005/12/29(木) 22:48:25おーい、頭元気か
0669デフォルトの名無しさん
2005/12/29(木) 22:48:431. boost::array
2. 配列への参照を返す。
3. std::vector
4. 素直にポインタを返す。
5. ポインタを返さなくて済むように設計を見直す
6. その他
どれでもどうぞ
0670660
2005/12/29(木) 22:51:115:設計を見直します。
お騒がせしました
0671デフォルトの名無しさん
2005/12/29(木) 22:53:26STLのコンテナクラスをそのクラスのメンバにしておいて、アクセスしたい場面ではそ
のイテレータをそのまま返すなりすればいいだろ。
0672デフォルトの名無しさん
2005/12/29(木) 22:54:430673デフォルトの名無しさん
2005/12/29(木) 22:56:39せめてconst参照を返そうよw
0674デフォルトの名無しさん
2005/12/30(金) 00:30:41設計やり直したほうがいいわな。
メンバ変数を晒すなんて、責任分担がおかしくなっている兆候だろうし。
0675デフォルトの名無しさん
2005/12/30(金) 00:55:560676デフォルトの名無しさん
2005/12/30(金) 00:59:28その指針からoperatorは除かねばならんな。
0677デフォルトの名無しさん
2005/12/30(金) 01:03:330678デフォルトの名無しさん
2005/12/30(金) 01:18:13そう言う人は確かに結構多いけど…では実際変更するものをポインタで、
というのも、関数書く側としては一々*を付けるのは面倒くさいわけで。
0679デフォルトの名無しさん
2005/12/30(金) 01:28:43*付ける程度の労力を惜しむなら関数設計しなくていいよ
0680デフォルトの名無しさん
2005/12/30(金) 01:34:21参照渡しがデフォならコピコンを明示的に使うって立場もあろうが
0681デフォルトの名無しさん
2005/12/30(金) 02:12:55値渡しがデフォってスタイルでなんかいいことひとつでもあんの?
そんなスタイルは、どこで変数が変更されるのか追いかけるのが大変に上に、
そーゆー用途で(必ずしも必要ではないかもしれない場面で)コピコンを呼ぶのは
パフォーマンス的に全くの無駄だし、テラ嫌ス。
0682デフォルトの名無しさん
2005/12/30(金) 03:09:06???
0683デフォルトの名無しさん
2005/12/30(金) 03:57:48無ければ無いでよかったのに。
0684デフォルトの名無しさん
2005/12/30(金) 08:29:47>値渡しがデフォってスタイル
>どこで変数が変更されるのか追いかけるのが大変
矛盾。それとも参照渡しがデフォならどこでも変更される
可能性があるから追いかける意味がないとでも言いたいのか?
0685デフォルトの名無しさん
2005/12/30(金) 10:19:26MyClass x,y,z;
...
z=x+y;
などと書けるようにするためでは?
0686デフォルトの名無しさん
2005/12/30(金) 10:34:50参照がないと値渡し以外で使うときにoperatorが使いにくい罠ってこったな。
Hoge hage(Hoge *p)
{
Hoge kami(0);
Hoge fusa;
fusa = p->operator *(kami) ; //これ以外呼びようがない!
return fusa;
}
これはつらいっしょ。
0687デフォルトの名無しさん
2005/12/30(金) 10:35:43bcc32.exeなら__propertyで読み出し専用配列つくれるよ!
ハ_ハ
('(゚∀゚∩ つくれるよ!
ヽ 〈
ヽヽ_)
0688デフォルトの名無しさん
2005/12/30(金) 11:07:070689デフォルトの名無しさん
2005/12/30(金) 11:12:55VCにも__declspec(property())があるよ!
ハ_ハ
('(゚∀゚∩ あるよ!
ヽ 〈
ヽヽ_)
0690デフォルトの名無しさん
2005/12/30(金) 11:31:120691デフォルトの名無しさん
2005/12/30(金) 11:42:40こういうことではないかと。
0692デフォルトの名無しさん
2005/12/30(金) 11:43:27環 立 イ_i_ ┼─
土見 | イ ヒ イ 子
/\___/ヽ
(.`ヽ(`> 、 /'''''' '''''':::::\
`'<`ゝr'フ\ + |(●), 、(●)、:| +
⊂コ二Lフ^´ ノ, /⌒) | ,,,ノ(、_, )ヽ、,, .:::|
⊂l二L7_ / -ゝ-')´ + | `-=ニ=- ' .::::::| +
\_ 、__,.イ\ + \ `ニニ´ .:::/ +
(T__ノ Tヽ , -r'⌒! ̄ `":::7ヽ.`- 、 ./|
ヽ¬. / ノ`ー-、ヘ<ー1´| ヽ | :::::::::::::ト、 \ ( ./ヽ
\l__,./ i l.ヽ! | .| ::::::::::::::l ヽ `7ー.、‐'´ |\-、
class Cool
{
public:
__declspec(property(get=GetX, put=PutX)) int x[];
:
:
};
0693デフォルトの名無しさん
2005/12/30(金) 11:47:54その部分は脳内修正お願いします。
アク禁うざいOTL
0694デフォルトの名無しさん
2005/12/30(金) 12:05:52木タ 木旧 小 ⊥
 ̄
/\___/ヽ
(.`ヽ(`> 、 /'''''' '''''':::::\
`'<`ゝr'フ\ + |(●), 、(●)、:| +
⊂コ二Lフ^´ ノ, /⌒) | ,,,ノ(、_, )ヽ、,, .:::|
⊂l二L7_ / -ゝ-')´ + | `-=ニ=- ' .::::::| +
\_ 、__,.イ\ + \ `ニニ´ .:::/ +
(T__ノ Tヽ , -r'⌒! ̄ `":::7ヽ.`- 、 ./|
ヽ¬. / ノ`ー-、ヘ<ー1´| ヽ | :::::::::::::ト、 \ ( ./ヽ
\l__,./ i l.ヽ! | .| ::::::::::::::l ヽ `7ー.、‐'´ |\-、
class Cool
{
public:
#ifdef __MICROSOFT_C__
__declspec(property(get=GetX, put=PutX)) int x[];
#endif
#ifdef __BORLAND_C__
__property int x[int] = { read=GetX, write=PutX };
#endif
:
:
};
0695デフォルトの名無しさん
2005/12/30(金) 13:46:31ぐぐってもヒットしません。
0696681
2005/12/30(金) 14:44:17「参照渡しがデフォってスタイルでなんかいいことひとつでもあんの?」
の間違い。orz
0697デフォルトの名無しさん
2005/12/30(金) 14:50:490698デフォルトの名無しさん
2005/12/30(金) 15:13:01「ビットの定数性」に対する語としての論理的定数性のこと?
0699デフォルトの名無しさん
2005/12/30(金) 15:23:43蒸し返して悪いけど、そうじゃないかと思ったのだが、それだと
後半の値渡しを批判しているっぽいくだり『コピコンを呼ぶのは
パフォーマンス的に全くの無駄だし』と矛盾しない?
0700デフォルトの名無しさん
2005/12/30(金) 15:26:57exception から直接派生しているもの
bad_alloc, bad_cast, bad_exception, bad_typeid,
ios_base::failure, logic_error, runtime_error
logic_error から派生しているもの
domain_error, invalid_argument, length_error, out_of_range
runtime_error から派生しているもの
overflow_error, underflow_error, range_error
例えばメモリアロケーションに失敗したり、
その他浮動小数点演算で数値として表すことができない結果が出たり、
といろいろと例外処理したいシチュエーションがありますが、
そういう例外クラスの事実上の標準なクラスライブラリってあります?
0701デフォルトの名無しさん
2005/12/30(金) 16:08:47処理系依存です
処理系依存です
処理系依存です
処理系依存です
0702700
2005/12/30(金) 17:03:49ISO規格に含まれている >>700 の例外だけは
ポータブルってことですね。
0703デフォルトの名無しさん
2005/12/30(金) 17:27:45メモリアロケーションの失敗は bad_alloc でいいんじゃないの?
0704700
2005/12/30(金) 17:31:120705デフォルトの名無しさん
2005/12/30(金) 19:47:26Generic なアルゴリズム書くのが激しく面倒になるが。
0706デフォルトの名無しさん
2005/12/30(金) 19:48:53テンプレートなら特殊化があるね
0707デフォルトの名無しさん
2005/12/30(金) 20:10:12それは >>680 の言うコピコンの使い方(値を変えられると困る場面で、const の代わりに引数を変更
されてもいいようにコピーを渡す)を受けての話。
0708デフォルトの名無しさん
2005/12/30(金) 21:47:48if( ClassA b = a )
b.func();
今気付いたんだけど、ifの条件式でこんなことできるんだね。
知らなかった。
0709デフォルトの名無しさん
2005/12/30(金) 21:52:180710デフォルトの名無しさん
2005/12/30(金) 21:54:34dynamic_cast用にしといた方が無難だと思う。
0711デフォルトの名無しさん
2005/12/30(金) 21:55:41気づかないかもしれないね
0712デフォルトの名無しさん
2005/12/30(金) 22:00:330713デフォルトの名無しさん
2005/12/30(金) 22:03:11たしか、while でもできるよ。
0714デフォルトの名無しさん
2005/12/30(金) 22:06:45条件式を持っているなら、どれでもできるような気が・・・
0715デフォルトの名無しさん
2005/12/30(金) 22:07:29は合法?
0716デフォルトの名無しさん
2005/12/30(金) 22:08:39do whileじゃ無理っす
まぁ、正直出来ても活用性0ですけどw
0717デフォルトの名無しさん
2005/12/30(金) 22:09:250718デフォルトの名無しさん
2005/12/30(金) 22:10:31さすがにC++じゃ無理だろうが
0719デフォルトの名無しさん
2005/12/30(金) 22:14:14a[b] は*(a+b)と同じ意味なので
1["STR"] = *(1 + "STR") = *("STR" + 1) = "STR"[1]
という事やね。
C++でも出来た気がする。
0720デフォルトの名無しさん
2005/12/30(金) 22:14:32のように、変数導入宣言が二回以上使うことができないのだろうか?
C#ではできるのかな?
0721デフォルトの名無しさん
2005/12/30(金) 22:22:340722デフォルトの名無しさん
2005/12/30(金) 22:24:340723デフォルトの名無しさん
2005/12/30(金) 22:25:51構造体にパックしたりすればいいんでない?
またはcharとか1byte変数配列を必要な数だけ宣言して、型キャストするとか
0724デフォルトの名無しさん
2005/12/30(金) 22:26:010725デフォルトの名無しさん
2005/12/30(金) 22:35:160726デフォルトの名無しさん
2005/12/30(金) 22:37:44FOREACH( v, int i){ printf("%d",i); }
みたいなことのできるマクロ書いてた頃(素直にboost使う気になれなかった頃)
for(int i=0, v::iterator it=v.begin;
と実装できなくて困った覚えがあるなぁ
0727デフォルトの名無しさん
2005/12/30(金) 22:38:040728デフォルトの名無しさん
2005/12/31(土) 05:11:09public:
Type &func1(){return data1;}
Type data1;
};
template <class Type> class B : public A<Type>{
public:
void func2(){
data2 = A<Type>::func1();
//data2 = func1();
}
Type data2;
};
gccで上記はコンパイルできますが、//でコメントアウトしている書き方では
エラーがでてしまいます。
この例ではなぜベースクラスまで指定しないといけないんでしょうか?
0729デフォルトの名無しさん
2005/12/31(土) 08:06:11テンプレートは、引数が与えられていない定義そのものと、引数を与えられた時点の
2回構文がチェックされる。
クラス・テンプレートのメンバは、あとで明示的特殊化によって御破算にされる可能性が
あるから、最初のチェックのときには名前検索の対象にならない。だから修飾されていない
"func1"はその定義が見つからず、エラーとなる。
ただし、その名前がテンプレート・パラメータに従属している基底クラスのメンバである
可能性が示されたら、2回目のときまでチェックを遅延することが許されている。
それで A<Type>::func1() はコンパイルを通る。
ちなみに
data2 = this->func1();
と書くことも可能。
ここいらへんは、テンプレートの機能の中でもややこしいところだから、詳しく解説した
本を読んだほうがいい。
C++ Templates とか
0730デフォルトの名無しさん
2005/12/31(土) 14:32:52>>詳しく解説した
>>本を読んだほうがいい。
>>C++ Templates とか
どの本をさしますか。
ルキーの解説書ですか。
ブーストの取説ですか。
教祖の本では不十分ですか。
0731デフォルトの名無しさん
2005/12/31(土) 14:36:57>>9
0732デフォルトの名無しさん
2005/12/31(土) 15:17:39C++で中国と戦えるでしょうか?
0733デフォルトの名無しさん
2005/12/31(土) 15:19:24おまいあきらかにC#スレからきただろ!!!
0734デフォルトの名無しさん
2005/12/31(土) 15:33:00>>730
>>9
ずばり言ってよ。
今の時間読めん
0735デフォルトの名無しさん
2005/12/31(土) 15:37:43C++ Templates: The Complete Guide
http://www.amazon.com/gp/product/0201734842/102-0872632-8435348?n=283155
でいいんじゃない?
0736デフォルトの名無しさん
2005/12/31(土) 15:43:050737デフォルトの名無しさん
2005/12/31(土) 16:07:040738デフォルトの名無しさん
2005/12/31(土) 16:08:51規約無視して、変体書式で書いてある事を貴方は
どの様にお考えですか。初めてテンプレ学ぶ人には
変換することが難題だと思いますが。ソースは↓
http://www.josuttis.com/tmplbook/
The only gripe I have against this book is a very very minor one:
the authors for some inexplicable reason decided to write
"T const* p" instead of "const T* p" in function prototypes.
Both are correct and both mean the same thing but nobody uses
the first convention whose major fault is
that it's too close to "T *const p" - a different thing entirely.
Plus the second convention is such an ingrained idiom that fighting
it is pure nonsense which makes the book initially hard to read.
Example: what does "char const* const& a" mean?
(p. 17) On top of that the reader cannot simply substitute one convention for the other,
as the 25,000 C++ books already in print are
still going to *be* there plus the x billion lines of legacy C++ code is
not leaving any decade soon! So one has to keep *both* conventions
in mind in order to read the text. It's really not much of a big deal
but I wonder: what were they thinking?
0739デフォルトの名無しさん
2005/12/31(土) 16:15:44コンベンションを覚えておかなければなりません。
本当に、大したことの多くではないのか。
私が不思議に思うのは、 彼らは何を考えてたのか
ボケ?
0740デフォルトの名無しさん
2005/12/31(土) 16:42:37何かの病気?
0741デフォルトの名無しさん
2005/12/31(土) 16:57:05main の argv の型だって、
const char * const char * const argv と書くやつもいれば
const を変なところに(意味が変わらない範囲で)くっつける奴もいる
0742デフォルトの名無しさん
2005/12/31(土) 17:17:59const char* と書く人に文字列リテラルの配列を定義させると、半分以上は
const char* table[] と書く。
char const* を使う人は
char const* const table[] と書く。
Windows や Linux など、すべて RAM 上で動かすプログラミングをしていると、
前者と後者の違いが重要だとは思わないだろう。
しかし ROM 環境で、さらに RAM の少ない環境でプログラミングしていると
これらの違いに神経を使う必要が出てくる。
故に、普段から ROM 環境でプログラムしてる人
または偏執的な const マニアは後者に落ち着く可能性が高い。
0743デフォルトの名無しさん
2005/12/31(土) 17:33:46マニアかどうかわかんないが、俺も
const できるところは全部 const にしないと気持ち悪いな。
結構潜在的なバグを発見できたりするし。
const つけまくったからと行ってどの程度最適化に
反映してくれるかはわかんないけど。
0744デフォルトの名無しさん
2005/12/31(土) 17:40:09ちなみに違いを教えてくれ。
0745デフォルトの名無しさん
2005/12/31(土) 17:47:31俺もどっちがどっちだか分からなくなった。
まぁ宰相ググレカスだな
0746728
2005/12/31(土) 17:54:14いままでVC++使いだったけど、>>728みたいなのは
ベースクラス指定無しで通ってたんで、なんかめんどくさい、、、。
ぐぐる先生に聞いたところ、他の複雑なテンプレートの例でも、「VC++ならOK」
というのがあるようですね。
ttp://www.fides.dti.ne.jp/~oka-t/cpplab-template-4.html
LINUX環境で開発することになったので、そのへんのところ
元の言語仕様をよく確認しなきゃいけない。
0747742
2005/12/31(土) 17:57:36わかりやすい話だと table[0] = "modified" が、前者だと通り、後者だとエラーになる。
前者では table を書き換え可能な RAM に置く必要があり、後者ではその必要が無い。
起動時に全部 RAM にロードされる環境だと、それらの違いはほとんど無視できる。
( OS による最適化で const な table をプロセス間で共有してくれる可能性はある。)
ROM 環境では必要な分だけ RAM を使うことになるので、
table[] のサイズがそのまま RAM の消費量の差になる。
0748デフォルトの名無しさん
2005/12/31(土) 18:02:33前者と後者の違いが重要だとは思わないだろう
誰のことですか。発言者の出典箇所は?
Q2:普段から ROM 環境でプログラムしてる人
PICとか組み込み系の人のことですか。
Q3:世界中の人の前に広く出回る本であっても貴方は後者の
書き方で問題ないと寛容にお考えですか。
この本は、英語、中国語、アラビア語で翻訳されてます。
関東圏内で会話していると
標準語と関西弁の違いが重要だと思わないだろう。
しかし大阪でさらになんばで会話をしていると
これらの違いに神経を使う必要が出てくる。
私は、東京のど真ん中で偏執的な関西弁マニアが巻くし立てらたら
必ず違和感を持つ。そして、日本の公用語は関西弁に
は絶対にならないと考える。
0749デフォルトの名無しさん
2005/12/31(土) 18:02:53俺はconst char *派だけど、typedefする。
typedef const char *PCSTR; //大抵<windows.h>で済ます
const PCSTR *table[];
0750デフォルトの名無しさん
2005/12/31(土) 18:08:37てか、const char * って形の宣言ができることがそもそも間違いの始まりなんだよなぁ。
てな、話は↓こっちでやれ・・・
って、「const だけでメシが3杯喰えちゃうスレ」がいつのまにかなくなってる。(´;ω;`)
0751デフォルトの名無しさん
2005/12/31(土) 18:31:24あー、暫く前に落ちましたよ。
0752デフォルトの名無しさん
2005/12/31(土) 18:48:32というように、ノードのポインタのアドレスを引数にし、mainから参照したいのですが
うまくいきません。
Node* node;
if(MakeList(&node)){}
このように、条件判断に使いたいのですが・・・・
どうすればいいのですか?
0753デフォルトの名無しさん
2005/12/31(土) 18:49:27変な奴がいるみたいだが、もうしばらく相手してやる。
> Q1: (引用略)
> 誰のことですか。発言者の出典箇所は?
Windows や Linux をメインの環境としてプログラミングしてる人。
発言者とは誰のことですか。
> Q2:普段から ROM 環境でプログラムしてる人
> PICとか組み込み系の人のことですか。
そこらへんに多いと思う。あと携帯ゲーム機とか。
> Q3:世界中の人の前に広く出回る本であっても貴方は後者の
> 書き方で問題ないと寛容にお考えですか。
普段から後者に統一しているので、問題ないと考える。
C++ の書き方についての話なので、何語に翻訳されてようと変わらない。
> 関東圏内で会話していると(以下略)
大阪で暮らすために日本語を学ぶなら、標準語を学ぶだけでは不十分だろう。
逆に、東京だけで暮らすなら、関西弁を学ぶ必要は無い。
ROM 環境でプログラミングするために C++ を使うなら、以下略。
逆に、潤沢な RAM のある環境だけでプログラミングするなら、以下略。
0754デフォルトの名無しさん
2005/12/31(土) 18:54:37operator void* () を定義すればどうか。
0755デフォルトの名無しさん
2005/12/31(土) 18:56:01すいません、詳しく教えてください
0756デフォルトの名無しさん
2005/12/31(土) 19:02:42streamと同じ要領。変換演算子。"ストリーム c++ 変換演算子"でぐぐれば
いろいろ出てくる。
0757デフォルトの名無しさん
2005/12/31(土) 19:03:450758デフォルトの名無しさん
2005/12/31(土) 19:09:23MakeList() の戻り値が bool なのに、なんで変換演算子が要るの?
0759デフォルトの名無しさん
2005/12/31(土) 19:12:01呼び出しの時に & はいらんよ。
0760デフォルトの名無しさん
2005/12/31(土) 20:11:56どうもありがとうございます
0761デフォルトの名無しさん
2005/12/31(土) 21:05:47>>752 がわけわかなのって俺だけ?
0762デフォルトの名無しさん
2005/12/31(土) 21:11:25自分自身に似たような経験があれば、質問者の意図は理解できる。
0763デフォルトの名無しさん
2005/12/31(土) 21:23:04なんかポインタのど初歩で間違えて内科医?
実引数おかしいよね
0764デフォルトの名無しさん
2005/12/31(土) 22:09:06こうすれば理解できると思う。
typedef Node *NodePtr;
bool MakeList(NodePtr&);
0765761
2005/12/31(土) 23:14:04>というように、ノードのポインタのアドレスを引数にし、
ここまではわかる。
>mainから参照したいのですが
なにを? 引数? 関数? 戻り値? それ以外のなにか?
>うまくいきません。
なにが? 引数を渡すこと? 関数呼び出し? 戻り値の取得? それ以外のなにか?
>Node* node;
>if(MakeList(&node)){}
>このように、条件判断に使いたいのですが・・・・
勝手に使えばいいじゃん。
>どうすればいいのですか?
俺も、どうすればいいのですか?
0766デフォルトの名無しさん
2005/12/31(土) 23:28:520767デフォルトの名無しさん
2005/12/31(土) 23:52:27if(MakeList(&node)) { ではなくて
if(MakeList(node)) { にしろってこった。
上のじゃコンパイル通らないだろう
0768デフォルトの名無しさん
2006/01/01(日) 00:32:19確かに、解決もしたんだろうし、そこでコンパイルエラーになって、
& を取っ払えばコンパイルが通るって話はわかる。
が、質問の意味がさっぱりわからん。
0769デフォルトの名無しさん
2006/01/01(日) 01:45:47amazonの評価は結構微妙なんですけど禿本に書いてない細かい所とか書いてあるんですよね。
0770デフォルトの名無しさん
2006/01/01(日) 01:51:14索引がいい加減で、容も離散的に書いてあるから、マニュアル的に使うにも少々難ありって感じ。
俺の感想だけどね。
分からないトピックを絞って、その部分を集中して勉強するようなスタイルなら、それなりに使えるとは思う。
結局本棚の肥やしになってるけど。
0771デフォルトの名無しさん
2006/01/01(日) 09:22:40#「がわけわかなの」?
0772デフォルトの名無しさん
2006/01/01(日) 09:27:06ランダム読みに向いているのが C++ Effective
マニュアルは本当に処理系の取説と ISO/JIS の規格票
0773デフォルトの名無しさん
2006/01/01(日) 09:31:19何の本のことか解りません。
タイトルを正確に教えて
0774デフォルトの名無しさん
2006/01/01(日) 09:39:27「A級B型C++ (技術評論社かソフトバンク、忘れた、すでに絶版)」
0775デフォルトの名無しさん
2006/01/01(日) 09:44:16↑ISBN4-8101-8002-6
ISBN4-8101-8047-6
ISBN4-7561-1895-X
↓ISBN4-7973-2854-1
新禿
0776デフォルトの名無しさん
2006/01/01(日) 11:01:090777デフォルトの名無しさん
2006/01/01(日) 11:09:04ハゲこそC++だよ。
0778デフォルトの名無しさん
2006/01/01(日) 11:11:170779デフォルトの名無しさん
2006/01/01(日) 11:49:58>ハゲこそC++だよ。
この本は髪質がツルツルと光って、そのうえ薄すぎて
さらにイタリックで読みにくくない。?
光沢が反射して目がクラクラするのは、俺だけか。
だいだい、あすきー社って、異常に紙質が厚いか
裏面が透過するほど薄いか、ざらざらしているか
値段が他社に比べてトビ抜けて高い。
つぶれてよし、逝ってよし。
練習問題の回答本も別途購入しないといけない。
買う人はいますか。
0780デフォルトの名無しさん
2006/01/01(日) 11:53:13禿げてる奴って脳みそのしわも薄そうだよな。
頭悪そ
0781デフォルトの名無しさん
2006/01/01(日) 11:58:15誰かが出してきた答案を見てそれをやめてしまう他力本願は「ユーザが育てた言語」にそぐわない
値段にしても自己投資として買う人には問題にならない金額だね
0782デフォルトの名無しさん
2006/01/01(日) 14:42:27class CMember
{
private:
int m_Age;
};
というクラスがあった場合、そのメンバーアクセスには
bool SetAge(int Age);
int GetAge() {return m_Age;}
というメンバー関数を用意しておこなうようにしていますが。
もし、他に
CStrVector m_NickName;// 文字列クラスの配列を管理している管理クラス
というデータがあった場合、取得に関してはどのような概念をお持ちでしょうか?
�@メンバー関数は外から干渉絶対にさせないので、コピーにかかる時間は深く考慮せず
CStrVector& GetNickName() {return m_NickName;} とおこなう。
�Aprivateメンバー宣言されている時点で、さわられたくないと言う意思表示をしているので
ポインタを取得させてしまう。
CStrVector* GetNickName() {return &m_NickName;} とおこなう。
ちなみにm_NickNameで配列化される文字列は300個ぐらいです、
各文字列はせいぜい20バイトほどです。
MFCで言えばCStrVectorはCStringArrayのようなものだとお考えください。
作製しているアプリは事務的な物です、決してゲームのような一刻の早さを求める物ではありません。
みなさんならどちらでしょうか?
0783デフォルトの名無しさん
2006/01/01(日) 15:02:39そのクラスの設計目的を抜きにしてそんなことを議論できるとでも思ってるのが間違い。
0784デフォルトの名無しさん
2006/01/01(日) 15:04:18実装からインターフェースを考えてるのが間違い。
先にインターフェースを考えろ。
0785デフォルトの名無しさん
2006/01/01(日) 15:05:540786デフォルトの名無しさん
2006/01/01(日) 15:06:13(1)にコピー云々と書いてあるけど
CStrVector& GetNickName() {return m_NickName;}
CStrVector GetNickName() {return m_NickName;}
の違いは分ってる?
0787デフォルトの名無しさん
2006/01/01(日) 15:24:03constを忘れているよ(w
0788デフォルトの名無しさん
2006/01/01(日) 15:28:24にするな。それと、MFCだとCMemberは、CObjectの派生クラスとして定義
する。
んでもって...
const CStrVector &GetNickName() const { ASSERT_KINDOF(CMember,this); return(m_NickName);}
CStrVector &NickName() { ASSERT_KINDOF(CMember,this); return(m_NickName);}
の2つを用意する。前者用意していないと、後者は、constなメンバ関数
から参照できないため。クラス定義の目的と場合によっては、virtual関数に
する。
なぜわざわざメンバ変数を隠蔽してアクセス関数を用意するのか理解して
いない >>785 は、アフォ
0789デフォルトの名無しさん
2006/01/01(日) 15:29:16さらにイタリックで読みにくくない。?
光沢が反射して目がクラクラするのは、俺だけか。
0790デフォルトの名無しさん
2006/01/01(日) 15:37:11protectedは、派生クラスからも触れるので、まず使わない。
0791デフォルトの名無しさん
2006/01/01(日) 15:40:51なぜわざわざメンバ変数を隠蔽してアクセス関数を用意するのか理解して
いない >>788 は、アフォ
0792782質問者
2006/01/01(日) 16:06:16みなさんありがとうございました。
class test
{
public:
test() {m_a = 10;}
const int& get_a() const{return m_a;}
private:
int m_a;
};
int main()
{
test t;
const int &a = t.get_a();
a = 20;// エラー
return 0;
}
0793デフォルトの名無しさん
2006/01/01(日) 16:19:330794デフォルトの名無しさん
2006/01/01(日) 16:26:56ない糞なクラスの再発明を繰り返してして、ばかでかくて無駄なコードを
量産しているんだろうな。間違いない。
0795デフォルトの名無しさん
2006/01/01(日) 16:53:010796デフォルトの名無しさん
2006/01/01(日) 16:57:03リファレンサくらい憶えろよ、アフォ
0797デフォルトの名無しさん
2006/01/01(日) 17:04:37また馬鹿が釣れた。
0798デフォルトの名無しさん
2006/01/01(日) 17:15:150799デフォルトの名無しさん
2006/01/01(日) 17:29:35そんな論法がまかり通るならアクセス関数とか使わずに全部public。
実際それが一番良い場面も多いしな
0800デフォルトの名無しさん
2006/01/01(日) 17:33:43また馬鹿が釣れた。
0801デフォルトの名無しさん
2006/01/01(日) 17:34:010802デフォルトの名無しさん
2006/01/01(日) 17:34:55またまた馬鹿が釣れた。
0803デフォルトの名無しさん
2006/01/01(日) 18:03:470804デフォルトの名無しさん
2006/01/01(日) 18:05:24違う、「釣れた」としか言えない馬鹿がいる、だろ。
~~~~~~~~~~~~~~
0805デフォルトの名無しさん
2006/01/01(日) 18:10:53まだまだ馬鹿が釣れた。
0806デフォルトの名無しさん
2006/01/01(日) 18:24:39やあ朝鮮人。
0807デフォルトの名無しさん
2006/01/01(日) 18:28:57また馬鹿が連れた。
0808デフォルトの名無しさん
2006/01/01(日) 18:32:21intなら参照を返す必然性は無いと思う。
あと、コンストラクタで代入するよか、
test() : m_a(10) {}
と書くようにした方が良いかも。
0809デフォルトの名無しさん
2006/01/01(日) 18:50:30なお馬鹿が連れた。
0810デフォルトの名無しさん
2006/01/01(日) 19:19:31例えば class Age内にて
Age operator + (Age& temp){ return 何か; }
とされていればAge+Ageの演算は return 何か; の部分が返されるのですが、
3+Ageとか、前方がAgeでは無い場合のオペレーターロードはどうすればよいでしょうか・・
0811デフォルトの名無しさん
2006/01/01(日) 19:24:14普通の関数として用意する
0812デフォルトの名無しさん
2006/01/01(日) 19:25:30グローバルでオペレータオーバーロード+コンストラクタで数字からの変換定義
0813デフォルトの名無しさん
2006/01/01(日) 19:56:12int operator + (int n,Age& temp) { ... }
のように引数を二つ取ればよかったのですねorz
すみませんでした
0814デフォルトの名無しさん
2006/01/01(日) 22:18:16微分方程式、積分ルーチンのクラスを作ったところで微分方程式の解を保持する
変数はどこに置いたらいいか分からなくなりました。
当初は微分方程式のクラスにおいていましたが、複数の積分ルーチンを作る際に
不都合が生じてきました。例えば、解を補間しない場合は、積分ルーチンから得た
解を微分方程式のクラスに置いていても問題はないのですが、補間する場合は
積分ルーチンの方に置いたほうが都合がいい為です。
何か良いアイデアがあればお聞かせください。
0815デフォルトの名無しさん
2006/01/01(日) 22:23:11普通に考えれば微分方程式クラスに置くべきだと思うが
それで不都合が生じるなら生じない方かもしくは
別途、解クラスとして独立させてみたらどうか?
0816デフォルトの名無しさん
2006/01/01(日) 22:49:18で集約するのですね。色々考えてはいますが、クラスを使ってデータを加工していく
作業は手続き型に思えてオブジェクト指向的な設計に感じないんですよ。
集約と言うか解クラスが微分方程式クラスと積分ルーチンに依存(を利用)すると
思えばいいのかなぁ・・・。
0817デフォルトの名無しさん
2006/01/01(日) 22:56:23それじゃ逆転の発想で、解とその他の計算にかかる純粋仮想関数を持ったクラスと
それから派生した2つの微分方程式クラスと積分クラスってのは?
0818魚チョコ
2006/01/01(日) 23:06:05漠然とした話なので「お好みで」としか答えようがないなあ。
前俺がその手の計算プログラムを組んだときには、
XYデータ列クラスと多項式クラスが大活躍したぞ。
何としても、シンプソンの方法(method)クラスみたいのを
作りたくなかったのだが、意味があったのだろうか。
数学計算は手続き型の方が相性がいいなと思ったしだい。
0819デフォルトの名無しさん
2006/01/01(日) 23:10:03うーん、やはり>>815さんのおっしゃる様に3つのクラスが互いに参照しあって
処理を進めるべきかな?
0820デフォルトの名無しさん
2006/01/01(日) 23:12:48XYデータ列クラスと多項式クラスってどのように使うものですか?
0821デフォルトの名無しさん
2006/01/01(日) 23:15:39>>何としても、シンプソンの方法(method)クラスみたいのを
>>作りたくなかったのだが
何故なんとしても作りたくなかったのか、その心を是非聞きたいです。
0822デフォルトの名無しさん
2006/01/01(日) 23:18:49データはどうなってるの?
0823流れ読まずに釣られるテスト
2006/01/01(日) 23:27:19そもそも、日本語もまともに書けない>788はゴミ。
0824デフォルトの名無しさん
2006/01/01(日) 23:33:043つのインスタンスの関係は、上位構造で管理すればいいように思うけど。
0825デフォルトの名無しさん
2006/01/01(日) 23:36:32データ(解)の型ですか?配列にΔ時間だけ微分方程式を発展させた際の解を
入れるつもりです。
0826デフォルトの名無しさん
2006/01/01(日) 23:45:31それでも良いのですが、t1からt2の間を補間する場合はt2の解とt2を計算した
途中の情報が必要になります(それは積分ルーチンのprivateメンバになっているはず)。
t2の解を積分ルーチンのメソッドの引数として与えれば良いのかな?
時刻tの解を得るために
3種類のインスタンス:微分方程式、データクラス、積分ルーチンの
誰にメッセージを送るべきでしょうか?
0827デフォルトの名無しさん
2006/01/02(月) 00:01:010828814
2006/01/02(月) 00:02:59次元の解が入っているか誰が把握するべきかという問題もありますね。
>>822さんはこういった事を質問されたのでしょうか?
自問自答が多いので一旦出直した方がいいかもしれませんね。お騒がせ致しました。
0829デフォルトの名無しさん
2006/01/02(月) 20:15:39それとどの様な仕掛けで変数のサイズを可変させてるのでしょうか。。
0830デフォルトの名無しさん
2006/01/02(月) 20:16:400831デフォルトの名無しさん
2006/01/02(月) 21:33:08ふつうに考えて、クラスのなかに文字列へのポインタとサイズが
入っているのではないでしょうか(予想)
ですから、サイズ変更(別の文字列を代入)するときは、クラスのサイズ
を書き換えているんだと思います。(もちろんポインタも)
このような文字列も持ち方は他の言語では普通。\0で終わる文字列という
Cの仕様のほうがどちらかというと特殊。
0832デフォルトの名無しさん
2006/01/02(月) 21:40:35\0 が MSB だったりはするが
0833デフォルトの名無しさん
2006/01/02(月) 21:55:520834デフォルトの名無しさん
2006/01/03(火) 03:01:05buf = 可変長バッファ、is = istreamとして、
1) 任意のバイト数分のデータをisから取ってきてbufに追加。
2) bufの頭から「ある処理」を行い、処理を完了したバイト数分bufから捨てる。なお、「ある処理」は使用するライブラリの都合上(const)char*が必須。
いまのところbufにstringを使用していて、(2)は以下:
const char* p = buf.data();
...
buf.erase(0, processed_size);
のように実現できそうなのですが、(1)がうまくいきません。
今はこう(↓)なっていますが、激しく気持ち悪いです。
char *add = alloca(n + 1); // char add[n + 1]; だとg++ -ansi -pedanticで怒られた
memset(add, '\0', n + 1);
is.read(add, n); // 実際に読み取ったバイト数もわからない。処理前後の位置を調べるしかない?
buf += add;
最初はnバイト分bufを広げてdata()の後ろに追記しようとしたのですが、返す型がconstなのでボツ。(書き換えると何が起きるかわからんで、と書いてあるし)
次にostringstreamを使おうとしたのですが、str()が返すのはコピーのようなので意味なし。
今のところ考えているのは、(1)を
a) 素直に1バイトずつループで追記。
b) 可変長バッファクラスを独自実装。
のどちらかで実現、と思っているのですが、C++は初心者なので、アプローチからして何か間違えているような気がしてならないです……。
0835デフォルトの名無しさん
2006/01/03(火) 03:43:03>buf += add;
is.read(add, n);
buf.append(add, is.gcount());
でよかったと思う。あと、n は const で定義してれば char add[n +1]; でも怒られんよ。
0836デフォルトの名無しさん
2006/01/03(火) 03:49:12>a) 素直に1バイトずつループで追記。
>b) 可変長バッファクラスを独自実装。
>のどちらかで実現、と思っているのですが、C++は初心者なので、アプローチからして何か間違えているような気がしてならないです……。
いまのままじゃダメなん?
処理の内容にもよるけど、あんまり速度的な効率求めるよりも、
簡素な記述で目的が果たせているんならそれに越したことはないよ。
0837デフォルトの名無しさん
2006/01/03(火) 03:55:28>最初はnバイト分bufを広げてdata()の後ろに追記しようとしたのですが、返す型がconstなのでボツ。(書き換えると何が起きるかわからんで、と書いてあるし)
std::vector<char>にしてよければ:
std::vector<char> buf;
std::size_t s = buf.size();
buf.resize(s + n);
is.read(&buf[s], n);
buf.resize(s + is.gcount());
とか?
0838デフォルトの名無しさん
2006/01/03(火) 04:09:26ちょwwwwおまっwwwwwww
そりゃ、意図通りには動くかもしれんけど、規格的には反則だろw
# そーゆーことをしてもいいことにしようって動きはあったとは思うが。
0839デフォルトの名無しさん
2006/01/03(火) 04:19:08>>838
>規格的には反則
どこがまずい?
0840デフォルトの名無しさん
2006/01/03(火) 04:22:07>is.read(&buf[s], n);
vector の要素が連続していることは保証されてたと思うけど、
こーゆー形でデータを受け取ることはまだinvalidなハズ。
0841デフォルトの名無しさん
2006/01/03(火) 04:27:590842デフォルトの名無しさん
2006/01/03(火) 04:31:53vectorを837のように配列の代わりに渡すのは
Effective STLで紹介されていたと思う
>こーゆー形でデータを受け取ることはまだinvalidなハズ。
ソースは?
0843デフォルトの名無しさん
2006/01/03(火) 04:49:26ごめん、俺、なんか他の話と混同してたかも。
http://www.s34.co.jp/cpptechdoc/article/vectorastemp/
これなんか、まんまだね。
0844デフォルトの名無しさん
2006/01/03(火) 09:00:19予めresizeで配列は十分要素数を持っているので問題ない。
要素数が足りないければ(reserveだけ行っていることも含む)たしかにまずいが。
0845834
2006/01/03(火) 10:21:00>>835
なるほど、gcount()を使うんですね。
こういうインターフェースは予想してなかったので目に入ってませんでした。
> n は const で定義してれば char add[n +1]; でも怒られんよ。
ところがですね、
> error: ISO C++ forbids variable-size array `add'
そもそも可変長配列自体規格違反らしいんですわ。
// んなアホな。だったらどうしろと言うのだ。alloca()じゃ退化してるやん。>ISO C++
// まぁ-pedantic付けなきゃ通るんですが。
>>836
んー、でもそれだとC++を使う旨みが半減。効率あまり考えないなら、
他の言語の方が扱い易いような。
>>837-844
をを、vector使えるんですね。
stringのdata()のような内臓さらすメソッドがないので無理かと思ってました。
// しかし、&buf[n]ってぱっと見るとぎょっとするな……。
0846デフォルトの名無しさん
2006/01/03(火) 11:11:22>そもそも可変長配列自体規格違反らしいんですわ。
ん? n が const なら可変長配列にはならんでしょ?
>んー、でもそれだとC++を使う旨みが半減。効率あまり考えないなら、
>他の言語の方が扱い易いような。
実際、そーなんじゃない?
特別に効率が求められる場面でもなけりゃ、あえて C++ にこだわる必要はないよ。
それでも、俺は C++ が好きだから C++ を使うことにこだわるけどね。
あと、C++ の旨みは効率だけじゃないし。
0847デフォルトの名無しさん
2006/01/03(火) 11:14:45可変長配列にならないためには const なことに加えて
定数式("constant expression")で初期化されている必要がある。
0848デフォルトの名無しさん
2006/01/03(火) 11:16:21char add[n +1]; だぞ。
0849848
2006/01/03(火) 11:17:180850834
2006/01/03(火) 12:10:40残念ながら今回のシチュエーションでは、代替手段としてalloca()を使って
いることからわかるように、可変長配列でなければならないんですよう。
void fill(int n) { char add[n+1]; ... } こんな感じ。
int nをconst int nにしても、定数式じゃないのでNG。
あと、今回は効率を求めてCに行き、CでOOやるのがメンドくなってC++に
走ったので、あまり効率は落としたくない、という理由もあったり。
ま、コンテナクラスを使いまくると裏でメモリアロケータががんがん
走ってるだろうからあまり気にしても意味がないような気はしますが……。
0851デフォルトの名無しさん
2006/01/03(火) 12:32:17残念だけど、効率求めんなら stream 系は使わずに C と女滋養なやり方したほうがいいよ。
0852デフォルトの名無しさん
2006/01/03(火) 13:25:54されてる関数をつかうときに宣言したクラス名.関数名みたいな形で書くのが
めんどくさく感じるんですがこれが普通なんでしょうか?こっちの方がどのクラス
を使ってるのかわかりやすいと言われればそんな感じもしますが他になにかやり
方があって私がめんどくさいことをしてるだけなのでしょうか?どなたがわかる
方いらっしゃいましたら教えてください。
0853デフォルトの名無しさん
2006/01/03(火) 13:28:04まさかクラスのメンバ関数を全てstaticにするとか馬鹿なことやってないよね?
0854デフォルトの名無しさん
2006/01/03(火) 13:28:12あんたクラスって名前空間だと勘違いしていないか?
0855デフォルトの名無しさん
2006/01/03(火) 13:48:24例えばclass AAA{
int aaaa;
void AAAA(){}
}
みたいなクラスを作ってどっかでAAA a;って宣言して
中の関数を呼び出すときにa.AAAA()って呼び出すのではないでしょうか?
0856デフォルトの名無しさん
2006/01/03(火) 14:02:09めんどくさく感じるのは、多分オブジェクト指向に対する理解が足りないから
0857デフォルトの名無しさん
2006/01/03(火) 14:05:05そのAAAA()の中では、 a.aaaa じゃなくて aaaa で済むのが利点のひとつ。
0858デフォルトの名無しさん
2006/01/03(火) 14:07:27thisが省略できない場合も多々ある。
0859デフォルトの名無しさん
2006/01/03(火) 14:07:390860デフォルトの名無しさん
2006/01/03(火) 14:07:44>>855 のセンスの無さを垣間見た気がするのは俺だけですか? そーですか。
0861デフォルトの名無しさん
2006/01/03(火) 14:12:28Cを長年やってきたなら、関数名(というか、外部名空間)の管理に手を焼いたことくらいあるだろう?
長ったらしいプリフィックスを毎回打たされるのとどっちが面倒だろうね
0862デフォルトの名無しさん
2006/01/03(火) 14:55:39a.AAAA()はC言語ならAAA_AAAA(&a)とでも書くところなのだけど、
それでもめんどうくさく感じる?
0863デフォルトの名無しさん
2006/01/03(火) 16:41:170864デフォルトの名無しさん
2006/01/03(火) 16:44:57本当に一つの概念として確立されているのかよく分かんなくなります.
分かる人には分かる,といったものでない雰囲気がするんですが,やはり,僕の認識が誤りなんでしょうか?
0865デフォルトの名無しさん
2006/01/03(火) 16:48:320866デフォルトの名無しさん
2006/01/03(火) 16:55:31つttp://www.amazon.co.jp/exec/obidos/ASIN/4894716844/249-1429959-0070736
オススメ。嫁。
0867デフォルトの名無しさん
2006/01/03(火) 17:06:15レスありがとうございます.
アマゾンとかで検索するとオブジェクト指向のデザインパターンを説明する本って星のようにありますよねぇ...
この本読んで勉強してみようと思います.
0868デフォルトの名無しさん
2006/01/03(火) 17:32:52誰がそんなこと言うんだ?
俺だってグローバルスコープで using namespace を使っているのを見かけたら
口に出すかどうかは別としてやった奴を警戒するけど、using そのものを否定するわけじゃない
0869デフォルトの名無しさん
2006/01/03(火) 17:39:48オブジェクト指向って学ばなくても組んでたらその方向へ
いくと思う。学ぶと近道になるのは確かだけどね。
0870デフォルトの名無しさん
2006/01/03(火) 17:41:36グローバルでusing namespaceしないと面倒でやってらんない
0871デフォルトの名無しさん
2006/01/03(火) 17:44:280872デフォルトの名無しさん
2006/01/03(火) 17:47:250873デフォルトの名無しさん
2006/01/03(火) 17:52:190874デフォルトの名無しさん
2006/01/03(火) 17:56:320875デフォルトの名無しさん
2006/01/03(火) 18:43:26で言及されとりますな。
さすがに関数内だけでのみusing namespaceを使うつうのは厳しすぎるので、
ソースファイルの最後のincludeの後でusing namespaceを使うというのが
妥当な所かと思う。
0876デフォルトの名無しさん
2006/01/03(火) 19:04:08自分が言及した覚えのない識別名との衝突にびくびくするのはやっぱりやだ
0877デフォルトの名無しさん
2006/01/03(火) 19:14:54こんな指向とか
ttp://www.entis.jp/doc/lolita_programing/lolita1.html
0878魚チョコ
2006/01/03(火) 20:25:17そうなんだよな。いくら例のための無意味な名だとしてもだ。みーんなして判でおしたように foo や hoge ばかり使うってのが没個性で気にいらねえ。
わからんちん相手には、 _____(_,__,___);
まともなプログラムじゃ使えないからせめてこういうときだけ、 o(oo,oo);
いつぞや誤用を指摘されてくやしかったから、 null(NULU, NULl_, NUl_l_ );
こんなん使ってもちっとも読みやすくならないばかりか打ちまちがえるってえのなあ…… flase(ture,tuer,fals);
嫌な奴の名前 void Kusakabe(henjin);
そういや、hogebar てのも見ないな
0879デフォルトの名無しさん
2006/01/03(火) 20:28:090880デフォルトの名無しさん
2006/01/03(火) 21:29:28肝心な変数名が萌えない。
0881デフォルトの名無しさん
2006/01/03(火) 21:37:11は別にグローバル空間で明記したって重大な問題にはならないような。
他は名前のルックアップとnamespace ○○=boost::lambdaと#includeの位置を調整で対処。
0882デフォルトの名無しさん
2006/01/03(火) 21:47:00つttp://tokuhirom.dnsalias.org/~tokuhirom/wiki/%E3%82%A8%E3%83%AD%E3%82%B2%E3%81%A7%E5%AD%A6%E3%81%B6%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3
0883デフォルトの名無しさん
2006/01/03(火) 21:47:220884デフォルトの名無しさん
2006/01/03(火) 21:50:39問題が起こらないようにわざわざ std namespace を利用してんのにそれを無駄にするようなことをするな。
まぁ、個人的にはそれで問題が起きるようならその衝突相手が悪い気がせんでもないが。
0885デフォルトの名無しさん
2006/01/03(火) 22:07:22衝突が起きたらそのときにstd::で修飾すれば良い。
一般に、「グローバルでusing namespaceをすると名前空間の利点が失われる」というのは
言い過ぎだと思う。
0886デフォルトの名無しさん
2006/01/03(火) 22:10:48クリーンを保ちながら育てていきたい
0887デフォルトの名無しさん
2006/01/03(火) 22:13:010888デフォルトの名無しさん
2006/01/03(火) 22:26:30#include <list>
struct A{
int a, b, c;
long x;
};
struct B{
int a, b, c;
};
struct Hoge{
A* pa;
B* pb;
};
void func0( std::list<Hoge>& list_hoge ){
for( std::list<Hoge>::iterator it = list_hoge.begin(); it != list_hoge.end(); ++it ){
std::cout << it->pa->a << it->pa->b << it->pa->c << std::endl;
}
}
void func1( std::list<Hoge>& list_hoge ){
for( std::list<Hoge>::iterator it = list_hoge.begin(); it != list_hoge.end(); ++it ){
std::cout << it->pb->a << it->pb->b << it->pb->c << std::endl;
}
}
ストライドが微妙に違うA、Bがありまして、それをアクセス用のポインタとして持つHoge型があります。
Hoge自体はいじれるのですが、厄介なことにHogeにアクセス用ポインタを持たせるという点だけは変えられません。
func0とfunc1はそのストライドの差以外は全く同じ処理なので、どうにか一つにしたいと思っています。
しかし、template、union・・・・それなりに考えて見たのですが、上手く行きません。
何か良い手をご存じの方、いらっしゃいましたら是非にも。
0889デフォルトの名無しさん
2006/01/03(火) 22:34:05A を B から public継承すればいいじゃん。
0890デフォルトの名無しさん
2006/01/03(火) 22:39:28ヒントありがとうございます、なんとなく出来そうな気がしてきました。
もう少し悩んできます。
0891デフォルトの名無しさん
2006/01/03(火) 22:40:24あと、その func0/func1 は B のメンバ関数にするときっと幸せになれる。
0892デフォルトの名無しさん
2006/01/03(火) 22:48:18メンバへのポインタを使ってみた。
typedef std::list<Hoge> HogeList;
template<typename T>
void func(const HogeList& list_hoge, T* Hoge::*member) {
for (HogeList::const_iterator it = list_hoge.begin(); it != list_hoge.end(); ++it) {
const T& foo = *(*it.*member);
std::cout << foo.a << foo.b << foo.c << std::endl;
}
}
int main(){
const std::size_t N = 3;
B a[N] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9},
};
Hoge hoge[N];
for (int i = 0; i < N; ++i)
hoge[i].pb = &a[i];
HogeList ls(hoge, hoge + N);
func(ls, &Hoge::pb);
}
0893892
2006/01/03(火) 22:51:51.*はなぜか*よりも優先順位が低いから、そのせいで括弧の数は増えなかったけどさ。
0894デフォルトの名無しさん
2006/01/03(火) 22:54:55さらにヒント感謝です。なるほど・・・。
>>892
ぐぁ、凄い。すぐに理解できないですが、じっくり読んでみます。
お二人ともありがとうございます
0895デフォルトの名無しさん
2006/01/03(火) 23:24:26>> T* Hoge::*member
はなんでT* Hoge::member じゃだめなんですか?
0896デフォルトの名無しさん
2006/01/03(火) 23:24:590897デフォルトの名無しさん
2006/01/03(火) 23:26:31ポインターじゃないと意味が無いから。
0898デフォルトの名無しさん
2006/01/04(水) 02:15:040899デフォルトの名無しさん
2006/01/04(水) 11:57:29なんていう初期化、ありなんですか?
0900デフォルトの名無しさん
2006/01/04(水) 12:26:18ええよそれでも
0901デフォルトの名無しさん
2006/01/04(水) 12:52:360902デフォルトの名無しさん
2006/01/04(水) 12:58:580903デフォルトの名無しさん
2006/01/04(水) 13:09:090904デフォルトの名無しさん
2006/01/04(水) 13:09:52それができなかったら、templateで使えねー。
0905デフォルトの名無しさん
2006/01/04(水) 17:10:13例えばifstreamクラス内のメンバ関数や定数を一つ一つ丁寧に説明しているお勧めの本ってありますか?
0906デフォルトの名無しさん
2006/01/04(水) 17:58:480907デフォルトの名無しさん
2006/01/04(水) 18:02:41http://www.jisc.go.jp/app/pager?%23jps.JPSH0090D:JPSO0020:/JPS/JPSO0090.jsp=&RKKNP_vJISJISNO=X3014
0908デフォルトの名無しさん
2006/01/04(水) 18:29:14ボタンの押下を制御したいと思っていますが、うまくいきません。
ボタンが押されたときにアプレットのウィンドウに送られるメッセージをSPYで監視して
それらしいメッセージを送ってみたのですが、期待する動作をしません。
コンボボックスの操作は出来たのですが。。。
何か考え方が間違っているのでしょうか?
0909デフォルトの名無しさん
2006/01/04(水) 18:30:400911デフォルトの名無しさん
2006/01/04(水) 20:12:28仕様なら、綺麗な回避方法はあるでしょうか。
(typeを一緒にテンプレートパラメータとして渡すとか位?)
コンパイラはcygwinのgcc3.4.4です。
コード-----------------------------------------
template <class T>
struct foo {
typedef typename T::type type;
};
template <class T>
struct goo : foo<goo<T> > {
typedef T type;
};
main() {
goo<int>::type t;
}
コンパイル結果---------------------------------------------
test.cpp: In instantiation of `foo<goo<int> >':
test.cpp:8: instantiated from `goo<int>'
test.cpp:13: instantiated from here
test.cpp:4: error: no type named `type' in `struct goo<int>'
0912デフォルトの名無しさん
2006/01/04(水) 20:41:30struct foo {
typedef T type;
};
template <class T>
struct goo : foo<T> {
using foo<T>::type;
};
int main() {
goo<int>::type t;
}
0913デフォルトの名無しさん
2006/01/04(水) 20:43:49goo の無限再帰でコンパイラがラリった?
0914デフォルトの名無しさん
2006/01/04(水) 20:47:47goo<int>のインスタンス化にはgoo<int>が必要っていう
自己言及による矛盾が起きてるだけかと。
0915デフォルトの名無しさん
2006/01/04(水) 20:52:10struct goo : foo<goo<T> >
これ展開しようとしたらどうなるんだっけ?
0916デフォルトの名無しさん
2006/01/04(水) 20:53:07このケースでは無理そうだな
0917デフォルトの名無しさん
2006/01/04(水) 20:54:060918デフォルトの名無しさん
2006/01/04(水) 21:19:27VC6,VC2005なら通るね
CRTPって言うんだっけ。
ATL/WTLなんかこんなコードだらけのような
0920デフォルトの名無しさん
2006/01/04(水) 21:48:17うまく避けてるんだろう・・・
0921デフォルトの名無しさん
2006/01/04(水) 22:48:03こんなとこか
template <class T>
struct foo {
struct apply{typedef typename T::type type;};
};
0922918
2006/01/05(木) 00:33:53>(typeを一緒にテンプレートパラメータとして渡すとか位?)
↓こういうことなのかな?とりあえずVCでは通る。
template <class T, class TY>
struct foo {
typedef typename TY type;
};
template <class T>
struct goo : foo<goo<T>, T> {
typedef T type;
};
でも、911の意図通りの展開がされてるのやらどうやら?
頭こんがらがってよく分らない
0923デフォルトの名無しさん
2006/01/05(木) 01:42:41こんなのも
template <class T>
struct foo;
template<template<class>class F, class T>
struct foo< F<T> >{
typedef T type;
};
0924デフォルトの名無しさん
2006/01/05(木) 01:51:540925デフォルトの名無しさん
2006/01/05(木) 09:07:49ありがとうございます。
>917
本当はgooはテンプレート引数がもっと多い巨大なクラス。
その中から幾つかをfooに渡してfooを特殊化すれば、
gooを全部特殊化しなくてもいい
(さらに本当はfooにあたるクラスは複数あって、
各々の特殊化をgooが多重継承して一つのクラスに仕上げる、
という構造になっている。)
↓
しかしその中でgooで定義されるtypedefが必要になった
↓
gooをパラメータで渡したらこうなった
といった経緯なんです。
922さんのがまさに意図していた回避法なんですが、
かなり凄い量のパラメータを与えなければならないので微妙な感じです。
0926デフォルトの名無しさん
2006/01/05(木) 09:10:59一旦白紙に戻してクラス設計やり直した方がいいんじゃまいか?
流石に巨大なテンプレートクラスを複雑に多重継承していかないと
駄目なようなのは、設計として破綻してる希ガス
0927911=925
2006/01/05(木) 09:17:35エラーになる部分だけ抜き出したつもりだったんですが……
結局回答を参考にしつつ、力技でなんとかすることになりそうです。
0928デフォルトの名無しさん
2006/01/05(木) 10:53:11今頃気づいたか。最も第三者から見て理解不能の質問の仕方だ。
0929デフォルトの名無しさん
2006/01/05(木) 11:30:240930デフォルトの名無しさん
2006/01/05(木) 12:16:52というテンプレート関数があるのですが、
Tがクラス型などの場合に備えると、引数は参照にすべきなんでしょうか?
その場合参照の引数のと参照なしの引数のと2つ関数を用意すべきでしょうか?
0931デフォルトの名無しさん
2006/01/05(木) 12:22:161. boost::call_traits<T>::param_type
2. const T&
3. T
0932デフォルトの名無しさん
2006/01/05(木) 12:24:443つ用意せい言うことですか?
0933デフォルトの名無しさん
2006/01/05(木) 12:27:31優先順位。上のほうが望ましいと俺は思っているだけ。
0934デフォルトの名無しさん
2006/01/05(木) 12:30:55じゃあboostない場合はconst T&で一括でもよろし言うことですね
ありがとございますっ
0935デフォルトの名無しさん
2006/01/05(木) 12:33:51それくらい自分で作れ。
0936デフォルトの名無しさん
2006/01/05(木) 12:36:10えっ、何のことです?
0937デフォルトの名無しさん
2006/01/05(木) 12:46:22struct call_traits {
typedef const T& param_type;
};
template<>
struct call_traits<int> {
typedef int param_type;
};
//以下値渡しするものすべてについて繰り返し
0938デフォルトの名無しさん
2006/01/05(木) 12:54:570939デフォルトの名無しさん
2006/01/05(木) 13:09:19あっ、boostと同じようなものを作れっちゅーことでしたか
てことは組み込み型は参照で受け取ったらまずい場合があるちゅうことですかね?
0940デフォルトの名無しさん
2006/01/05(木) 13:13:58まずくはないけど効率が悪いってだけ
0941デフォルトの名無しさん
2006/01/05(木) 13:59:40いろいろ調べましたがわかりません、何故効率が悪いのか教えてくださいな?
0942デフォルトの名無しさん
2006/01/05(木) 14:13:000943デフォルトの名無しさん
2006/01/05(木) 14:26:55アドレスを参照して扱うので効率が悪いというわけですか
0944デフォルトの名無しさん
2006/01/05(木) 14:54:190945デフォルトの名無しさん
2006/01/05(木) 17:41:090946デフォルトの名無しさん
2006/01/05(木) 18:01:250947デフォルトの名無しさん
2006/01/05(木) 18:13:51するする、doubleの引き数はスタックを介さずに受け渡すコンパイラもあることだし。
#つーか、そもそも最適化で消える可能性もあるわけで。
0948デフォルトの名無しさん
2006/01/06(金) 15:14:37何回も呼び出すっていう設計が想像できない俺は素人?
それともでっっっかいクラスから組み込み型にまで使う超汎用ライブラリなんだろうか
0949デフォルトの名無しさん
2006/01/06(金) 17:25:06画像処理やってみなっせ。
0950デフォルトの名無しさん
2006/01/06(金) 22:35:06値渡しのとき、オブジェクトが複製されるかどうかはコンパイラも含めて状況による。
レジスタ使いまわして、まったくオブジェクトのコピーが発生しないケースもありうる。
>>948
どんなのがインライン展開されるべきかは規定されてないから、よほど自明でないかぎり
常に関数呼び出しのオーバヘッドはあると思ってたほうが安全。嫌なら手で最適化するしか。
0951VC++スレから飛んできました
2006/01/07(土) 10:07:19別の型にしておけばいいじゃん、と思って
typedef double millisecond;
typedef double microsecond;
typedef double second;
ってやったけど、
millisecond x = 0.1;
microsecond y = 0.2;
second z = 0.3;
としても x=y; y=z; z=x; とかなんの警告も出ないのね。
やっぱそれぞれクラスを作らなきゃだめ?
0952デフォルトの名無しさん
2006/01/07(土) 10:33:190953デフォルトの名無しさん
2006/01/07(土) 10:45:000954デフォルトの名無しさん
2006/01/07(土) 10:49:490955デフォルトの名無しさん
2006/01/07(土) 10:50:57boost/strong_typedef.hpp 見てみた。
結局主要な演算子を定義した構造体を作ってるだけだった。
#include <boost/strong_typedef.hpp>
BOOST_STRONG_TYPEDEF(double,strong_millisecond);
BOOST_STRONG_TYPEDEF(double,strong_microsecond);
BOOST_STRONG_TYPEDEF(double,strong_second);
とすると、
strong_millisecond x = strong_millisecond(0.1);
double d = (double)x;
と明示的に変換しないといけなくなる。
うはwww、これでポカミスしないですみそうだ。
正規表現ライブラリくらいしか boost つかってなかったけど、
また一つ boost の恩恵に浴することができた。
0956デフォルトの名無しさん
2006/01/07(土) 10:58:430957デフォルトの名無しさん
2006/01/07(土) 11:08:15速度/時間 * 時間 == 速度 とか、数値と物理単位を同時にあつかうような例があったと思う。
0958デフォルトの名無しさん
2006/01/07(土) 11:17:070959デフォルトの名無しさん
2006/01/07(土) 14:39:33五右衛門も忘れないでね。
0960デフォルトの名無しさん
2006/01/07(土) 17:09:390961デフォルトの名無しさん
2006/01/07(土) 17:12:420962デフォルトの名無しさん
2006/01/07(土) 19:28:270963デフォルトの名無しさん
2006/01/07(土) 19:32:37型の意味を付けるはずだった、と言う話を思い出した。
inchAvgDistance += mmDist[0];
で間違いが直ぐ判るとかなんとか。
0964デフォルトの名無しさん
2006/01/07(土) 19:51:040965343
2006/01/07(土) 22:21:08としてCLASSES(Hoge)を
class Hoge; class HogeFactory;
と展開させられないでしょうか
お願いします
0966965
2006/01/07(土) 22:25:310967デフォルトの名無しさん
2006/01/07(土) 22:39:340968デフォルトの名無しさん
2006/01/07(土) 22:41:15って、2ch だと勝手に入っちゃうんだったっけ?
それはそうと、開区間、閉区間、片開区間を表現する
標準的なクラスって用意されていましたっけ??
0969965
2006/01/07(土) 23:19:47お早いレスありがとうございます。
おかげさまで、いろいろやりたかったことができそうです。
0970デフォルトの名無しさん
2006/01/08(日) 00:03:00標準にはないけどboostになら
Boost Interval Arithmetic Library
http://www.boost.org/libs/numeric/interval/doc/interval.htm
0971デフォルトの名無しさん
2006/01/08(日) 00:05:46俺もそんなことをやったことがあったが、
結局後でテンプレート使えば言いやということに気付いて#defineには引っ込んでもらった。
0972デフォルトの名無しさん
2006/01/08(日) 00:08:02Boost って本当に何でもあるよな。
えらい人たちが標準化も視野に入れてやってるんだから
大丈夫だとは思うけど、なんでもいれちゃえ、って
感じじゃないんだろうか・・・
0973デフォルトの名無しさん
2006/01/08(日) 00:11:02Boostに収録されるまでにも過程があって、
認められないとBoostには収録されない仕組みになっている。
0974デフォルトの名無しさん
2006/01/08(日) 00:22:45記述する方法ってありませんか?
2次元配列に対して処理を行う関数を複数作りたいと思っています。
例えば以下の関数sumは配列の合計を出す関数です。(変数宣言などは省略)
int sum(){
(前処理)
for(r = 0; r < nRow; r++){
for(c = 0; c < nCol; c++){
s += cell[r,c]; … (1)
}
}
(後処理)
return s;
}
似た形として、平均値を出す関数や配列の中身をインクリメントする関数など、
(1)の部分だけが異なる関数をたくさん作りたいと思っています。
ただ、(1)の部分だけ違う関数を作るにはこのままではループ部分や前処理・後処理も
記述しないといけません。
新しく関数を付け加えたいとき、できれば(1)の部分だけ書けばいいような形に
したいのですが何かいい方法がありませんか?
なお、ループの回数が多いため(1)の部分は関数呼び出しの形にはしたくないです。
(コンパイルしてインライン展開されるならok)
0975デフォルトの名無しさん
2006/01/08(日) 00:23:120976デフォルトの名無しさん
2006/01/08(日) 00:24:060977デフォルトの名無しさん
2006/01/08(日) 01:19:06typedefは別の名前をつけるだけで、全部同じ型だよ。
でも、例に挙げているのは全部同じ単位だから、別の型に定義するのは
止めといた方が……double使うのなら素直に基本単位にして使うのが
吉だと思う。
0978デフォルトの名無しさん
2006/01/08(日) 01:22:02MetaProgram
0979デフォルトの名無しさん
2006/01/08(日) 02:12:46vectorクラス、mapクラス ...と勉強していっていきなり
basic_stringコンテナとか不明な表現が出てきて困っています
察するに今までのvectorやmapも各々
vectorコンテナ
mapコンテナ
的な感覚でいいのでしょうか
0980デフォルトの名無しさん
2006/01/08(日) 02:22:41ひっくるめて、コンテナクラスライブラリといったりするね。
C++ だとそれを実現するためにテンプレートを使うから、
テンプレートライブラリと言うことも多いけど。
0981デフォルトの名無しさん
2006/01/08(日) 02:26:18container = 入れ物
和訳してみれば分かりやすいものも結構ある。
頑張れ。先は長いぞ。
0982デフォルトの名無しさん
2006/01/08(日) 02:35:310983デフォルトの名無しさん
2006/01/08(日) 02:48:09>>981
はい、ありがとうございます
せめてヘッダーの中が読めればいいのですが・・・
精進します
0984デフォルトの名無しさん
2006/01/08(日) 03:46:00enum型の型をclass A{…}の外で実装しようとしたのですが
class A{
public:
enum Event;
};
enum A::Event{ onClick, onMove }; //この行で未定義のシンボル A::Eventとエラーがでてしまいました
どう書けば良いのですか…ご教示お願いします
0985984
2006/01/08(日) 03:48:190986984
2006/01/08(日) 04:04:140987デフォルトの名無しさん
2006/01/08(日) 06:28:01出来ないことはヤメロ。
0988デフォルトの名無しさん
2006/01/08(日) 07:05:07こんなんで。それなりの最適化するコンパイラならインライン化は十分期待できるんじゃないかな。
もちろん関数ポインタじゃなくて関数オブジェクトで書いてもいいけど好みで。
#include <iostream>
const int nRow = 3, nCol = 2;
int cell[nRow][nCol];
template<class T, void func(T&, int&)>
T apply() {
T tmp = 0;
for (int r = 0; r < nRow; ++r)
for (int c = 0; c < nCol; ++c)
func(tmp, cell[r][c]);
return tmp;
}
void inc(int &tmp, int &x) { ++x; }
void add(int &tmp, int &x) { tmp += x; }
typedef int apply_func(void);
apply_func *all_inc = apply<int, inc>;
apply_func *sum = apply<int, add>;
int main() {
all_inc();
std::cout << sum() << std::endl;
}
0989974
2006/01/08(日) 11:20:58あーなるほど、関数ポインタ自体をテンプレートにしてしまえばいいのか。
自分で考えたときには関数ポインタを引数で渡す形しか思い浮かばなかったので、
これじゃインライン展開されないよなぁ…ということでドツボにはまってました。
MetaProgramってのははじめて聞きました。
でもやることに対してちょっと大掛かりすぎるので今回は見送りたいと思います。
これで見難いマクロで無理やり実現する必要がなくなりそうです。
どうもありがとうございました。
0990デフォルトの名無しさん
2006/01/08(日) 11:29:590991デフォルトの名無しさん
2006/01/08(日) 12:12:460992デフォルトの名無しさん
2006/01/08(日) 12:14:18「テンプレートは別スレ」という表現はどうかと思う。
0993デフォルトの名無しさん
2006/01/08(日) 12:25:49C++相談室 part46
http://pc8.2ch.net/test/read.cgi/tech/1136690107/
0994デフォルトの名無しさん
2006/01/08(日) 12:43:230995デフォルトの名無しさん
2006/01/08(日) 12:44:110996デフォルトの名無しさん
2006/01/08(日) 12:45:320997デフォルトの名無しさん
2006/01/08(日) 12:46:480998デフォルトの名無しさん
2006/01/08(日) 12:58:430999デフォルトの名無しさん
2006/01/08(日) 13:01:441000デフォルトの名無しさん
2006/01/08(日) 13:01:4410011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。