C++相談室 part50
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2006/06/04(日) 22:21:22ただし質問の前にはFAQに一通り目を通してください。
IDE(VC++など)などの使い方の質問はその開発環境のスレに
お願いします。
→ テンプレその他 >>1-15 付近参照 ←
前スレ
C++相談室 part49
http://pc8.2ch.net/test/read.cgi/tech/1146185570/
0002デフォルトの名無しさん
2006/06/04(日) 22:22:042 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デフォルトの名無しさん
2006/06/04(日) 22:22:4117 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デフォルトの名無しさん
2006/06/04(日) 22:24:0032 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/
44 http://pc8.2ch.net/test/read.cgi/tech/1128512737/
45 http://pc8.2ch.net/test/read.cgi/tech/1133007604/
0005デフォルトの名無しさん
2006/06/04(日) 22:25:0647 http://pc8.2ch.net/test/read.cgi/tech/1139931895/
48 http://pc8.2ch.net/test/read.cgi/tech/1142423595/
49 http://pc8.2ch.net/test/read.cgi/tech/1146185570/
0006デフォルトの名無しさん
2006/06/04(日) 22:27:11[C++ FAQ]
http://www.parashift.com/c++-faq-lite/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
Cとその仕様を比較しながらの解説なので分かりやすい。
***** 質問の前に必ずこの二つに目を通してください *****
[禿 Stroustrup]
http://public.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デフォルトの名無しさん
2006/06/04(日) 22:30:01amazon.com C,C++関連書籍
http://www.amazon.com/exec/obidos/tg/browse/-/3956/ref=br_bx_c_1_3/
The C++ Programming Language
ttp://www.amazon.com/exec/obidos/ASIN/0201700735/
ttp://www.amazon.co.jp/exec/obidos/ASIN/475611895X/ (翻訳)
C++ Primer (3rd Edition)
ttp://www.amazon.com/exec/obidos/ASIN/0201824701/
ttp://www.amazon.co.jp/exec/obidos/ASIN/4756140068/ (翻訳)
The C++ Standard Library
ttp://www.amazon.com/exec/obidos/ASIN/0201379260/
ttp://www.amazon.co.jp/exec/obidos/ASIN/4756137156/ (翻訳)
Effective C++
ttp://www.amazon.com/exec/obidos/ASIN/0201924889/
ttp://www.amazon.co.jp/exec/obidos/ASIN/4756118089/ (翻訳)
More Effective C++
ttp://www.amazon.com/exec/obidos/ASIN/020163371X/
ttp://www.amazon.co.jp/exec/obidos/ASIN/4756118534/ (翻訳)
Exceptional C++
ttp://www.amazon.com/exec/obidos/ASIN/0201615622/
ttp://www.amazon.co.jp/exec/obidos/ASIN/4894712709/ (翻訳)
More Exceptional C++
ttp://www.amazon.com/exec/obidos/ASIN/020170434X/
Exceptional C++ Style
ttp://www.amazon.com/exec/obidos/ASIN/0201760428/
C++ Coding Standards
ttp://www.amazon.co.jp/exec/obidos/ASIN/0321113586/
ttp://www.amazon.co.jp/exec/obidos/ASIN/4894716860/ (翻訳)
0008デフォルトの名無しさん
2006/06/04(日) 22:32:23Effective 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/
0009デフォルトの名無しさん
2006/06/04(日) 23:14:10結局どうしたらいいんだろう?
リダイレクトされるここに修正すればいい?
http://www.ddj.com/dept/cpp/cuj.jhtml
0010デフォルトの名無しさん
2006/06/04(日) 23:28:31[Boost]
Boost http://www.boost.org/
(日本語) http://www.kmonos.net/alang/boost/
(日本語) http://shinh.skr.jp/boost/
[標準ライブラリ]
SGI-STL http://www.sgi.com/tech/stl/
STLport http://stlport.sourceforge.net/
GNU libstdc++ http://gcc.gnu.org/libstdc++/
Apache STDCXX http://incubator.apache.org/stdcxx/
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://sourceforge.net/projects/loki-lib/
LokiPort-MSVC6sp5 http://fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport
0011デフォルトの名無しさん
2006/06/04(日) 23:32:03【初心者歓迎】C/C++室 Ver.27【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1147183708/
【C++】STL(Standard Template Library)相談室 5
http://pc8.2ch.net/test/read.cgi/tech/1143608073/
C/C++の宿題を片付けます 65代目
http://pc8.2ch.net/test/read.cgi/tech/1147908265/
C/C++でのWindowsPrograming議論スレ(質問お断り)
http://pc8.2ch.net/test/read.cgi/tech/1049790146/
managed C++ やろうぜ!! 002
http://pc8.2ch.net/test/read.cgi/tech/1139043535/
C++/CLI について語ろうぜ Part2
http://pc8.2ch.net/test/read.cgi/tech/1142147319/
くだすれC++Builder(超初心者用)その2
http://pc8.2ch.net/test/read.cgi/tech/1144308804/
ATL/WTL Part4
http://pc8.2ch.net/test/read.cgi/tech/1134388951/
【雑談】C/C++【その1】
http://pc8.2ch.net/test/read.cgi/tech/1098817686/
0012デフォルトの名無しさん
2006/06/04(日) 23:33:13環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
#include <stdafx.h>
後死ね。
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
0013デフォルトの名無しさん
2006/06/04(日) 23:49:16乙
0014デフォルトの名無しさん
2006/06/05(月) 00:23:420015デフォルトの名無しさん
2006/06/05(月) 00:31:08_ / ⌒)
_,. ‐'´ ̄ { ヽkュく
_, ィ^ヽ丶\\ `Y j>─‐┐
. \\ ィ ──ァ /〉 ,イ /i|\__\∠、 \ゝ. ハ. /
> > │ / // ///川、 \イじツ Yi \!イ廴ヽ./\
// ┴ ∠ _」 // ! ||ト|ゝハァュ一 ||j |三三三三三 \. /〉
o'´ _`ヘゝヽヘ.¨ f⌒>、ルじj三三三三三三ツヲ7/
`ヾ _>ド、ゞ .ノ ゞ==三三三 r'´1j│}ク'/ト
r===テミ 、 ヽ>、 ィvi|二ユ三_,/ メ'7´/三i
j /'´ ̄ ̄`¨ ┴┴'─ ¬! ´ _/三三j
/リ¬、_ __/-‐=イ三三三=i
//i^メミュ! 丶、__, ィY7フ´ / j三三三三!
/三⊆ミ‐=' \_, `' Yr──┴─ ¨´‐- ̄\ /三三三三|
/三三三三ヘ __/__厶_ /ヾ 、三三三|
/三三三三三三三三|  ̄ フ _ /_」j三三三j
//三三三三三三三三ハ / ` ¬''´三三/三三/
//三三三三三三三三三ノ / /三三三j三三/
//イ三三//三三三三三// _/三三//三 /
////三/ /三三三三 _/ 〈三三/ 〃//
0016989
2006/06/05(月) 00:57:35ありがとうございます
なんとなくですが理解できました
>JavaとかC#の人?
そうです
普段使っているのはC#、Java、VB.NETあたりです
0017デフォルトの名無しさん
2006/06/05(月) 02:18:26> STLつかうと一気に実行ファイルサイズが10倍に?!
>
> 環境によるだろ。
> 俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
> ランタイムを使用するようにして使っているが、例えばstd::vectorを
> 使っても使わない時と比べ10Kほどしか増えない。
>
> すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
経緯を知らないので聞くが、このやり取りって何?
0018デフォルトの名無しさん
2006/06/05(月) 02:28:09http://pc8.2ch.net/test/read.cgi/tech/1045746245/15
もう一つの方はPart17から
http://pc8.2ch.net/test/read.cgi/tech/1047560042/21
0019デフォルトの名無しさん
2006/06/05(月) 02:50:10ども。流れ読んできた。
話が散逸していたのでうまく切りにくいが、
せめて↓はテンプレに入れた方がいい気がした。
(ノードベースコンテナならどうだとかツッコミ始めるとキリがないが)
part16の27から抜粋:
> STLはDLLに追い出せてないと思います。何せテンプレートで、コンパイル時
> にしかわからないものばかりのはずですから。
0020デフォルトの名無しさん
2006/06/05(月) 03:07:21未定義なんですか?
0021デフォルトの名無しさん
2006/06/05(月) 09:09:16特に決まってないみたい。
一般的な実装ではプログラムイメージをメモリにロードした時点で
初期化が完了している。個々の順番とかいうのはわかんないね。
0023デフォルトの名無しさん
2006/06/05(月) 10:28:13main 関数前に参照って、どこでやるつもり?
グローバルオブジェクトのコンストラクタ("dynamic initialization"に含まれる)なら、
必ず POD の初期化("static initialization"に含まれる)の後に来るから大丈夫。
0024デフォルトの名無しさん
2006/06/05(月) 12:03:01const int B = A * 10;
こういうのはどうなんだろう?
#define の代わりとして const の仕様をわざわざ変えた以上、
これは期待通りに動くように(B が 200 になるように)
仕様で決められてるべきだと思うんだけど。
0025デフォルトの名無しさん
2006/06/05(月) 12:21:090026デフォルトの名無しさん
2006/06/05(月) 13:08:330027デフォルトの名無しさん
2006/06/05(月) 13:25:00002826
2006/06/05(月) 13:36:04俺のこと?ごめんでも
ttp://www.01-tec.com/document/code_design/vol06.html
このページにこう書いてあったんだ
「
ただ,C/C++の関数では引数に配列が渡せないので
配列のサイズ情報も引数に渡す必要がありました
(C/C++って微妙に不便ですね).
」
0029デフォルトの名無しさん
2006/06/05(月) 13:39:500031デフォルトの名無しさん
2006/06/05(月) 13:45:13そのページ、配列のサイズも自動で読み取るtemplateも書けることは
言及せず、サイズを指定する必要があると書いてるんだな
ともあれC++では、配列以外にも配列のようなもの(シーケンス)も
まとめて共通概念として使えるように整備されてるし、
すでに配列以外のテンプレート・コンテナが多数あるので
逆にCから引き継がれた「配列」がわりと邪魔だったりする。
std::vectorなんかが普通にいう配列みたいなポジションになってるので
これなら引数に普通に渡せるよ。
003229
2006/06/05(月) 13:52:17例えば配列の要素数を返す関数はこうなる。
template<typename T, std::size_t N> inline std::size_t numberof(T (&)[N]) {return N;}
でもまぁ、>31の言うように普通にvectorを渡せよって気もする。
static bool find(std::vector<int> const & foo, int ch)
{
std::vector<int>::const_iterator it = std::find(foo.begin(), foo.end(), ch);
return !(it == foo.end());
}
const int foo[] = {1, 3, 4, 6, 8, 10, 12};
std::vector<int> vfoo(foo, foo + sizeof(foo) / sizeof(* foo));
cout << func(vfoo, 2) ? "Found" : "Not found";
// ブラウザで直書きだから間違ってたらゴメン。
0034デフォルトの名無しさん
2006/06/05(月) 16:06:540035デフォルトの名無しさん
2006/06/05(月) 16:15:06ハンドルの獲得が主じゃないかね。
ポインタでも同じことはできるけど、ポインタよりも束縛が強い分、安心して使える。
0036デフォルトの名無しさん
2006/06/05(月) 16:35:28それを又1行ずつコンソールに表示しておわり、というプログラム
を書きたいのですが、以下のように書くと最後の行だけ2回表示されて
しまいます。どう書けばよいか教えてください。
--------------------------------------------------------
#include <iostream>
#include <fstream>
int main()
{
std::ifstream ifs("test.csv");
std::string str;
while (! ifs.eof()) {
ifs >> str;
std::cout << str << std::endl;
}
return 0;
}
--------------------------------------------------------
よろしくお願いします。
0037デフォルトの名無しさん
2006/06/05(月) 16:42:08ifs >> str;
if (ifs.eof()) break;
std::cout << str << std::endl;
}
0038デフォルトの名無しさん
2006/06/05(月) 16:42:11#include <fstream>
int main()
{
std::ifstream ifs("test.csv");
std::string str;
while (std::getline(ifs, str)) {
std::cout << str << std::endl;
}
return 0;
}
003934
2006/06/05(月) 16:46:30すみません。ハンドルってのが何を指すのかわかりません
たとえば
int i;
int &j = i;
このときの j がハンドルですか?
そうだとするとこれのメリットがわかりません
結局iもjも同じものを指すに過ぎないのだから
2つも同じものを指すものが存在したところで
どんなメリットが生じるのでしょうか?
それとリファレンスはポインタよりも束縛が強い
とのことですが、束縛が強いとはどういう意味でしょうか?
ポインタみたいにリファレンスはそれを使った演算が出来ない点
をいっているのでしょうか?
長くなって失礼しました
0040デフォルトの名無しさん
2006/06/05(月) 17:06:38例えば配列内の同じ要素に何度もアクセスする場合、
array[1][2][3] は *(array+1+2+3) のように、毎回位置を計算する必要があるだろ?
これを前もって
int& elem=array[1][2][3];
としておいて、その後の要素アクセスはelemを使うようにすれば位置計算が省ける、とそういう理屈。
ポインタでも同じことは可能だけれど、アスタリスクがついたり何かと見辛いのが難点。
参照は普通の変数と同じように扱えるから、比較的綺麗なコードになる。
もちろんこんな例はコンパイラの最適化でも同じような効果があるからあまり意味はないんだけども。
もうちょっと複雑になってくると重宝する。
コードが見やすくなるのもメリット。
多次元配列や複雑な要素アクセスは見辛いからな。
別名をつけておくことで、格段に読みやすいコードになる場合も多々ある。
その類で、シングルトンを使う際の省略にも使ったりする。
例えば
Hoge::getSingleton().method1();
Hoge::getSingleton().method2();
と書く代わりに、関数の先頭で一回だけ
Hoge& ref = Hoge::getSingleton();
のように取得しておいて、関数内では
ref.method1();
ref.method2();
みたく使えば見通しがいいコードになる。
IrrlichtEngineなんかはこういう記法を多用してたな。
0041デフォルトの名無しさん
2006/06/05(月) 21:12:12ポインタを直接晒してクライアントに操作されちゃマズーなんで、
ハンドル経由で操作させる
Win32APIとか
0042デフォルトの名無しさん
2006/06/06(火) 00:00:58struct A
{
int a, b, c, d, e, f;
A(const A& x);
A& operator = (const A& x);
};
が有ったとします。で、コピーコンストラクタと代入演算子ですが、
c 以外のメンバーはビットコピーし、c だけ 0 に置き換えたいの出すが、
この場合、それぞれの定義で
a = x.a; b = x.b; c = 0; d = x.d; e = x.e; f = x.f;
か、
memcpy(...); c = 0;
しか手っ取り早い方法はないですか?
0043デフォルトの名無しさん
2006/06/06(火) 00:21:470044デフォルトの名無しさん
2006/06/06(火) 00:33:40Cだって、コンパウンドリテラルがあるから直接配列渡せるはず
0045デフォルトの名無しさん
2006/06/06(火) 00:55:22なぜ、そんなことをしたいのかが気になる
004642
2006/06/06(火) 01:07:00あくまで例えなんで。また、もう一つ例えで
class X
{
public:
X(const X&);
X& operator = (const X&);
private:
・・・ // メンバー変数いっぱい
struct impl;
impl *pimpl; // impl にもメンバー変数いっぱい
};
全てのメンバー変数の複製を作る場合、
pimpl は特別な処理をしなきゃいけなくなりますよね。
そこでコピーコンストラクタと代入演算子を独自に定義したら、
丸々コピーしてくれるデフォルトのコピーコンストラクタと代入演算子が当然使えなくなる訳ですよ。
そうなると、Xの メンバー変数いっぱい をチマチマ代入しなきゃいけなくなるんで、
楽かつシンプルな方法はないかと考えていまして。
memcpyだとメンバーが単純なビットコピーじゃない場合に不具合が生じるし…
0047デフォルトの名無しさん
2006/06/06(火) 01:08:090048デフォルトの名無しさん
2006/06/06(火) 01:09:02設計が不味いとしか思えない。
0049デフォルトの名無しさん
2006/06/06(火) 02:04:58pimpl に、コピーの意味づけを加えたポインタクラスを使え。
0050デフォルトの名無しさん
2006/06/06(火) 02:06:16ハンドルの使用と参照型の使い方は関係ないだろ。初心者を混乱させるな。
0051デフォルトの名無しさん
2006/06/06(火) 02:15:03C++ってjavaと比較してお仕事の絶対量って少ないのでしょうか?
求人を見るとjavaやphpばかりで・・・。
0052デフォルトの名無しさん
2006/06/06(火) 02:21:16そんなことを知ってどうする?調査、統計しないと結論は出ないしね。
話を続けると C++ の話題から遠ざかるだろうから、これ以上は他所でやってくれ。
0053デフォルトの名無しさん
2006/06/06(火) 02:25:47時間があれば。
0054デフォルトの名無しさん
2006/06/06(火) 02:27:41ライブラリはちと時間かかるが。
005542
2006/06/06(火) 02:34:07有りそうな例を考えたつもりですが、結構変な例でしたか。
正直、ただ単にチマチマ代入文書くのが面倒なだけです。
a = x.a; b = x.b; c = 0; d = x.d; e = x.e; f = x.f;
と書くのも見栄えがあまり良くないと思ったもので。
>>49
それしかコピーコンストラクタと代入演算子内でシンプルに書ける方法が
なさそうですよね。
ありがとう御座いました。ねます。
0056デフォルトの名無しさん
2006/06/06(火) 06:00:02C++FAQ 第2版 ローカルリファンレンスとは何か を参照。
0057デフォルトの名無しさん
2006/06/06(火) 10:26:23あるクラステンプレートMyClass用のoperator<<をオーバーロードしたいとします。
敢えてfriend宣言のtemplateを省略し、
template <class T>
class MyClass {
...
friend std::ostream& operator<<(std::ostream&, const MyClass&);
};
template <class T>
std::ostream& operator<<(std::ostream& os, const MyClass<T>& m) { ... }
の形にすると「Undefined reference」となりコンパイルできませんが、
std::ostream& operator<<(std::ostream&, const MyClass<int>&) { ... }
のように明示的な関数を定義しておけば正常にコンパイルされ、実行できます。
(non-template-friend警告は無視しています)
なぜこのような差が生じてしまうのでしょうか?
MyClass<int>のインスタンスを作った際に、MyClass<int>が実体化され、
friend std::ostream& operator<<(std::ostream&, const MyClass<int>&);
の宣言が行われるかと思っていたのですが、もし宣言が行われているならば
最初の定義でマッチしないのは不自然に思えてしまいます。
実体化のタイミングがズレているのでしょうか?
長文失礼致しました。
0058デフォルトの名無しさん
2006/06/06(火) 10:39:54friend std::ostream& operator<<(std::ostream&, const MyClass<TT>&);
0059デフォルトの名無しさん
2006/06/06(火) 10:54:12環境:
Windows XP SP2
VC++6.0(記述はC言語)
目的:
位置を自由に変更できるモーダレスなダイアログボックスを表示したい
コード:
WinMain関数内で、
DialogBox(hInstance, "MYDIALOG", NULL, (DLGPROC)DlgProc);
と記述しています。
hInstance:アプリケーションハンドル
MYDIALOG:自分でつくったダイアログの名称
DlgProc:ダイアログプロシージャ
結果:
実行するとなぜか位置が固定でタイトルに何も表示されないダイアログボックスが表示されてしまいます。
タイトルキャプションには「ダイアログ」と入力しているのですが。
どなたかアドバイスお願いします。
0060デフォルトの名無しさん
2006/06/06(火) 11:01:43>>1を読んで
0061デフォルトの名無しさん
2006/06/06(火) 11:03:58もしnewとdeleteの途中でexitとかさせると、
それはメモリリークになりますか?
0062デフォルトの名無しさん
2006/06/06(火) 11:08:07Windows, UNIX, Mac OS Xはメモリリークしないです。
0063デフォルトの名無しさん
2006/06/06(火) 11:31:48こうかな?ウザイな。
template<class T>
class MyClass;
template <class T>
std::ostream& operator<<(std::ostream& os, const MyClass<T>& m);
template <class T>
class MyClass {
...
friend std::ostream& operator<< <T> (std::ostream&, const MyClass&);
};
template <class T>
std::ostream& operator<<(std::ostream& os, const MyClass<T>& m) { ... }
0064デフォルトの名無しさん
2006/06/06(火) 11:39:43なんか用語としての意味があるの?
「ローカルリファレンス」と "local reference" どちらでググっても
C++ FAQ の目次しか出てこないから、何か勘違いしてるんじゃないの?
そんな平易な言葉に見たまま以上の意味を持たせるのはやめてほしい。
006557
2006/06/06(火) 11:49:04言葉足らずで済みません、そうしなければいけないことは分かっているのですが、
敢えて省略した際の動作が不可解だったので質問させて頂きました。
>>63
確かにそれで通りますね…
といってもなぜそれで通るようになるのか分からず…(TT
もう少し勉強してみます。
006659
2006/06/06(火) 11:55:040067デフォルトの名無しさん
2006/06/06(火) 11:56:55gcc「non-template-friend警告て言うてるやん!無視すなや。もうあほかと」
0068デフォルトの名無しさん
2006/06/06(火) 15:25:26こんなコードみかけたんだけど
for文ってfor(xxx; xxx; xxx)
みたいに()の中は三つ項目がいるんじゃなかったの?
上記のコードが何をしているか説明して下さい
0069デフォルトの名無しさん
2006/06/06(火) 15:28:203つあるじゃん。3つ目は空っぽだけど。
やってることは
for(a;b;c){} と a; while(b){c;}が等価ってことで分かるっしょ
0070デフォルトの名無しさん
2006/06/06(火) 15:29:57p という恐らくは何らかのコンテナの末尾から先頭に向かって、
全ての要素に c を代入している。
ちなみに for 文では空文が許可されている。
0071デフォルトの名無しさん
2006/06/06(火) 15:30:47s だったorz
0072デフォルトの名無しさん
2006/06/06(火) 15:38:49==は代入じゃなくて比較なので
cと一致しない値を見付けるまでpを逆走させてる
007368
2006/06/06(火) 15:53:02こんなforの使い方もあるんですね
すみませんあと一個聞かせて下さい
for( int i = 0; i < 3; i++) { printf("%d\n", i); }
このコードの実行順序は
1 i = 0
2 i < 3
3 printf
4 i++
5 i < 3
6 printf
7 i++
8 printf
...
であっていますか?
007468
2006/06/06(火) 15:54:20> 8 printf
8 i < 3
です
0075デフォルトの名無しさん
2006/06/06(火) 15:59:38yes
0076デフォルトの名無しさん
2006/06/06(火) 16:12:52空文じゃなくて、式がφです。
0077デフォルトの名無しさん
2006/06/06(火) 23:18:51privateメンバ関数をオーバーライドできる事に今気づきました
VC++2005でできたんですが、これはもちろん標準C++の機能ですよね?
0078デフォルトの名無しさん
2006/06/06(火) 23:28:22もちろん標準C++のうち。
メンバをオーバーライドするに当たって、その可視性は問われない。
でも仮想関数の場合は、そもそも仮想関数をprivateにするのは、どうかとは思うけど。
0079デフォルトの名無しさん
2006/06/06(火) 23:37:15出来なかったら不便この上ないでしょ。
実装部分をメソッドとしてまとめられないし
0080デフォルトの名無しさん
2006/06/06(火) 23:41:07privateメンバ関数を仮想にするのは
調べてみたところ「NVIイディオム」とやらに使用する場合があるみたいです
class A{
private:
virtual void Print(){ std::cout << "is A";}
public:
void CallPrint(){ Print();}
};
class B :public A{
virtual void Print(){ std::cout << "is B";}
};
A* a = new B;
a->CallPrint(); // "is B"と表示
0081デフォルトの名無しさん
2006/06/07(水) 00:04:40続く感じなんだけど、みんなはどうしてる?
>80 は逆みたいだね。やっぱりデフォルトが private だから?
0082デフォルトの名無しさん
2006/06/07(水) 00:45:50どうでもいい話題を持ち込むなバカ
0083デフォルトの名無しさん
2006/06/07(水) 01:44:45それは宗教戦争になるからここでは触れない方が吉。
008481
2006/06/07(水) 01:57:510085デフォルトの名無しさん
2006/06/07(水) 02:25:31どういう順番で実装するかは、お好みだし、宗教戦争になるかもしれんが
どう考えても public が先に決まるだろ?
でないと class になってる意味が無いような気がする。
0086デフォルトの名無しさん
2006/06/07(水) 02:26:330087デフォルトの名無しさん
2006/06/07(水) 12:08:29int i = 0;
int j = 1;
int & r = i;
r = j;
r = 2;
としたときに、i, j それぞれに何が入るか分かっていれば、
> それとリファレンスはポインタよりも束縛が強い
> とのことですが、束縛が強いとはどういう意味でしょうか?
という言葉は出てこない気がする。
0088デフォルトの名無しさん
2006/06/07(水) 12:45:31ハンドルは忘れろ。
0089デフォルトの名無しさん
2006/06/07(水) 12:46:56> 束縛が強いとはどういう意味でしょうか?
初期化時にどこを参照するか決められて、以後変えることはできない。
初期化しないことも許されない。
0090デフォルトの名無しさん
2006/06/07(水) 14:11:18別に間違ってはいないだろ
0092デフォルトの名無しさん
2006/06/07(水) 15:31:380094デフォルトの名無しさん
2006/06/07(水) 16:49:31for (式opt; 式opt; 式opt) 式
だからさ。最後の"式opt"の後ろには";"ないし。
0095デフォルトの名無しさん
2006/06/07(水) 17:11:360096デフォルトの名無しさん
2006/06/07(水) 17:30:58しかもその中身もちょっと違う。
for (int i = 0;のように、ここで変数宣言できるよう、正しくはこうだ。
繰り返し文:
for ( for初期化文 条件opt ; 式 opt ) 文
for初期化文:
式文
単純宣言
0097デフォルトの名無しさん
2006/06/07(水) 20:39:25for初期化文:
式文
単純宣言
これの意味がわからないです
0098デフォルトの名無しさん
2006/06/07(水) 21:16:270099デフォルトの名無しさん
2006/06/07(水) 21:39:20ハンドルは忘れろ。
0100デフォルトの名無しさん
2006/06/07(水) 21:55:57C/C++の規格ではそういう記法を使っている。
0101デフォルトの名無しさん
2006/06/07(水) 22:58:34C++の規格ではどっちが正しいのか教えてくれ。
std::ofstream fout;
std::ostream *pout = fout ? &fout : &std::cout;
std::ostream &out = fout ? fout : std::cout;
gcc3.4.4だと両方通る。
VC8だと上が通って下が通らない。エラーメッセージはこんなん。
エラー1error C2248: 'std::basic_ios<_Elem,_Traits>::basic_ios' : private メンバ (クラス 'std::basic_ios<_Elem,_Traits>' で宣言されている) にアクセスできません。c:\program files\microsoft visual studio 8\vc\include\ostream581
なぜかヘッダーにエラーがあることになってるんだけど、&outの行を
コメントアウトするとコンパイル通るからこの行のせいだと思うんだ。
C++の規格的にはどっちが正しい?
0102デフォルトの名無しさん
2006/06/07(水) 23:04:100103デフォルトの名無しさん
2006/06/07(水) 23:06:59これはVC8でもコンパイルできた。
std::ostream &out = fout ? static_cast<std::ostream&>(fout) : std::cout;
条件演算子の結果の型を決める手順はきちんと規格書を呼んだわけではないが、結構複雑だと聞いたことがある。
0104デフォルトの名無しさん
2006/06/08(木) 00:31:06アホですね
0105デフォルトの名無しさん
2006/06/08(木) 01:05:15ありがとう。castで通るとはね。
エラーメッセージとの関連性がまだ見えなくて気になるけど
gccでも通ったからひとまずこれで回避させてもらうよ。
0106デフォルトの名無しさん
2006/06/08(木) 17:17:40typedefが型の別名を定義するというのは知っていますが、
↑のはどういう意味なのでしょうか?
0107デフォルトの名無しさん
2006/06/08(木) 17:27:15TCHAR = WCHAR
PTCHAR = WCHAR *
0109デフォルトの名無しさん
2006/06/08(木) 17:54:24Header.insert( make_pair(key, value) );
cygwin上のgcc version 3.4.4では通ったんだが
SolarisのCC 5.8では
std::multimap<std::string, std::string, std::less<std::string>, std::allocator<std::pair<const std::string, std::string>>>::insert(std::pair<std::string, std::string>) と一致するものがありません.
て言われる。なんでだろ?
0110デフォルトの名無しさん
2006/06/08(木) 18:38:070111デフォルトの名無しさん
2006/06/08(木) 20:13:55{
}
Linuxのcのサンプルプログラムでよく
上のみたいな**argvってのを見かけるんですが
どうしてポインタのポインタになっているんですか?
0112デフォルトの名無しさん
2006/06/08(木) 20:16:30そういうあほな質問は別スレでやってくれないか
0113デフォルトの名無しさん
2006/06/08(木) 21:21:16argvの利用方法を理解していればおのずと分かる。
0114デフォルトの名無しさん
2006/06/08(木) 21:28:32・・・・・・
0115デフォルトの名無しさん
2006/06/08(木) 23:50:14ワラタw
0116デフォルトの名無しさん
2006/06/08(木) 23:56:180117デフォルトの名無しさん
2006/06/09(金) 00:08:020118デフォルトの名無しさん
2006/06/09(金) 00:27:360119デフォルトの名無しさん
2006/06/09(金) 00:42:16int main(int argc, char *argv[])
こうすると分かりやすいかもしれない(厳密に同じ意味である)
ようするに文字列の集まりを渡そうとしている
不気味なインターフェイスはCがそうだからだろう
0120デフォルトの名無しさん
2006/06/09(金) 03:48:46解答うpしますね。
ちなみに環境はxyzzyです。
(defun _reverse (x &optional (y nil))
(if (null x)
y
(_reverse (rest x) (cons (first x) y))))
(defun _append (x y)
(if (null x)
y
(cons (first x) (_append (rest x) y))))
(defun _length (x &optional (y 0))
(if (null x)
y
(_length (rest x) (+ y 1))))
0121デフォルトの名無しさん
2006/06/09(金) 03:56:53ワイド文字を格納して、それをcoutで表示させようとしてもアドレスみたいなのが出て、
ちゃんと表示されません。
C++では、wchar_tを使って格納した文字をどのようにしたら画面に表示させられるのでしょうか?
0122デフォルトの名無しさん
2006/06/09(金) 03:57:290123・∀・)っ-○◎● ◆toBASh....
2006/06/09(金) 04:00:38std::wcout << L"ちなみにwendlはねーよwwwwww" << std::endl;
0124・∀・)っ-○◎● ◆toBASh....
2006/06/09(金) 04:06:00std::wcout.imbue(std::locale("japanese");
0125デフォルトの名無しさん
2006/06/09(金) 04:12:20C:\Documents and Settings\Owner\デスクトップ\VC++\Sample_program\練習用\resnnsyuuu.cpp(14) : error C2065: 'wcout' : 定義されていない識別子です。
C:\Documents and Settings\Owner\デスクトップ\VC++\Sample_program\練習用\resnnsyuuu.cpp(14) : error C2297: '<<' : 不正な右オペランドです。
というエラーが出ました。どうしたらいいでしょうか?
0126デフォルトの名無しさん
2006/06/09(金) 04:17:12コンパイラが wcout をサポートしているかどうか調べるといい。
このスレで聞いてもスレ違いだから気をつけて。
0127デフォルトの名無しさん
2006/06/09(金) 04:22:41ありがとうございました!!
0128111
2006/06/09(金) 08:08:09おまえらもうゆるさないぞー
0129デフォルトの名無しさん
2006/06/09(金) 08:39:51どういう意味ですか?
0130デフォルトの名無しさん
2006/06/09(金) 08:41:460131デフォルトの名無しさん
2006/06/09(金) 10:47:08HeaderってBoostの?非標準なライブラリは使ってないぞ
まあこれは仮名なんで実際のソースはこの名前じゃない。
なんとなく原因は分かってきたので確信ついたら書くお。
0132≠110
2006/06/09(金) 11:06:04いやだから、>109の1行目はHeaderを型宣言しているよな。
で、2行目は型のメンバを呼ぼうとしているよな。
例えばこうなら納得いくんだがな。
typedef std::multimap<std::string,std::string> Header;
Header header;
header.insert( make_pair(key, value) );
0133109
2006/06/09(金) 11:22:36あーそいうことね
すまそ、書き方不足でした。
ちなみに解決。
下の書き方だとgccでもCCでも通った。
typedef std::multimap<std::string,std::string> Header;
typedef Header::value_type Entry;
Header header;
header.insert( Entry(key, value) );
pairじゃなくてvalue_typeを使うのが標準ってことなのかね
0134デフォルトの名無しさん
2006/06/09(金) 11:27:34hh=12
mm=34
ss=56
という様に代入するプログラムはどうやって書くんですか?
0135デフォルトの名無しさん
2006/06/09(金) 11:32:15value_type は pair<string const, string> なんだが、これは
pair<string, string> から暗黙に変換できるはず。
この変換には pair のコンストラクタテンプレートが使われるんだが、
CC はそこ(メンバ関数テンプレート?)らへんで失敗してるんだろう。
0136デフォルトの名無しさん
2006/06/09(金) 11:34:19まず自分で書いて、問題があればその問題を相談しろ。
0137デフォルトの名無しさん
2006/06/09(金) 12:03:43俺はエディタ使って書くが
0138デフォルトの名無しさん
2006/06/09(金) 12:06:220139デフォルトの名無しさん
2006/06/09(金) 13:24:19int64_tを使っているんですが、これでよいのですか?
long long とかを使うべきなんですか?
0140デフォルトの名無しさん
NGNG0141デフォルトの名無しさん
2006/06/09(金) 16:23:56教えていただけると助かります。。。。。
0142デフォルトの名無しさん
2006/06/09(金) 16:26:12出来る
0143デフォルトの名無しさん
2006/06/09(金) 16:27:05そんなのどのぐらいの制度を要求されてるのかによるじゃんよ。
値が対数的に分布するような変数ならlong long使うより浮動小数点数にして係数調整したほうがいい。
>>141
IEの機能を読み込む形でかなり簡単に作れた気がする。
0144デフォルトの名無しさん
2006/06/09(金) 16:28:04対数×→指数○
0145デフォルトの名無しさん
2006/06/09(金) 16:32:28IEに依存する<基本クラスCHtml view>を用いたものは出来たのですが、
自作でのHTMLレンダリングエンジンを作りたいと考えています。
0146デフォルトの名無しさん
2006/06/09(金) 16:36:250147デフォルトの名無しさん
2006/06/09(金) 16:51:06方法を求む!!!!!
0148デフォルトの名無しさん
NGNGどうにかしてコネクションを張る
↓
HTTPで必要な情報を取り出す
↓
取り出した情報を適切に解釈する
↓
解釈した情報を元に描画する
0149デフォルトの名無しさん
2006/06/09(金) 16:59:24難しそうだけどプログラムを組みたいと思います。
0150デフォルトの名無しさん
2006/06/09(金) 17:23:140151デフォルトの名無しさん
2006/06/09(金) 19:49:04void func(struct A::B& x) { ... } ←ここをどうにかしたい
struct A
{
struct B { ... };
};
0152デフォルトの名無しさん
2006/06/09(金) 19:51:22全くそのとーり〜
意味が分からんが・・・とりあえず流した。
0153デフォルトの名無しさん
2006/06/09(金) 20:12:36{
voif foo();
};
みたいな記述を見かけるのですが、
1 コンパイラはどういう順番でコレを解釈するんでしょうか?
(Aの親クラスがhoge<A>で、Aの定義は・・ と無限ループしないか?)
2 どういう用途に使われるんでしょうか
3 この技法は一般的に何と呼ばれるんしょうか
解説したサイト等を探してるのですが、検索ワードが思いつきません・・・
0154デフォルトの名無しさん
2006/06/09(金) 20:24:39ttp://www.fides.dti.ne.jp/~oka-t/cpplab-selfref-template.html
0155デフォルトの名無しさん
2006/06/09(金) 20:27:121. とりあえず、hoge クラステンプレートの定義を読む。
この時点ではコンパイルされない。
2. とりあえず、A の定義を読む。まだコンパイルされない。
3. コンパイル中に A a; みたいな文が出てきて、
A が実際に必要な段階になったら、A と hoge<A> がコンパイルされる。
hoge の定義も、A の定義もすでに 1, 2 で読んであるから、
コンパイルする際も問題ない。
0156デフォルトの名無しさん
2006/06/09(金) 20:28:20単純に評価の流れをおっただけの番号ね。
0157デフォルトの名無しさん
2006/06/09(金) 20:29:15それを表す言葉はCRTP (Curiously Recurring Template Pattern)。
0158デフォルトの名無しさん
2006/06/09(金) 22:27:10不再雛式と覚えればオケー
0159デフォルトの名無しさん
2006/06/09(金) 22:42:380160デフォルトの名無しさん
2006/06/09(金) 23:06:140161デフォルトの名無しさん
2006/06/09(金) 23:18:060162デフォルトの名無しさん
2006/06/10(土) 01:12:580163・∀・)っ-○◎● ◆toBASh....
2006/06/10(土) 02:23:180164デフォルトの名無しさん
2006/06/10(土) 03:21:19なぜかコンパイルエラー・・・
どうしてエラーになるのかわからない・・・
誰か助けてください・・・・
#include<iostream>
using namespace std;
struct myClass{
myClass(){}
int operator()(){
return 9;
}
};
int main(){
myClass m();
int i;
i=m();
cout<<i<<endl;
}
これで実行すれば9が出力されるプログラムのつもりなんだけど、
なぜかコンパイルできない。
i=m();
の行で、error: cannot convert `myClass' to `int' in assignment
っていうエラーがでる。
m()でmyClassのoperator()が呼ばれてintの値を返してるつもりなのに。
なんで?
0165デフォルトの名無しさん
2006/06/10(土) 03:33:10-myClass m();
+myClass m;
0166デフォルトの名無しさん
2006/06/10(土) 03:41:17なるほど�dクス!
てことは、こういう場合は無引数のコンストラクタを呼ぶときは()をつけちゃいけないってことなのかな?
0167デフォルトの名無しさん
2006/06/10(土) 03:46:36Exactly!
0168デフォルトの名無しさん
2006/06/10(土) 06:40:13次のようなコードを書きました
void foo(){
try{
(処理1)
}catch(bad_alloc){
(処理2)
}catch(...){
(処理3)
}
}
処理1がなぜか失敗します。
その時何の例外が出ているのかよく分からず、
とりあえずbad_allocかなと思って例外を捕まえようとしたのですが、
どうもbad_allocでは無いようです
何の例外が出ているのか調べるにはどうすればよいのでしょうか
ご教示願います
0169デフォルトの名無しさん
2006/06/10(土) 07:11:23もし、その例外がSTLの例外だとするならば、
すべてのSTLの例外はstd::exceptionを継承しているから、
次のようにキャッチすればよい。
catch(std::excepption & e)
ここから環境依存の話になるけど、
VC++を使っているなら、SEHをキャッチしてしまったというのもありえる話。
VC8からは、最適化の関係で、
デフォルトではキャッチされなくなったけど。
0170デフォルトの名無しさん
2006/06/10(土) 10:12:490171デフォルトの名無しさん
2006/06/10(土) 10:24:14164,166は悪戯をしたいだけの厨なのミエミエなんだから
0174デフォルトの名無しさん
2006/06/10(土) 17:20:140176前スレ860
2006/06/10(土) 20:24:55fopen()かもしれないし、_wcsicmp()かもしれない。
何のヘッダが来ても何とかできる方法はないでしょうか・・・???
0177デフォルトの名無しさん
2006/06/10(土) 21:15:10なんでそんなアホなことがしたいんだ?
0178デフォルトの名無しさん
2006/06/12(月) 01:20:05だとどこかで読みました。
しかし、どこが便利なのかわかりません。
例えばプログラムの最初の方で、
int i;
とするのと
static int i;
とするのは何が違ってくるのでしょうか?
0179デフォルトの名無しさん
2006/06/12(月) 01:38:32static の意味は使う場所でいろいろ変わるから、それだけじゃ比較できない。
0180デフォルトの名無しさん
2006/06/12(月) 02:13:31使わなければいけない理由がある場合以外には。
0181デフォルトの名無しさん
2006/06/12(月) 02:26:43autoで済むのなら済ましないさいなというところ。
0182デフォルトの名無しさん
2006/06/12(月) 03:15:26templateメソッドを実装ファイル内に記述
したいのですが、何か方法はありますか?
0183デフォルトの名無しさん
2006/06/12(月) 03:16:41exportをサポートしたC++コンパイラを使用する。
0184デフォルトの名無しさん
2006/06/12(月) 06:11:35>templateメソッドを実装ファイル内に記述
>したい
まずこの前提条件が間違ってるから無理。
コンパイル時に依存できるからTemplateを使う。
おそらくTemplateを使う場所を間違ってる。
0185178
2006/06/12(月) 08:41:13>>179
もしよかったら使うメリットを具体例を挙げて
教えてもらいたいです
>>180
その使わなければならない理由を知りたいです
>>181
そういう効果があったんですね
0186デフォルトの名無しさん
2006/06/12(月) 08:49:55今知らないのなら、使わなければならない理由なんて知らない方がいいよ。
そもそもここは初心者に手取り足取り教えるスレじゃないんで、どうしても知りたければ
適切なスレに逝っとくれ。
0187デフォルトの名無しさん
2006/06/12(月) 09:48:350188デフォルトの名無しさん
2006/06/12(月) 09:59:23・「何かと便利」と聞いたが何が便利か分からない。
その上、
・これってどういう意味ですか?
それに対して、文脈によって違うからと答えられると、
・使うメリットを具体例を挙げて教えてもらいたいです。
まともな人間とは思えない。
0189デフォルトの名無しさん
2006/06/12(月) 10:11:520190デフォルトの名無しさん
2006/06/12(月) 11:27:05template <class data_t> class list {
protected:
data_t value;
list *next;
public:
virtual data_t retrieve() = 0; };
template <class data_t> data_t stack<data_t>::retrieve() {
data_t temp;
list<data_t> *del;
temp = next->value; ▲
del = next; ●
next = del->next; ▲ }
▲の部分で、protected のメンバにアクセスできないという、コンパイルエラーになります。
同じ protected メンバの next にはアクセスできて、next->value にはアクセスできません。
何故でしょうか?
0191178
2006/06/12(月) 11:35:52関数中で変数をstatic宣言するなら意味がわかるんだけど
そのとき読んだやつでは
static int i;
int main(void) {
...
}
みたいにmainの前のグローバルスコープでstatic宣言されてて、
そこに宣言するなら別にstaticつけなくていいじゃんと思ってのでした
で、このことの意味は別のソースからextern宣言されるのを防ぐため
ということですね。どうもありがとうございました
0192デフォルトの名無しさん
2006/06/12(月) 11:49:26ISO/IEC 11.5 Protected member access
: the access must be through a pointer to, reference to, or object of the derived class itself
0193デフォルトの名無しさん
2006/06/12(月) 16:01:58標準の行列ライブラリだと0行0列から始まってしまい、
なおかつn行n列という定義ができないので不便で
(というか計算不能で)しょうがありません。
これを解決するインクルードファイル等をご存知でしたら
教えてください。よろしくお願いします。
0194デフォルトの名無しさん
2006/06/12(月) 16:05:37boostでも使えば?
0195デフォルトの名無しさん
2006/06/12(月) 17:14:49インスタンスが別だから。
protectedは継承先から継承元へのアクセス指定。
0196デフォルトの名無しさん
2006/06/12(月) 17:55:03なんて改行コードの違いを上みたいに書く人が意識するんじゃなくて
システムに判断させたいんだけど何かいい方法ないかなあ?
#ifdefとかよりもっと簡単な方法で。
0197デフォルトの名無しさん
2006/06/12(月) 18:06:37もう一つかぶせると、
自分(のクラス)の一部としてのみアクセスできる。
無理すればアクセスすることも出来るけど、お薦めはしない。
0198デフォルトの名無しさん
2006/06/12(月) 18:18:54stdioのtext modeなら "\n"で統一されてるけどな
0199デフォルトの名無しさん
2006/06/12(月) 20:20:15何だかんだ言って状況によるからな。
UNIXやMacは、text fileでは独自のやり方だけど、
networkなtext streamでは(例えばHTTP)共通の規則だから。
Windowsはそういう意味では常に\r\nでいいんだけど、
今度はfileを読み書きする時には、textかbinaryか明示し忘れるとまずいし。
# ISO C/C++的には明示しないのが悪いわけだが。
というわけであんまりいい方法、しかも一般的な方法はありませんよ。
0200デフォルトの名無しさん
2006/06/12(月) 21:13:48自前でやった方がいい気にはなるな
あれだけのためにどれだけパフォーマンス落ちてるんだと
0201デフォルトの名無しさん
2006/06/12(月) 21:21:190202デフォルトの名無しさん
2006/06/12(月) 21:46:140203デフォルトの名無しさん
2006/06/12(月) 21:57:39明示的実体化とか
0204デフォルトの名無しさん
2006/06/13(火) 00:09:430205デフォルトの名無しさん
2006/06/13(火) 00:10:480206デフォルトの名無しさん
2006/06/13(火) 00:38:50MS-DOSから継承したから。
テキストファイル末尾のEOF文字は流石に継承しなかったが。
0207デフォルトの名無しさん
2006/06/13(火) 00:46:170208デフォルトの名無しさん
2006/06/13(火) 00:51:270209デフォルトの名無しさん
2006/06/13(火) 00:54:56>テキストファイル末尾は128バイト単位のレコードを埋め尽くすまでEOFコード(0x1a)
これはなかなか面白いですね
CP/Mの改行コードは何に由来するんでしょうか?
0210デフォルトの名無しさん
2006/06/13(火) 00:56:50OSXでもそれは変わらないのでしょうか?
あとCRにしたのはなんでなんでしょね?
0211デフォルトの名無しさん
2006/06/13(火) 00:57:240212デフォルトの名無しさん
2006/06/13(火) 01:00:23なんでかは知らんが
おかげでファイル読み込みのときに
LF, CRLF, CRの3種類のシーケンスのどれがきても
ひとつの改行と認識するコードを書かねばならなくなったりしてたよな
まあ今でもHTTPで引っ張って来るときはそんな感じだが
0213デフォルトの名無しさん
2006/06/13(火) 01:03:54普段は CR で、ターミナルで UNIX コマンド使ってると LF 。
0214デフォルトの名無しさん
2006/06/13(火) 04:02:01もともとASCIIでは、CRLFが行末。復帰(0カラム)+改行(次の行)。
^D(0x04)がEOT(End of Transfer)。(UNIXは端末からデータ終了に^Dはそのため)
UNIXの行末が、LFだけなのは、その方がプログラミングが簡単だから、
AT&Tベル研の人たちがそうした。
Macの行末(^M)は謎。CP/M, MS-DOSのテキストファイル末端(^Z)も謎。
0215デフォルトの名無しさん
2006/06/13(火) 04:06:31プログラミングの煩雑さを嫌ってLFだけにしたのか。
なんだか希望が沸いてきた。
0216デフォルトの名無しさん
2006/06/13(火) 05:36:29印字位置が行末までいったり行送りで、
自動的で印字位置が先頭に戻り、1行改行したような記憶が...
詳しい人教えて。
0217デフォルトの名無しさん
2006/06/13(火) 06:14:18クラスタ途中にあるファイルの終端を記録するためのもの。
0218デフォルトの名無しさん
2006/06/13(火) 08:45:52ASCIIではSUB(substitute character)なのに、
何故かCP/Mは^D/EOTを使わずに^Zにした…
0219デフォルトの名無しさん
2006/06/13(火) 10:44:29(CP/Mのファイルシステムはクラスタ数しか管理していない)
MS-DOS初期はそれを引き継いだものの
FATファイルシステムでファイルサイズがバイト単位で管理できるようになったため
^Zは不要になったけどな
CP/Mとの互換性のために残ってたけど
0220デフォルトの名無しさん
2006/06/13(火) 12:29:09ユーザー関数の戻り値が帰ってくるまでの時間がランダムの
場合、その戻ってくる時間分だけ待機させるのってどうしたらいいでしょう?
CheckISSError :ユーザー関数
for( i = 0 ; i < 15 ; i++){
iRet = CheckISSError( i );
if(iRet < 0){
エラーの場合の処理
}
::Sleep(700);
}
while文でぐるぐる回すのもおかしいですし。
現状では ::Sleep(700); をいれることでもたつきますが
正常に動作してます。
0221デフォルトの名無しさん
2006/06/13(火) 12:32:05ユーザ関数が別スレッドで動作してるなら、
WaitForSingleObjectを使うといいんじゃね。
というかスレ違い。
0222デフォルトの名無しさん
2006/06/13(火) 12:35:46スレ違い申し訳ありませんでした。
またスレ違いにもかかわらずご教授ありがとうございます。
早速試してみます。
ありがとうございました。
0223デフォルトの名無しさん
2006/06/13(火) 12:42:54template <class T> class myvector {
vector<T*> value;
public:
myvector() {}
void add( const T& in ){ value.push_back( &in ); }
T& get( const int& n ){ return *(value.at(n)); }
};
int main(){
myvector<string> vec();
string s("hoge");
vec.add( s );
}
これを実行するとmain()の最後のaddのところで
request for member `add' in `vec', which is of
non-aggregate type `myvector<std::string> ()()'
のエラーが出ます。
どなたか教えてくれませんか。
0224デフォルトの名無しさん
2006/06/13(火) 12:47:50これが関数宣言とみなされているんだろう。
0225デフォルトの名無しさん
2006/06/13(火) 12:50:55myvector<string> vec();
って関数宣言になってる気がするんだが
0226222
2006/06/13(火) 12:59:13どうもです。まだ慣れないもので。
その後 add() の引数を const T& から T& に変えたら
正常に動きました。ありがとうございます。
0227デフォルトの名無しさん
2006/06/13(火) 13:06:54本当に関数宣言のままで動いたのか?
ともあれ add(const T& a)の中の vector<T*>.push_back(&a)は
constポインタは非constポインタには暗黙変換できないので
当然エラーになる。
0228222
2006/06/13(火) 13:31:29いえ言い方が悪かったです。
myvector<string> vec;
に直しました。
0229デフォルトの名無しさん
2006/06/13(火) 15:10:07ユーザー関数の戻り値が帰ってくるまでの時間がランダムの
場合、その戻ってくる時間分だけ待機させるのってどうしたらいいでしょう?
CheckISSError :ユーザー関数
for( i = 0 ; i < 15 ; i++){
iRet = CheckISSError( i );
if(iRet < 0){
エラーの場合の処理
}
::Sleep(700);
}
現状では ::Sleep(700); をいれることでもたつきますが正常に動作してます。
WaitForSingleObjectを使用すればいいのでは?とご教授頂いたのですが
どのように利用すればいいのかもわからない状態です。
何方かご存知の方 ご教授願えませんでしょうか?
0230デフォルトの名無しさん
2006/06/13(火) 15:10:38申し訳ない
0231デフォルトの名無しさん
2006/06/14(水) 00:37:58そのlibraryのclassは全てObjectというclassから派生したもので、
どのclassにもClone()が用意されています。
これらのclassをmemberに含むような自前のMyClass : public Objectを作る場合、
MyClassにもやはりClone()を用意してやって、
MyClassの(Objejctを継承している)memberは全てポインタにしてやって、
MyClass::Clone()の内部はそれぞれのclassのClone()を使用して複製して行くのが一般的でしょうか。
それとも、単にMyClass::Clone()の中ではそれぞれのclassのcopy constructorを使って、
複製を行うのがいいものなのでしょうか。
場合によって変わる、というものなのかも知れませんが、
指針があれば教えて下さい。
0232デフォルトの名無しさん
2006/06/14(水) 00:47:26同じなら、MyClass::Clone()をコピーコンストラクタで実装すればよいし、
違うなら、メンバのClone()を律儀に呼び出す必要がある。
でも、そもそも、MyClass::Clone()を実装する必要が本当にあるの?
0233231
2006/06/14(水) 01:45:40Clone()の実装は、内部でsaveとloadをしているようでした。
Object::Clone()のみが実装されていて、
派生classは全てObject::Clone()を利用しているようです。
なので、MyClass::Clone()を自分で書く必要はないみたいです。
# そこらへんが複雑でちゃんと読めてないんですが。
# 派生classの.hと.cxxとは別に、saveとloadを実装させるためのtoolがある。
ここです。
ttp://root.cern.ch/root/html/TObject.html
派生classのoperator=とかは、全て内部でCopy()を呼び出している。
# Clone()がsaveとloadから複製する関数で、Copy()はmemberを逐一複製している。
# このClone()とCopy()が両方ある理由も分かっていないんですが。
>でも、そもそも、MyClass::Clone()を実装する必要が本当にあるの?
これってのは、castまわりでClone()が必要な状況になれば実装すれば良いという事でしょうか?
使われる可能性がないうちは、特に実装しなくてよいということ?
classのmemberをポインタにするかどうかの判断は、
実行時にnewしたいかどうかだけで決めるものですか?
0234デフォルトの名無しさん
2006/06/14(水) 02:01:16ですがうまくいきません
------ ビルド開始: プロジェクト: C, 構成: Debug Win32 ------
コンパイルしています...
Cプラス.cpp
.\Cプラス.cpp(4) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
ビルドログは "file://d:\My document\Visual Studio 2005\Projects\C\C\Debug\BuildLog.htm" に保存されました。
C - エラー 1、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新、0 スキップ ==========
となってエラーになります
0235デフォルトの名無しさん
2006/06/14(水) 02:04:160236デフォルトの名無しさん
2006/06/14(水) 02:35:390237デフォルトの名無しさん
2006/06/14(水) 02:55:130238232
2006/06/14(水) 03:13:20ちょっとドキュメントやらソースやら読んでみた。
まず押さえてほしいのは、このフレームワークはファイルシステム上にオブジェクトを保持するということ。
だから、オブジェクトをファイルに読み書きするメソッドはすべてのクラスで必須。
具体的な読み書きは、それぞれのクラスで定義されたメソッドStreamer()でやってる。
ここまでOK?
Copy(TObject &)は引数として与えられたオブジェクトにthisをコピーする。
それぞれのクラスできちんと定義してやる必要あり。
使う側は引数としてthisと同じクラスのオブジェクトを、
利用者の責任で用意して渡す必要がある。
(続く)
0239232
2006/06/14(水) 03:14:44Clone()はthisのコピーを作って返す。フツーのC++プログラムなら、
こいつもそれぞれのクラスできちんと定義する必要があるのだが、このフレームワークでは、
Streamer()を利用して、thisにファイルに書き出しておいて、それを読み出すことでコピーを作る、
というトリックを使っている(このトリック自体は、永続化フレームワークではよく使われる)ので、
Clone()の定義自体はTObjectのやつを使い回すことが可能になっている。
つまり、それぞれのクラスでClone()を定義する必要はない
(TNamedみたいに、TObjectの振る舞いを変えたい、という事情がない限りは)。
さっきの「MyClass::Clone()を実装する必要が本当にあるの?」は忘れてクレイ。
上に書いた理由から、Streamer()はそれぞれのクラスで定義することが必要だし、
Clone()は定義する必要はない。
> classのmemberをポインタにするかどうかの判断は、
> 実行時にnewしたいかどうかだけで決めるものですか?
これも関係ない。混乱させたならスマソ。
このフレーワークの他のクラスでやってるみたいに、ポインタじゃなくてOK。
以上、思ったよりも長文になった。関係ない人には申し訳ない。
0240232
2006/06/14(水) 03:41:03○Streamer()を利用して、thisをファイルに書き出しておいて、それを読み出すことでコピーを作る、
一番肝心なところで・・・orz
0241231
2006/06/14(水) 05:40:07詳細にどうもです。
ソースは理解していないけど、何をしているかが分かりました。
参考にして書き書きします。
0242232
2006/06/14(水) 08:06:59いろいろ気になる部分もあるが、何とか頑張ってホスイ。
0243デフォルトの名無しさん
2006/06/14(水) 12:23:04class Foo
{
//ストリーム演算子をfriend宣言
template < int X >
friend std::ostream & operator << ( std::ostream & out, Foo<X> const & val ) ;
private :
//実際の出力は、このメンバ関数が行う。
void print( std::ostream & out ) const { out << "private!" ; };
} ;
template < int X >
std::ostream & operator << ( std::ostream & out, Foo<X> const & val )
{
val.print(out) ;
return out ;
}
int main( )
{
Foo<1> f ;
std::cout << f << std::endl ;
}
上記のコードを、VC8でコンパイルすると、
>C2593: 'operator <<' があいまいです。
と言われてしまいます。
どうも、friend宣言も関数の定義と解釈しているようなのですが。
Barton and Nackman trickを使えば、なんとか意図通りのことができるのですが、
これは仕方がないのでしょうか?
0244デフォルトの名無しさん
2006/06/14(水) 12:40:49template < int X >
class Foo;
template < int X >
std::ostream & operator << ( std::ostream & out, Foo<X> const & val ) ;
template < int X >
class Foo
{
//ストリーム演算子をfriend宣言
friend std::ostream & operator << <> ( std::ostream & out, Foo const & val ) ;
0246デフォルトの名無しさん
2006/06/14(水) 13:13:02friend に指定している名前がすでに宣言された template であるとコンパイラに
認識させるための表記。また関数テンプレートの引数を、関数引数から
推測させる場合の省略表記。この場合は2番目の引数 Foo<X> から推測される
<X> の省略。
この friend が関数テンプレート operator << の X による特殊化を指すようになる。
やりたいことはこれで OK ?
関数テンプレートの宣言を事前に行わないと、文法エラーになってしまうので、
ウザイけど前方宣言が必要。
0247244
2006/06/14(水) 13:28:45なるほど。
そういう意味での<>だったのですか。
friendでも使えるとは知りませんでした。
operatorで使っていたので、なんだかまったく別の文法のように考えてしまいました。
0248244
2006/06/14(水) 13:45:41>>244のコードは、
Nontype Template Parameterのときだけコンパイルエラーになるのですが、
何故でしょうか。
0249デフォルトの名無しさん
2006/06/14(水) 14:15:22詳しく調べてないけど、 VC がバグってんじゃね?
ちなみに cygwin gcc 3.4 だと最初のコードでも
テンプレート仮引数名の重複さえ直してやればコンパイルはできた。
全部の特殊化に対する friend 指定になっちゃうと思うけど。
0250デフォルトの名無しさん
2006/06/14(水) 14:22:21>>244 じゃなくて >>243 だよね?
0251243 == 248
2006/06/14(水) 14:31:500252デフォルトの名無しさん
2006/06/14(水) 15:56:020253デフォルトの名無しさん
2006/06/14(水) 17:13:13friendとtemplateは、
規格票の14.5.3.1-10の例を眺めておいた方がいいと思う。
規格票の例はすごくいけてる。悩んだときは一読お奨め。
といってもJISのは高いが。
http://www.webstore.jsa.or.jp/webstore/Com/FlowControl.jsp?lang=jp&bunsyoId=JIS+X+3014%3A2003&dantaiCd=JIS&status=1&pageNo=1
0254デフォルトの名無しさん
2006/06/14(水) 17:22:55眺めるだけなら無料のPDFも悪くないと思うよ。
http://www.jisc.go.jp/
JIS検索→規格番号 X3014
0255デフォルトの名無しさん
2006/06/14(水) 18:06:18memberのcopyにはoperator=が使われるんですか?
それとも、copy constructorが使われるんですか?
0256デフォルトの名無しさん
2006/06/14(水) 18:26:58コピーコンストラクタに決まっているだろ。
0257デフォルトの名無しさん
2006/06/14(水) 18:47:01operator=を定義しておけば自動生成のコピーコンストラクタで使ってくれるのか、という問いなら、
「そんな気の利いたことはやってくれない」が答えだな
0259デフォルトの名無しさん
2006/06/15(木) 04:50:05class base {
virtual base* this_p(void) = 0;
};
class derived : public base {
derived* this_p(void) { cout << "derived called" << endl; return this; }
};
class derived2 : public derived {
int value;
derived2* this_p(void) { cout << "derived2 called" << endl; return this; }
};
で、
base* p = new derived2;
p->this_p(); // これは"derived2 called"を出力
p->this_p()->value; // これはエラー
となる理由を教えてください・・・。
0260デフォルトの名無しさん
2006/06/15(木) 05:02:50derived::this_p()にvirtualを付けないと、それ以上探してくれない。
0261259
2006/06/15(木) 05:21:37ゴメンなさい。259のコードはvirtualが抜けてました。
derived* this_p(void)にvirtual付けても結果は同じであります('A`)
0262デフォルトの名無しさん
2006/06/15(木) 05:37:460263デフォルトの名無しさん
2006/06/15(木) 05:39:23pの型は、class base *なわけで、これにはとvalueはない。
たとえばこんなコードだったら
void f( base & p )
{
std::cout << p->this_p()->value ;
}
int main()
{
derived d ;
//dにはvalueがない
f( d ) ;
}
C++
0264デフォルトの名無しさん
2006/06/15(木) 05:58:24p.this_p()->value
メンバ変数のアクセスへRTTIは働かないから、
こういう使い方は間違いなのではないかと思う。
0265243
2006/06/15(木) 06:33:38前方宣言も必要ないし。
多少面倒でも、>>244のようにすべきなのでしょうか。
template < int X >
class Foo
{
//Barton and Nackman Trick
friend std::ostream & operator << ( std::ostream & out, Foo<X> const & val )
{
val.print(out) ;
return out ;
}
//こっちは厳密に言うとBarton and Nackman Trickじゃないかもしれないけど、よりジェネリックに。
/*********
* template < typename CharType >
* friend std::basic_ostream<CharType> & operator << ( std::basic_ostream<CharType>, Foo<X> const & val) ;
* { val.print(out) ; return out ;}
*************************/
private :
//実際の出力は、このメンバ関数が行う。
void print( std::ostream & out ) const { out << "private!" ; };
} ;
0266デフォルトの名無しさん
2006/06/15(木) 10:37:32俺もこのやり方の方が好きだな。
0267デフォルトの名無しさん
2006/06/15(木) 11:04:38そっちだと ADL でしか見つからないことになる。それで問題なければそっちでいい。
ダメなケースを探してみたけど、あんまり思い当たらない。おおかた問題無いと思うよ。
0269243
2006/06/15(木) 12:21:12ADLでしか解決できないのは知っていますが、
演算子のオーバーロード、特にストリーム入出力のためのシフト演算子に対して、
ADL経由でない使い方というのが思い浮かばなかったので、
特に問題ないだろうと思っています。
しかし、なぜNontype Template Parameterのときだけ曖昧になるのか理解できず。
0270デフォルトの名無しさん
2006/06/15(木) 12:36:57その辺誤解のないように。
そう言う意味では、>>264のレスはおかしい。
0271デフォルトの名無しさん
2006/06/15(木) 12:44:18g++では問題なくコンパイルが出来るから、VCのバグかね
0272デフォルトの名無しさん
2006/06/15(木) 13:12:23つ friend std::ostream & ::operator << ( std::ostream & out, Foo const & val ) ;
「<>」と「::」のことか?
0273272
2006/06/15(木) 13:47:05結論はnontype template parameterの時はADLがうまく働かないだけ
0274243
2006/06/15(木) 13:53:45だからといって、どうしようもないのですが。
結局、workaroundということで対処するしかないのかな。
0275デフォルトの名無しさん
2006/06/15(木) 14:56:170276デフォルトの名無しさん
2006/06/15(木) 16:36:37private:
OtherClass* mP;
public:
SetP(OtherClass* p) { mP = p;]
};
みたいにメンバーにポインタを渡したい場合、
OtherClass* p = new OtherClass;
SetP(p);
delete p;
のように外でdeleteされてしまうと困るときってあると思うんですが、
pが外でdeleteされない、もしくはdeleteされても対処出来るようにするには、
どういう風にすればいいんでしょうか。
0277デフォルトの名無しさん
2006/06/15(木) 17:17:430278デフォルトの名無しさん
2006/06/15(木) 17:18:29OtherClassのコピーではだめ?
同じOtherClassの「あるオブジェクト」を参照したいのだったら、
スマートポインタ的なことをしたほうがいいかと
0279デフォルトの名無しさん
2006/06/15(木) 17:19:19MyClassの中でも外でも一貫してboost::shared_ptrを使え。
場合によってはstd::auto_ptrで十分かもしれないが。
0280276
2006/06/15(木) 18:04:11ありがとうございます。
自分の場合でどれがいいかを検討してみます。
>>276
実はOtherClassは固有の名前をcharで持っていて、
単純にコピーすると名前もコピーされて重複するのが嫌なので、
ポインタで渡す事を考えていました。
コピー後に名前を変更するのを手動でするのも面倒だし、
だからと言って関数内に記述して自動で名前が変えられてしまうのも気持ち悪いしと思って。
そういう場合は、やはりポインタで渡してやって、
固有の名前を必ず持つようにしておくもんでしょうか?
0281276
2006/06/15(木) 18:05:09○実はOtherClassのインスタンスは固有の名前をcharで持っていて
0282デフォルトの名無しさん
2006/06/16(金) 00:02:36> 実はOtherClassは固有の名前をcharで持っていて、
ここ以下さっぱり意味がわからん。
0283デフォルトの名無しさん
2006/06/16(金) 00:06:12名前をコピーしないコピーコンストラクタなりを書けばいいんじゃね?
0284デフォルトの名無しさん
2006/06/16(金) 00:10:23SDKが使えないようなことをどっかで見たようなきがするんですけど
最新のやつでも問題ないですか?MSのページ見たけどよくわからん
0285デフォルトの名無しさん
2006/06/16(金) 00:13:10すれ違い。 DirectX でスレタイ検索しろ。
0286284
2006/06/16(金) 02:05:030287デフォルトの名無しさん
2006/06/17(土) 19:34:03しかし、標準ライブラリがまだまったく勉強できていません。(Cの標準ライブラリは一応ひととおり勉強しました)
C++標準ライブラリについて勉強できる良質なサイトや標準ライブラリのリファレンス的なサイトを紹介して下さい。
MSDNライブラリCDを持っていますが、これは一応Visual Studio.NET用文書中に標準ライブラリの部分もあるのですが、かなりおざなりです。(C標準ライブラリの方も・・・)
ARMには何も載ってないし・・・
0288デフォルトの名無しさん
2006/06/17(土) 19:35:47本買ったほうがいいよ。マジで。
0289デフォルトの名無しさん
2006/06/17(土) 21:06:51Microsoftのはドラフトを基にしているらしいが大体問題なく使える。
http://www.wakhok.ac.jp/~sumi/stl/
http://www.microsoft.com/japan/developer/library/vclang/stdlbhm.htm
あとは、関数名が見たいだけとか引数を確かめたいとかそういうときはMSDNライブラリも使う。
0290デフォルトの名無しさん
2006/06/17(土) 21:29:36他にも何箇所か転がってるが。ロケール周りとかの貴重な日本語ドキュメントが読める。
いや、公開してちゃマズいだろって気はするが。
0291デフォルトの名無しさん
2006/06/17(土) 22:03:51stlのexceptionだけ無難に使っておけばOKみたいな感じなんでしょうか
と、わざとアホっぽく書きましたが、いや実装よりの話となると、どれも(どこも)曖昧で…
0292デフォルトの名無しさん
2006/06/17(土) 22:08:54作るものによるが、レイヤーがはっきりしている様な場合(例えばフレームワークとビジネスロジックとか)は、
ちゃんと例外クラスを作って、誰がどのレイヤーの例外をキャッチするかなどを決めておかなと、
困ったことになるかもねー。
0293デフォルトの名無しさん
2006/06/17(土) 22:10:27そんな感じかな。
0294291
2006/06/17(土) 22:29:20レスありがとうございます
今までentityの例外は、boundaryやcontrollerが処理する(entityはエラーとか気にしない)みたいな意識でした。
つまりentityの例外はentityで処理しろ、みたいな認識で良いのでしょうか。
それなら狭い範囲で収まるわけで、独自の例外クラスが多くても混乱無さそうですね。
0295デフォルトの名無しさん
2006/06/17(土) 22:45:17基本は、受け取っても処理できない場所まで例外を上げるな、です。致命的な例外で、アプリケーションを
終了するしかないようなクリティカルなものは別ですが。
私も例外に関しては今でも試行錯誤で、それほどえらそなことは言えないのです。
お互いに頑張りましょうね。
0296291
2006/06/17(土) 22:58:24良いかなぁとか思ってました。危ない危ない。
お付き合い感謝、丁寧にありがとうございました。
0297デフォルトの名無しさん
2006/06/17(土) 23:03:01ClassName c(1);
と
ClassName c=ClassName(1);
って全く同じ意味なんだっけ?
0298デフォルトの名無しさん
2006/06/17(土) 23:04:01FooExceptionとDerivedFooExceptionがあったときに、それをキャッチする層で同じ処理するなら
FooException&でうけて、別々に処理するならそれぞれキャッチするとか。
ただ、これが「良い」やりかたなのかどうかは俺は知らない(無責任)
0299デフォルトの名無しさん
2006/06/17(土) 23:10:41前者はコピーコンストラクタ要らない。
0300デフォルトの名無しさん
2006/06/17(土) 23:13:57ユーザーには通信でエラーが発生したことを伝える必要があることを考えると、
通信クラスの例外がアプリケーション層まであがってこないと困る、とも言えないか?
0301デフォルトの名無しさん
2006/06/17(土) 23:19:34なんて言ったらいいかなー、「生」の例外はあげちゃだめってこと。そうしないと、上位レイヤーが
下位レイヤーの詳細を知ってなんらかのアクションを起こさないといけないから。
0302デフォルトの名無しさん
2006/06/17(土) 23:37:49それどういう意味?
どっちの場合もコピーコンストラクタは呼ばれないみたいだけど?
#include<iostream>
using namespace std;
struct myClass {
int p;
myClass(int i){p=i;}
myClass(const myClass & m){
cout<<"COPY CONSTRUCTOR IS CALLED"<<endl;
p=m.p;
}
};
int main(){
myClass mc1(1);
myClass mc2=myClass(2);
cout<<mc1.p<<endl;
cout<<mc2.p<<endl;
}
というプログラムで、出力は
1
2
で、COPY CONSTRUCTOR IS CALLEDっていう文字列は出力されなかったけど。
0303デフォルトの名無しさん
2006/06/17(土) 23:40:03それをするには、下位レイヤー自身がすべての実装を知っていることが必要だが、
インターフェースを規定して実装を置き換えることができるようなモジュールでは
そうはいかないよね?
0304デフォルトの名無しさん
2006/06/17(土) 23:42:21後者では意味上はコピーコンストラクタが呼ばれるが、
コンパイラがコピーを省略することを許されている。
コピーコンストラクタが private になってたりすると差が出る。
0305デフォルトの名無しさん
2006/06/17(土) 23:51:01なるほど!ありま�d!
0306デフォルトの名無しさん
2006/06/17(土) 23:55:40すみません、質問の意味が良く分かりません。
下位レイヤー自身は、自分が直接使用するものの詳細は当然知っていますが、誰から呼ばれるかは
知りません。
0307デフォルトの名無しさん
2006/06/18(日) 00:03:40あーごめんよ。コールバック関数とか、そういうのの話ね。
ostream に対して汎用的なモジュールを作ったとして、
そこにファイルが渡されるかネットワークストリームが渡されるか
さらには未知のデバイスが渡されるかわからないとき
再送出をどうするかってこと。
0308デフォルトの名無しさん
2006/06/18(日) 00:10:22んー、コールバックは関係ありません。
その例でいえば、ストリームを処理するクラスがあるときに、それを呼び出すレイヤーに、ファイル系や
ネットワーク系の例外を直接なげちゃ(あるいはキャッチせずにそのままじゃ)駄目ですってことです。
何のために「ストリーム」という抽象化をしたのかわからなくなります。
どうもうまく話がかみ合わない気が・・・。
0309デフォルトの名無しさん
2006/06/18(日) 00:17:22あるinterfaceには(あるいはそれと同じレイヤー全部のinterfaceには)、それ専用の例外クラスを定義し、
そのinterfaceを実装するコードが使用するところから上がってきたexceptionは、必ずcatchし、
その専用の例外クラスをthrowするようにする、ということです。
0310デフォルトの名無しさん
2006/06/18(日) 00:43:48やっぱりそうなるかね。面倒だからそのまま外まで飛んでいくようにしたほうが
コーディングも文書化もとっても楽なんだけどね。
発生したエラーの詳細が失われないように工夫も要りそうだ。
面倒だけど、ここらへんが妥協点だと言われれば納得もできそう。
今度なんか作るときはそんな感じに設計してみるよ。つきあってくれてありがとう。
0311デフォルトの名無しさん
2006/06/18(日) 02:26:14私も日々勉強です。システム全体の例外・エラー処理って本当に悩ましいですよね。ではー。
0312デフォルトの名無しさん
2006/06/18(日) 04:19:290313デフォルトの名無しさん
2006/06/18(日) 04:39:52それは >>301 や >>309 に対する反論かな?
根拠も無しに言い切られても困る。是非詳しく聞いてみたいね。
0314デフォルトの名無しさん
2006/06/18(日) 12:09:51読解力のない奴
0315デフォルトの名無しさん
2006/06/18(日) 13:12:06stream->open("ftp://ftp.hoge.com/");
ってやってFTPの例外が上がってくるようになったら困る品
0316デフォルトの名無しさん
2006/06/18(日) 13:25:09ftpstream f("ftp://ftp.hoge.com/");
としてftpの例外をアプリ側で積極的に使いたいこともある。
0317デフォルトの名無しさん
2006/06/18(日) 13:32:26どっちが優れてるとか、どっちが劣っているとかないから、好きなようにしる。
0318デフォルトの名無しさん
2006/06/18(日) 13:54:11文字列xの中に文字aが含まれる個数(含まれない場合は0)を返す関数
int abc(const char x[], int a)
を作るという問題なんですがわかる方よろしくお願いします。
文字列にaが何個入っているかを表示するプログラムです。
0319デフォルトの名無しさん
2006/06/18(日) 14:04:27丸投げ氏ね。
宿題は宿題スレへ。
0320デフォルトの名無しさん
2006/06/18(日) 14:05:570321デフォルトの名無しさん
2006/06/18(日) 14:08:21int abc(const char str[], int a) { return static_cast<int>(std::count(str, str+strlen(str), a)); }
0322デフォルトの名無しさん
2006/06/18(日) 14:11:50return std::count(&x[0], &x[std::strlen(x)], char(a));
}
0323デフォルトの名無しさん
2006/06/18(日) 14:12:250324デフォルトの名無しさん
2006/06/18(日) 14:17:320325デフォルトの名無しさん
2006/06/18(日) 17:36:250326デフォルトの名無しさん
2006/06/18(日) 20:47:550327デフォルトの名無しさん
2006/06/18(日) 22:07:150328デフォルトの名無しさん
2006/06/18(日) 22:17:510329デフォルトの名無しさん
2006/06/18(日) 22:40:290330243
2006/06/19(月) 12:06:48VC8はこれでコンパイルが通る。不思議……。
template < int Parameter >
class Foo
{
public :
//これでは通らない。
//template < int AnotherParameter >
//friend std::ostream & operator << ( std::ostream & out, Foo<AnotherParameter> const & val ) ;
//template < int AnotherParameter > //もしくは単純に
template < int >
friend std::ostream & operator << ( std::ostream & out, Foo<Parameter> const & val ) ;
private :
//これは言うまでもなくprivateなメンバ関数
void print( std::ostream & out) const
{ out << "Private!" ; }
} ;
template < int AnotherParameter >
std::ostream & operator << ( std::ostream & out, Foo<AnotherParameter> const & val)
{
val.print(out) ;//友達なのでおkらしい
return out ;
}
int main( )
{
Foo<1> f ;
std::cout << f << std::endl ;
}
0331デフォルトの名無しさん
2006/06/19(月) 17:55:13class A
{
const char *buf;
public:
A():buf("buffer"){};
};
この"buffer"はクラス変数になるのでしょうか?
コンストラクタ終了後、死んだスタック上にある。とかそのようなこと無いですか?
0332デフォルトの名無しさん
2006/06/19(月) 18:02:150333デフォルトの名無しさん
2006/06/20(火) 12:28:24> * STL containers implementation now correctly handle allocators with state. This kind
> of allocator has to overload swap method if any specific action has to be made when
> swaping 2 instances.
ウホっ
0334デフォルトの名無しさん
2006/06/20(火) 12:29:560335デフォルトの名無しさん
2006/06/20(火) 21:25:20strstream Str;
などと宣言したStrに
Str << "ABC";
などと文字列を格納したあと、このABCをクリアしてバッファを初期状態(pcount()が0を返す)ようにしたいのですが、どのような手順を踏めばよいのでしょうか?
ご存じの方いらっしゃったらご教示ください。
0336デフォルトの名無しさん
2006/06/20(火) 22:06:22Str.str("");
0337デフォルトの名無しさん
2006/06/20(火) 22:21:08使っているライブラリ関数がstrstreamを引数に要求するので仕方なくつかっているのです(^^;
0338デフォルトの名無しさん
2006/06/20(火) 22:27:230339デフォルトの名無しさん
2006/06/20(火) 22:50:05それはともかく、streastreamをnewするようにして、
初期状態に戻したくなったら、新しいのをnewし、
それから古いのをdeleteするようにしたらどうだろう。
それとももしかしてboost.optionalはコピー不可の型にも使えた?
0340デフォルトの名無しさん
2006/06/20(火) 23:04:24どういう設計してるんだか。
0341デフォルトの名無しさん
2006/06/20(火) 23:15:43こちらのアイデアでいこうと思います。
ありがとうございます。
0342デフォルトの名無しさん
2006/06/21(水) 00:16:54#undef LABEL
#define LABEL (1)
をマクロ関数とか使ってLABELを一回しか書かないで実現することできる?
0343デフォルトの名無しさん
2006/06/21(水) 00:35:41#undef が要らなくて #define で上書きできる実装もあった気がする。
0344デフォルトの名無しさん
2006/06/21(水) 02:30:43public:
A(){}
A(int n) {}
};
class B {}
int main(void) {
B b(3);
}
このコードをコンパイルすると
const int から class Bに変換することはできません
とエラーになりますが
C++ではコンストラクタは継承されないの?
0345デフォルトの名無しさん
2006/06/21(水) 02:42:31仮にAのコンストラクタが使われてしまったら、
B固有の初期化が出来なくなっちまう罠
0346デフォルトの名無しさん
2006/06/21(水) 02:42:270347デフォルトの名無しさん
2006/06/21(水) 02:44:140348デフォルトの名無しさん
2006/06/21(水) 02:49:23継承されない。C++には多重継承があるから、
どの基底クラスのコンストラクタを呼べばいいか決められない。
0349デフォルトの名無しさん
2006/06/21(水) 02:53:08多重継承は関係ない希ガス
0350デフォルトの名無しさん
2006/06/21(水) 02:55:51B() : A() { } // デフォルトコンストラクタ
B(const B& b) : A(b) { } // デフォルトコピーコンストラクタ
が自動的に作られる。
それ以上は自分で書かないといけない。
そういうエラーが出るのは、
B(int) がないのでコピーコンストラクタを呼ぼうとしてるから。
0351デフォルトの名無しさん
2006/06/21(水) 03:53:30コピーコンストラクタを呼ぼうとしてるわけじゃないよ。
0352デフォルトの名無しさん
2006/06/21(水) 04:18:110353デフォルトの名無しさん
2006/06/21(水) 05:50:000354デフォルトの名無しさん
2006/06/21(水) 08:45:150355デフォルトの名無しさん
2006/06/21(水) 09:06:46「直後に定義されたクラスは直前のクラスを暗黙的に継承する」とか
0356デフォルトの名無しさん
2006/06/21(水) 09:21:19ということは、
>const int から class Bに変換することはできません
は B(int) がないよというエラーなのか?
変な書き方するもんだな。
0357デフォルトの名無しさん
2006/06/21(水) 11:32:03暗黙の型変換を考えれば自然なエラーメッセージだと思うが
0358デフォルトの名無しさん
2006/06/21(水) 12:40:58constスレで調べようと思ったけど、ぐぐってもスレタイ検索しても見つからないorz
0359デフォルトの名無しさん
2006/06/21(水) 12:51:03書き方の違い
意味は同じ
0360343
2006/06/21(水) 16:24:25あざっした!
0361デフォルトの名無しさん
2006/06/23(金) 13:01:48int * (b[10]);
a=b;
とすると
error: cannot convert `int*[10]' to `int (*)[10]' in assignment
というコンパイルエラーになるんだけど、
int ((* a) [10]);
と
int * (b[10]);
ってそれぞれどういう意味なんでしょう?
0362デフォルトの名無しさん
2006/06/23(金) 13:19:00a は int の配列(要素数 10 )へのポインタ。
b は int へのポインタの配列(要素数 10 )。
0363デフォルトの名無しさん
2006/06/23(金) 13:27:30int*[10] は(intへのポインタ)の配列
int(*)[10]は(intの配列)へのポインタ
int *a[10];
int (*b)[10];
int x =123; // int
int y[10] = {456}; // intの配列
a[0]=&x; // intへのポインタを格納
b=&y; // intの配列へのポインタを格納
printf("%d,%d", (*a[0]),(*b)[0]);
結果
123,456
0364363
2006/06/23(金) 13:28:290365363
2006/06/23(金) 13:30:280366デフォルトの名無しさん
2006/06/23(金) 14:45:22なるほろありがとん!
0371デフォルトの名無しさん
2006/06/24(土) 17:57:22どう見ても兎レスです。
本当にありがとうございました
0372デフォルトの名無しさん
2006/06/25(日) 02:57:56list *l;
for (l = q->head; l; l = l->cdr) callback(l->car);
}
とあるところでこんなコードみかけたんですが
callbackって何でしょうか?
上記はコード全体の一部なんですが、コード全体を見渡しても
callback型に関する定義はどこにも見当たらないのです
そのコードは
string.h
stdio.h
stdlib.h
をインクルードしてましたがその中にも当然そんな定義ないし・・・
0373デフォルトの名無しさん
2006/06/25(日) 03:01:53型はint (*)(void *)じゃん。
「intを返し、引数がvoidポインタの関数」
という型でしょ
0374デフォルトの名無しさん
2006/06/25(日) 03:03:02ttp://www.google.co.jp/search?hl=ja&q=%E3%82%B3%E3%83%BC%E3%83%AB%E3%83%90%E3%83%83%E3%82%AF%E9%96%A2%E6%95%B0&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=lang_ja
0375デフォルトの名無しさん
2006/06/25(日) 03:08:28型は>>373さんの通り。
0376デフォルトの名無しさん
2006/06/25(日) 03:11:35そのソースのcallbackは、その関数を書いた奴がつけた引数の名前。
引数の型は>373、じゃちょっとおかしいな
「intを返し、引数がvoid*の関数、へのポインタ」
0377デフォルトの名無しさん
2006/06/25(日) 03:11:53「……」へのポインタである引き数callback
0378デフォルトの名無しさん
2006/06/25(日) 03:13:49普通の関数形式で呼べるんだな...
0379デフォルトの名無しさん
2006/06/25(日) 04:54:14たとえば以下のようなクラスをつくったとします。
class abc{
private:
int a;
public:
void xyz(abc k){
int i = a;
int j = k.a;
}
}
この場合、関数xyz内でのaへのアクセスは問題なく、k.a は引数のprivate変数なので
アクセスできないものと思っていたのですが、コンパイルも問題なく通りました。
メンバ関数が自身のクラスを引数にした場合、
そのprivate変数にはアクセスできるものなんですか?
0380デフォルトの名無しさん
2006/06/25(日) 05:00:11できるものなんです
0381デフォルトの名無しさん
2006/06/25(日) 10:18:03class A
class B
を定義したとして、
classAの中で、メンバ変数として、
�@ B b
�A B* b
�@と�Aのどちらかで定義したとします。
これらの違いがはっきり判りません。
�Aの定義方法の場合、
class A のメソッドの中で、
b = new B();
と定義する事で、右辺で確保されたメモリ空間のアドレスが、
bに代入され、その後、bはアドレス参照により、
class B のメンバ変数やら、メソッドなどを使用できる(アロー演算子を使って)、
と思うのですが、
�@の定義方法の場合、
b.メンバ変数 = メンバ変数の値 b.メンバ関数 などで、new しなくても使えると
思います。
そうすると、�@の定義方法の方が簡単でよいと思うのですが、一般的には、
あるクラスが、あるクラスをメンバ変数としてもつ場合、�Aの方法が正解
だと思います。この違いは一体なんなのでしょうか?
0382デフォルトの名無しさん
2006/06/25(日) 11:01:03正解だと思った根拠を聞こうか。
0383デフォルトの名無しさん
2006/06/25(日) 11:10:10�Aの方が正解というのは、他の方のソースを拝見すると、
クラスの中で他のクラスを持つような場合、
ポインタ変数として宣言し、コンストラクタで、new
デストラクタで、deleteしているので、こちらが
一般的なのかな?と思っています。
もし、�Aのようにポインタ変数ではなく、�@のような
宣言方法ですと、どのようなタイミングで、メモリ確保
が行われるかも判りません。ポインタ変数ですと、
new されたときに確保できるのは判るのですけれども。
説明が分かりにくくて申し訳ありません。
0384デフォルトの名無しさん
2006/06/25(日) 11:13:31while (n!=i)
のような文の!とはどんないみなのでしょうか?
0385デフォルトの名無しさん
2006/06/25(日) 11:25:34そこで"!"だけ抜き出すな。"!="で1つの演算子だ。
0386デフォルトの名無しさん
2006/06/25(日) 11:59:29二つのクラスが一蓮托生なら1でもいいんじゃないの。
AとBの寿命が違うならポインタにしとくべきだとは思う。
間違ってたら突っ込みヨロリ。
0387デフォルトの名無しさん
2006/06/25(日) 12:07:30でかいプロジェクトが多いもんだから、ヘッダ重ねてコンパイル時間が長引くのがいやで、常に(2)を採用しているな
これはこれで定型文書くのが面倒なんだが
0388デフォルトの名無しさん
2006/06/25(日) 12:15:30!は否定の意味。Notね。
!=だと、not equal
0389デフォルトの名無しさん
2006/06/25(日) 12:17:36俺はメンバクラスにするのならば�@だけど。deleteし忘れると困るし、
極力使わないですむような実装にしてる。
0390デフォルトの名無しさん
2006/06/25(日) 12:18:27回答の方ありがとうございます。
確かに、>>381 で�@の宣言方法ですと、deleteしなくても、class A のインスタンスが、
スコープから外れると、class A のデストラクタ→ class B のデストラクタ
という風になり、同じタイミングでメモリから解放されるということですね。
もし、class Aが保持する、class B のインスタンスを自分の好きなタイミング
で開放したい時などは、�Aの宣言の方がよいということですね。
あと一つ疑問なのですが、皆さんは、あるクラスで、別クラスの
インスタンスを持ちたい時は、どのような判断で、�@、�Aの宣言を
使い分けているのでしょうか?また、�@、�Aの各宣言の、長所、短所
など教えて頂けたらありがたいです。
0391デフォルトの名無しさん
2006/06/25(日) 12:21:45ちなみにコンパイル時間変わる?
Bがインターフェースでない限り同じな気がする・・が、良い方法があるのだろうか。
0392デフォルトの名無しさん
2006/06/25(日) 12:23:26うちの場合はコンパイル時間よりもバイナリコンパチビリティが保てることの方が重要だな。
今のバイナリに変更部分だけコンパイルして開発作業ができれば
全体のビルドは時間がかかっても平行でやっておけばいいのだ。
0393デフォルトの名無しさん
2006/06/25(日) 12:26:02具体的には、class_a.hはclass_b.hをincludeしなくてはならず、class Aには
全く変更が無くてもclass Bが変更されるとコンパイルの必要が出てくる。
�Aの形式にしておけば、そのような依存関係を断ち切ることが出来る。
具体的には次のようにやる。
class B;
class A {
...
B *b;
};
なぜ依存しないほうがいいかというのは、そのうちわかってくると思う。
0394デフォルトの名無しさん
2006/06/25(日) 12:28:11質問を書き込んでる間に、回答してもらいありがとうございました。
なるほど、やはり、deleteのタイミングさえ気を付ければ、�@、�A
であまり変わらないということですね。
大変勉強になります。
>>387 さんに回答して頂いた内容で、
「でかいプロジェクトが多いもんだから、
ヘッダ重ねてコンパイル時間が長引くのがいやで、
常に(2)を採用しているな
これはこれで定型文書くのが面倒なんだが
」
とありますが、私もプロジェクトがかなり大きいので、
お聞きしたいのですが、上記の意味は、
クラスをメンバ変数で宣言する際に、ポインタ変数で宣言
するとコンパイル時において、何か利点などあるのでしょうか?
0395393
2006/06/25(日) 12:31:57STLのクラスを使う場合などは�@の形式を使う場合が多い。
0396デフォルトの名無しさん
2006/06/25(日) 12:37:00ヘッダのコメント修正されただけで、全コンかかってむかつくことないの?w
0397デフォルトの名無しさん
2006/06/25(日) 12:41:58またまた、質問を書いている時に回答して頂いて、
ありがとうございました。
以下のようにポインタ変数で宣言すると、
class B;
public class A{
B* b;
}
bはもともとクラスBのアドレスを入れる変数なので、
クラスBの処理の内容までは知る必要がなく、Bの型さえ知って
おけばメモリ空間へどれだけメモリを確保すれば良いのかが
判る。というような感じですね。
しかし、もし以下のような宣言方法だと、
class B;
public class A{
B b;
}
B自体のクラスの中身をしらないと、メモリ空間を確保できない
ので、class A はclass B に依存してしまうということですね。
何か頭がすっきりしました。
本当に皆さんありがとうございました。
0398デフォルトの名無しさん
2006/06/25(日) 12:43:19class Aのヘッダでclass BのヘッダB.hをインクルードせずに>393のようにする。
実際にBにアクセスするA.cppでB.hをインクルードすれば、AはBにアクセスできる。
Aを使うCモジュールでは、B.hがインクルードされないので、
class Bの変更でCは再コンパイルされない。←これが>393の言うソース依存関係を断ち切ると言うこと。
その必要もない。←これが>392の言うバイナリコンパチビリティ
0399デフォルトの名無しさん
2006/06/25(日) 12:46:23実装段階じゃあまり効果はないが、宣言を良く弄る段階ならもう劇的に変わる。
要するに波及を一切シャットアウトできるわけだ。
最初からある程度完璧な設計を捻出できたり、
あるいはヘッダの依存をきっちり区切れる自信があるなら、必要ないかもな。
って、もう皆が詳しく書いてくれてるな。
0400デフォルトの名無しさん
2006/06/25(日) 12:52:40そりゃもう天と地の違いがありますな。
0401デフォルトの名無しさん
2006/06/25(日) 13:05:07回答ありがとうございました。
皆さんは、どのようにしてそのような知識を得るのでしょうか?
私はまだC++を仕事で使うようになり、1年ですが、まだ、本などを
読んだりして勉強しながら仕事を進めているのですが、
今回、皆さんに回答して頂いたような事は本には載っていません。
もしかして、実際に、VC++などで、デバックを行い、メモリウィンドウ
などで、値を確認しながら、勉強されているのでしょうか?
本当に質問が多くて申し訳ありません。
0402382
2006/06/25(日) 13:16:37取り敢えずEffectiveC++くらいは読んだと思っていいのかな?
だとしたら後は実践あるのみだろ。
ちなみに漏れは、>381だけでは一概に言えないので適材適所で使い分けているとしか言えない。
0404デフォルトの名無しさん
2006/06/25(日) 14:01:560405デフォルトの名無しさん
2006/06/25(日) 14:18:50言語によって呼称が違うだけで、意味するところは同じ。
つまんないことにこだわらない方がいいよ。
0406デフォルトの名無しさん
2006/06/25(日) 14:24:37普通のメンバ関数はメンバ関数だ。
つまんないことってw
C++作った人がそう言ってるのに、
それを知らずに我を通すのも何だかな、と思う。
まぁ日本人的にどうなのかは知らんがw
0407デフォルトの名無しさん
2006/06/25(日) 14:24:37public methodとか普通に言うけどなぁ。
パブリックなメンバ関数っていちいち言ったりしてる?
0408デフォルトの名無しさん
2006/06/25(日) 14:25:530409デフォルトの名無しさん
2006/06/25(日) 14:26:58仮想関数は、virtual functionだけど。
まぁ日本人的にはメソッドなのかも知らんがw
0410デフォルトの名無しさん
2006/06/25(日) 14:31:31いや、載ってる。よく見かける話。
君がまだそのような本を読んだことが無いってだけの話だから、
そのうち読むことになるだろう。
0411デフォルトの名無しさん
2006/06/25(日) 14:36:14仮想関数はvirtual member functionでしょ。
methodはあくまで別名。
ちなみにソースは↓ねttp://www.research.att.com/~bs/glossary.html
まぁ基本的に>>408に同意だけど。
0412禿
2006/06/25(日) 14:44:07ディライブドとベースにした。
0413デフォルトの名無しさん
2006/06/25(日) 14:50:170414デフォルトの名無しさん
2006/06/25(日) 14:54:29英語を話す人としゃべったことないみたいだね
0415デフォルトの名無しさん
2006/06/25(日) 15:06:01厳密に言うと、C++の文脈で言うメソッドとメンバ関数・仮想関数では
レイヤーが違うということであって、仮想関数のことをメソッドと呼ぶ
のではない。
0416デフォルトの名無しさん
2006/06/25(日) 15:31:19それはあなたの常識?
それとも日本の常識?
それとも世界的な?
正直どこの馬の骨とも知れない匿名の個人の意見より、
どこかのサイトに書いてあることの方が信用できます。
なのでソースを貼って頂けると。もちろん書籍でも可です。
0417デフォルトの名無しさん
2006/06/25(日) 15:34:150418415
2006/06/25(日) 15:43:10常識かどうかは知らない。
C++ではメソッドをメンバ関数という手段で実現するのだが、仮想関数を使う場合には、
あるオブジェクト(インスタンス)のメソッドがメンバ関数で実現されているかどうかは
わからない。その意味で、>>411のURLには、
A virtual member function is sometimes called a method.
と書かれている。
何が真実か知りたければ、調べてください。
0419デフォルトの名無しさん
2006/06/25(日) 16:02:03メソッドがオブジェクト指向用語だとすると仮想関数じゃなきゃメソッドって言わないのかも
>仮想関数を使う場合には、 あるオブジェクト(インスタンス)のメソッドが
>メンバ関数で実現されているかどうかはわからない。
この説明はよく分からんけど。
メンバ関数以外で実装されたメソッドってどんなんだ?
0420415
2006/06/25(日) 16:15:15>メソッドが概念で、C++ではその概念がメンバ関数で実装されてるって意味じゃないか?
そうです。それを私は「レイヤーが違う」と表現しました。
>メソッドがオブジェクト指向用語だとすると仮想関数じゃなきゃメソッドって言わないのかも
どのような論理でそうなるのですか?
>この説明はよく分からんけど。
メンバ関数とは、あるクラスで定義された関数のことです。>>411のURLには
>member function - a function declared in the scope of a class. A member function
>that is not a static member function must be called for an object of its class.
と説明されています。
また、あるオブジェクトから見たときのメソッドが、そのオブジェクトのクラスで定義された
メンバ関数ではない場合があるという意味です。
0421415
2006/06/25(日) 16:21:08Netには、member functionとmethodについて、C++の黎明期に議論された痕跡などが
ころがっているはずなので、真実が知りたいのならお調べになってください。
0422デフォルトの名無しさん
2006/06/25(日) 16:26:26News 2006-06-24: The C++ Standard Library Issues List (Revision 43) is available (.tar.gz)
News 2006-06-24: C++ Standard Core Language Issues List (Revision 42) is available, also committee version
0423デフォルトの名無しさん
2006/06/25(日) 16:27:39friend T;
が有効になる予定になってた。
0424デフォルトの名無しさん
2006/06/25(日) 16:27:59通称メソッド、正しくはメンバ関数。
それ以上でも以下でもない。
0425デフォルトの名無しさん
2006/06/25(日) 16:31:150426デフォルトの名無しさん
2006/06/25(日) 16:36:23class A { public: virtual void hoge() {...}; };
class B :public A { public: virtual void hoge() {...}; };
Aにとってのhogeは「メソッド」で、Bにとってのhogeは「メンバ関数」ってことか?
クラスCがBを継承してhogeをオーバーライドしたら、Bにとってもhogeは「メソッド」に変わるわけかw
バカじゃねーの?w
0427デフォルトの名無しさん
2006/06/25(日) 16:42:01馬鹿はお前。
仮想メンバ関数の別名がメソッドだなんて、どこから沸いた話だ
0428デフォルトの名無しさん
2006/06/25(日) 16:43:52かまってちゃんはほんと困る。
0429デフォルトの名無しさん
2006/06/25(日) 16:45:23ま た お 前 か
0430デフォルトの名無しさん
2006/06/25(日) 16:45:330431デフォルトの名無しさん
2006/06/25(日) 16:48:21ま た お 前 か
0432デフォルトの名無しさん
2006/06/25(日) 16:52:49骨髄反射?
0433デフォルトの名無しさん
2006/06/25(日) 16:53:07┏┫┃┃┃ スレ違い雑談は┃┃┃┣┓
┃┃┃┃┣┓ ここまで.┏┫┃┃┃┃
┃ ┃┃┏━━━┓┃┃ ┃
┃スレ違い ┣┫ ・∀・ ┣┫ END ┃
┗━━━━┛┗┳━┳┛┗━━━━┛
┏┻┓┃
┏━┛ ┣┻┓
┗━━━┫ ┗━┓
┗━━━┛
0434デフォルトの名無しさん
2006/06/25(日) 16:55:58Bjarne Stroustrupはvirtual member functionのことをmethodだと言ってますが。
0435デフォルトの名無しさん
2006/06/25(日) 16:56:470436デフォルトの名無しさん
2006/06/25(日) 17:04:49海外のメーリングリストでもこんな議論ってやってるの?w
0437デフォルトの名無しさん
2006/06/25(日) 17:05:210438デフォルトの名無しさん
2006/06/25(日) 17:06:08あっちは匿名がほとんどないから、ここまで恥ずかしい展開にはならない。
0439デフォルトの名無しさん
2006/06/25(日) 17:07:110440デフォルトの名無しさん
2006/06/25(日) 17:11:57というかメールではやらないだろ。
0441デフォルトの名無しさん
2006/06/25(日) 17:33:51ttp://www.tietew.jp/cppll/archive/7159
互いの認識を確認してお終い。
0442デフォルトの名無しさん
2006/06/25(日) 17:41:20はぁ?C++作った奴が仮想関数をメソッドと呼ぶっていてるんだろうが
0443デフォルトの名無しさん
2006/06/25(日) 17:42:43>呼ぶっていてるんだろうが
餅搗け。さもなくば帰れ。
0444デフォルトの名無しさん
2006/06/25(日) 17:49:52いられない馬鹿が多いってことですな。
0445デフォルトの名無しさん
2006/06/25(日) 17:56:13それが規格に何か関係あるのか?
0446デフォルトの名無しさん
2006/06/25(日) 18:10:17さっきも宿題スレで「低レベル関数を使えという指示がありました」という
コメントに「関数にレベルなんかあるかw」とつっこみを入れた奴がいたけど、
みごとに数人が釣られてた。
俺は最近はやってるこの手の釣りは、だれか一人がやってるんじゃないかと睨んでる。
そういうわけで、困ったチャンは相手にしないほうがいいんじゃないかといいたいわけだ。
0447デフォルトの名無しさん
2006/06/25(日) 18:13:31規格が何の関係があるんだよw
0448デフォルトの名無しさん
2006/06/25(日) 18:14:570449デフォルトの名無しさん
2006/06/25(日) 18:16:14>>425 が、わざわざ「規格では」って断ってるだろ。
あと、 stroustrup が何故 "sometimes" と挟んでいるのか考えろ。
君は都合の悪いところを読み飛ばす癖があるみたいだな。
0451デフォルトの名無しさん
2006/06/25(日) 18:36:540452デフォルトの名無しさん
2006/06/25(日) 18:41:290453デフォルトの名無しさん
2006/06/25(日) 19:45:100454デフォルトの名無しさん
2006/06/25(日) 19:54:49規格になじめない人さようなら〜。
0455デフォルトの名無しさん
2006/06/25(日) 20:00:220456デフォルトの名無しさん
2006/06/25(日) 20:05:19VC捨てたら、ICCがうごかんやんけ!
0457デフォルトの名無しさん
2006/06/25(日) 20:08:50いつも規格では、規格ではでんでん言ってるのに
実際のコーディングはうんこ
0458デフォルトの名無しさん
2006/06/25(日) 20:13:23それは規格を持ち出すのがうざいんじゃなくて
うんこなコーディングがうざいだけ。うんこ厨とでも呼べ。
0459デフォルトの名無しさん
2006/06/25(日) 20:23:13従来の多くのオブジェクト指向言語、例えばsmalltalk, Objective-Cでは、
virtual member functionと同等のものがmethodと呼ばれていた、
くらいのことだと思います。
以前からclass method/object methodと言われた時期があったから、
禿の書き方はちょっとどうかと思うんですが、まあいいじゃないですか。
0460デフォルトの名無しさん
2006/06/25(日) 20:51:07>>444
0461デフォルトの名無しさん
2006/06/25(日) 20:59:01規格を知らない奴とは仕事をしたくないな
0462デフォルトの名無しさん
2006/06/25(日) 21:04:01多分ウザがられると思うけど
0463デフォルトの名無しさん
2006/06/25(日) 21:06:12>>461 みたいなことを言う奴は、理想論ばかり言って
現実からかけ離れたコードを書きそうだから、
一緒に仕事をしたくないな。
0464デフォルトの名無しさん
2006/06/25(日) 21:06:44で、サクッと無視して自分は「メンバ関数」と言ったのを思い出しました。一
瞬微妙な空気が流れた。どっちでもいいよ……。
0465デフォルトの名無しさん
2006/06/25(日) 21:17:44http://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89
0466デフォルトの名無しさん
2006/06/25(日) 21:18:42俺は相手が「ワーニング」と言えばそう言うし、「ピング」と言えばそう言うよ。
0467デフォルトの名無しさん
2006/06/25(日) 21:21:17メンバ関数のことは別にどうでもいいが、そのWikiページの説明はアレだな。
「右手:左手の反対の手のこと」
「左手:右手の反対の手のこと」
みたい?
0468デフォルトの名無しさん
2006/06/25(日) 21:33:32メソッドでも間違いではない。
0469デフォルトの名無しさん
2006/06/25(日) 21:39:23C++の言語的な話をしてる時はメンバ関数だろ。
0470デフォルトの名無しさん
2006/06/25(日) 21:47:13メソッドでも間違いではない。
0471デフォルトの名無しさん
2006/06/25(日) 21:48:41結局両者の本質的な違いってなに?
それがないなら不毛な議論だと思うけど。
0472デフォルトの名無しさん
2006/06/25(日) 21:53:05>結局両者の本質的な違いってなに?
「俺は」視点の違いだと思ってる。
メンバ関数→C++用語
メソッド→OO用語
0473デフォルトの名無しさん
2006/06/25(日) 21:53:24あるけど、ここまでのスレの中に答えはもう出てる。
0474デフォルトの名無しさん
2006/06/25(日) 22:04:510475デフォルトの名無しさん
2006/06/25(日) 22:06:08C++の用語には「メソッド」は無い。
以上。
0476デフォルトの名無しさん
2006/06/25(日) 23:29:59・オブジェクト指向においてオブジェクトの振る舞いを定義するのがメソッド
・C++ ではオブジェクトの振る舞いをメンバ関数として記述する
ってところなのかな?
0477デフォルトの名無しさん
2006/06/25(日) 23:33:12いつまで話をループさせれば気が済むんだ。
0478デフォルトの名無しさん
2006/06/26(月) 01:06:00お前は馬鹿か?
virtual member function == method
つってんだろ
0479デフォルトの名無しさん
2006/06/26(月) 01:54:36ちょっとちがう。
メンバ → C用語
仮想 → Simula用語
メソッド → Smalltalk用語
ちなみに、C++は仮想関数の概念をSimulaから拝借している。
で、C++の仮想メンバ関数は、Smalltalkのメソッドに相当するってそれだけの話なような…。
ちなみにJavaはSmalltalkの用語(メソッドとか、スーパー/サブクラスとか)を拝借している。
OOはあまり関係ない(ストラウストラップのオブジェクト指向なのにメソッドなJavaの例もあるし…)。
強いて言えば、メソッドはケイのオブジェクト指向、仮想関数はストラウストラップのオブジェクト指向。
ttp://d.hatena.ne.jp/sumim/20040525/p1
0480デフォルトの名無しさん
2006/06/26(月) 02:18:04みたいな感じでループ変数の加算時の記述を
「++i」
としているソースばかりですが、
これは
「i++」
でも同じですよね?どうして皆そろいもそろって
++i
と統一しているのでしょうか?
単なる慣習?
それとも明確な理由があるの?
0481デフォルトの名無しさん
2006/06/26(月) 02:20:02お前こそ、ちょっと違わないか?
「メンバ関数→C++用語」は結局のところ、お前の定義でも正しんだろ?
メソッドだって、由来がどうあれ、C++のことで議論してる時にメソッドって言ったら
普通はOO用語としてのそれであって、Smalltalk用語のそれじゃないだろ。
0482デフォルトの名無しさん
2006/06/26(月) 02:33:36C言語プログラマは習慣的に i++ って書くけど、
C++プログラマは意識的に ++i って書く。
↓理由はこのへんでも見れ。
ttp://www.tietew.jp/cppll/archive/233
0483デフォルトの名無しさん
2006/06/26(月) 02:40:04馬鹿?
0484デフォルトの名無しさん
2006/06/26(月) 02:40:090485デフォルトの名無しさん
2006/06/26(月) 02:53:09(´・ω・`) 君、大丈夫?
0486デフォルトの名無しさん
2006/06/26(月) 02:58:200487デフォルトの名無しさん
2006/06/26(月) 03:16:180488デフォルトの名無しさん
2006/06/26(月) 03:23:590489デフォルトの名無しさん
2006/06/26(月) 03:29:360490デフォルトの名無しさん
2006/06/26(月) 03:32:31アホ
0491デフォルトの名無しさん
2006/06/26(月) 03:41:27>>480をもう一度ちゃんと嫁
0492デフォルトの名無しさん
2006/06/26(月) 03:49:50演算子の前置・後置による実行順序のこと言ってんの?
0493デフォルトの名無しさん
2006/06/26(月) 04:09:14お前は>>480を読めていない。読んだ気になっているだけだ。
最初の2行を100回嫁
0494デフォルトの名無しさん
2006/06/26(月) 06:54:49皆の言ってる意味を理解していないんだよ。
0495デフォルトの名無しさん
2006/06/26(月) 07:18:41全員が全員、同じ理由ってわけではないだろうけど、たとえば・・・
C++には演算子オーバーロードがあるから、自作のクラス(イテレータとかね)に
独自のインクリメント演算子の動作を実装するという経験をしている人間も多い。
で、++hogeは通常「何らかの意味で"自身をインクリメント"して"自身の参照を返す"」のに対し、
hoge++には「"自身のコピーを作って"から"自身をインクリメント"して、"コピーを値で返す"」
という動作をさせることが多く、これは前置と比べると明らかにコストがかかっている。
そういうコーディングを経験していると、「前置でも後置でも意味的には変わらない」状況下では、
ほとんど手癖として「前置を選んでおく」習慣が身に付く。
別の言い方をするなら、operator++(int)の実装を経験すると、前置と後置を「同じようなモノでしょ」
と抽象的に同一視する気が(完全にとは言わないけど)失せてしまう。
ちなみにこの習慣の結果、「後置は後置でなければならない理由が無い限り登場しない」
という法則がソースコード内に生まれるので、ほんの僅か可読性も上がるかもしれず、
そっちの理由でも習慣はより強固なものになっていく。
・・・なんて背景が考えられるね。いやまぁ要するにこれ、俺のケースなのだけど。
0496デフォルトの名無しさん
2006/06/26(月) 07:51:260497デフォルトの名無しさん
2006/06/26(月) 07:59:410498デフォルトの名無しさん
2006/06/26(月) 08:14:32興味本位で、VC8のコンパイラの吐くコードを見てみたら、
Hoge x ;
++x ;
x++ ;
どちらもインライン展開すると、同じコードになっていた。
まあ、戻り値を使っているわけではないし、
後置インクリメントは、単に自分自身のコピーをとっておいてから、
前置インクリメントを呼び出すという実装だったから、当然かもしれないけど。
でもやはり、前置を使う。
Cで後置が多かった理由は何だろう。
K&Rのコードに、主に後置が使われているからかな。
0499デフォルトの名無しさん
2006/06/26(月) 11:32:40スタックについて考察してみればわかるよ。
0500499
2006/06/26(月) 11:58:09C++で記述するからこそ発生する矛盾というか、要は後置インクリ
メントと前置デクリメントは、C/C++の性質によるものじゃないという
ことだね。
0501デフォルトの名無しさん
2006/06/26(月) 12:59:35その場合はどちらも同じ。
まぁ世の中広いから、違うコードを吐くコンパイラがあるやもしれんが。
一方、クラスで++の演算子オーバロードしたときに、後置演算子だと
効率の悪い場合があるから、そのような場合は特に理由がない場合は
必ず前置演算子を使っておくのが吉。
結局とのところ>>480で++iとするのは「単なる慣習」でしょう。
0502デフォルトの名無しさん
2006/06/26(月) 13:12:58インクリメント演算子でここまでに説明があったことは、オブジェクト指向の問題じゃ
なくて、単にC++の事情だから間違えないように。
ちなみに、純粋なオブジェクト指向言語と呼ばれているRubyには、インクリメント
演算子は存在しない。
0503デフォルトの名無しさん
2006/06/26(月) 13:13:58printf("%d",i);
for(i=0;i<10;++i)
printf("%d",i);
両方やってみればいいじゃん
0504デフォルトの名無しさん
2006/06/26(月) 13:17:55何がやりたいのかわからん
0505デフォルトの名無しさん
2006/06/26(月) 13:18:370506デフォルトの名無しさん
2006/06/26(月) 13:52:130507デフォルトの名無しさん
2006/06/26(月) 14:01:230508デフォルトの名無しさん
2006/06/26(月) 14:10:560509デフォルトの名無しさん
2006/06/26(月) 16:10:47理由もしくはヒントをおせーて
0510506
2006/06/26(月) 16:54:500511506
2006/06/26(月) 17:08:170512デフォルトの名無しさん
2006/06/26(月) 17:20:320513デフォルトの名無しさん
2006/06/26(月) 18:09:320514デフォルトの名無しさん
2006/06/26(月) 18:11:05いや、どっちでもじゃなくて>>495で。
>>513
いやそういうもんじゃない。環境依存。
コンパイラは明示的にキャストしない限り怒る。
0515デフォルトの名無しさん
2006/06/26(月) 18:16:420516デフォルトの名無しさん
2006/06/26(月) 18:43:490517デフォルトの名無しさん
2006/06/26(月) 19:21:14大昔ってか、今でもあるんだけど、CPUの機械語にスタックを実現する為の
前置デクリメントと後置インクリメントがあった、つか、あるんだよ。
で、大昔は、Cの最適化がタコだったから、++iと書くよりi++と書いた方が
より最適化されたし、i--と書くより--iと書く方がより最適化されたってことだよ。
しかし、本当にプリデクリメントとポストインクリメントの歴史を知らなかったのか?
やっぱり、最初にアセンブラをやらせるべきなのかなあ。
0518デフォルトの名無しさん
2006/06/26(月) 19:35:53釣りなのかなぁ。
釣りなんだろうなぁ。
0519デフォルトの名無しさん
2006/06/26(月) 19:41:29ただ、その慣習になったのは理由があって、それはC++の演算子オーバーロードに関係がある。
はい、これでこの話終わり。
0520デフォルトの名無しさん
2006/06/26(月) 19:43:02>>480のループはぶっちゃけ今ではどっち使ったって同じ
でも前置が使われることが多いのは何故か → 慣習的なもの
なぜそういう慣習が生まれるのか → まぁいろいろありまして
このへん一致した意見なんじゃねーのか
0521520
2006/06/26(月) 19:44:29いや一点違うところが
演算子オーバーロードはあくまで、慣習を生み出した原因のうちの一つだと思うよ
0522デフォルトの名無しさん
2006/06/26(月) 19:51:250523デフォルトの名無しさん
2006/06/26(月) 19:55:200524デフォルトの名無しさん
2006/06/26(月) 19:56:59釣りなのかなぁ。
釣りなんだろうなぁ。
0525デフォルトの名無しさん
2006/06/26(月) 20:00:43| | / / / / / | /__ __/ [][] _| |_| |__ _| |_
| |. / / /⌒ヽ/ / / ̄ ̄|. l / / | _ | |_ レ'~ ̄|
| | / / ( ^ω^ ) / /. / / | |___  ̄| | / / / /| |
| | / / ノ/ / ノ /  ̄ ̄ / \__| | |  ̄ /_ / | |_
| |. / / // / ノ / / ̄ ̄ ̄ |_| |__| \/
| |/ / ⊂( し'./ / /
|. / | ノ' / /
| /. し' ./ /
 ̄ ̄ ̄  ̄ ̄
0526デフォルトの名無しさん
2006/06/26(月) 20:01:57>なんで喧嘩してんのかわからん
「・・・でも同じですよね?」に答えようとせず、演算子オーバーロードの話を
持ち出してくる馬鹿が多いから。>>501で初めて「同じ」という解答があった。
初めてまともなコメントしたのが>>495。
それ以前のコメントはクズ。
0527デフォルトの名無しさん
2006/06/26(月) 20:02:430528デフォルトの名無しさん
2006/06/26(月) 20:03:180530デフォルトの名無しさん
2006/06/26(月) 20:14:35わかってんだったら、煽らずに回等してやれよw
0531デフォルトの名無しさん
2006/06/26(月) 20:14:450532デフォルトの名無しさん
2006/06/26(月) 20:21:50に対する回答が>>482じゃん
>>495なんかよりも前に「同じ」回答が出てるのに
それが理解出来ずに>>483,490,491,493を書いたんだろ?
>>495でやっと理解できたものの引っ込みがつかないんで以降も
>>497,503,505,507,512,515と馬鹿みたいな一行コメントを繰り返したんだろ?
0533デフォルトの名無しさん
2006/06/26(月) 20:23:110534デフォルトの名無しさん
2006/06/26(月) 20:26:130535526
2006/06/26(月) 20:26:50お前も馬鹿発言した中の一人なんだろう?
その発言番号の中で夜中以外では>>515が俺だから。
まぁぶっちゃけると>>501も俺な。自作自演って奴だw
0536デフォルトの名無しさん
2006/06/26(月) 20:33:000537デフォルトの名無しさん
2006/06/26(月) 20:41:02くだらんことに時間使うな。
0538デフォルトの名無しさん
2006/06/26(月) 20:42:210539デフォルトの名無しさん
2006/06/26(月) 20:52:07ウザいよ
0540デフォルトの名無しさん
2006/06/26(月) 21:03:200541デフォルトの名無しさん
2006/06/26(月) 21:08:480542デフォルトの名無しさん
2006/06/26(月) 21:10:42めでたし、めでたし
0543デフォルトの名無しさん
2006/06/26(月) 21:24:120544デフォルトの名無しさん
2006/06/26(月) 21:25:492ちゃんやめられないんだよな
0545デフォルトの名無しさん
2006/06/26(月) 21:42:43例外の効果的な使い方が今一ピンとこないため、自分が書くコードでは一切
使わないようにしています。基本的には戻り値でエラーを返して、無理な場合は
アウトパラメータを使うようにしてます。STLが出す例外はトップレベルでcatchしてます。
そんな私なんですが、Exceptional C++という書籍に、例外のことが詳しく載っていると
いう情報をWebで見ました。私は田舎に住んでるので、近所の書店にはありませんでした。
また貧乏なため気軽にネットで買うということも出来ません。
この本は買う価値がありますか?
また、内容について簡単に教えてくれたらうれしいです。
0546デフォルトの名無しさん
2006/06/26(月) 21:47:13都会の本屋にいけ
0547デフォルトの名無しさん
2006/06/26(月) 22:01:58俺はその本持ってないから答えられんけど。
0548デフォルトの名無しさん
2006/06/26(月) 22:07:30amazonで中身検索できる本だから目次と一部みられるところから判断してみたら?
0549デフォルトの名無しさん
2006/06/26(月) 22:08:24基本的にはGuru of weekの内容をまとめ、
そこに出された問題の解答を著者が詳しく解説したもの。
なので、英語を読むのを厭わないなら、GoWの原典
ttp://www.gotw.ca/gotw/
を一通り読めばだいたいの内容は網羅できる。
(MoreExceptionalC++まで含めて)
細かな説明や一般的な解答が欲しければ本を買うしかないが。
0550デフォルトの名無しさん
2006/06/26(月) 22:29:340551デフォルトの名無しさん
2006/06/26(月) 22:55:440552デフォルトの名無しさん
2006/06/26(月) 23:16:45「例外を勉強したいならExceptional C++」という認識は正しい。
が、この本は例外を懇切丁寧に扱ってはいる
(例外の解説に1章/50ページを費やしている)が、
例外を専門に扱っているわけではない。一応勘違いがないようにってことで。
もっとも、C++の例外処理に特化した本てのはないんだけどね。
例外の章の内容は、ざっと書くと
「例外中立とは」「例外保証とそのレベル」「RAII」「やってはいけないこと」
「例外安全なコードの書き方」「テンプレートとの関わり」てな感じかな。
例外を知りたい・知る必要があって、GotW原文はちょっと... と思うなら、
十分買う価値があると思うよ。
少なくとも例外目的で他の本に手を出すぐらいならこの本を先に読むべきだろう。
あと、例外処理だけじゃなくてエラー処理も概観したいというなら、
C++ Coding Standardsもお勧め(これもあまり安い本じゃないけどね)。
エラー処理と例外の解説に1章/20ページを費やしている。
ただ、この本はC++全体を幅広く扱った本なので、手取り足取りな解説は載っていない。
0553デフォルトの名無しさん
2006/06/26(月) 23:29:48その辺のウェブで紹介されてるJavaの例外処理でも調べてみては?
↓こんなのとか。あんまいい例ではないが。
http://javafaq.jp/S018.html#S018-01
0554デフォルトの名無しさん
2006/06/26(月) 23:37:16全然「不測の事態」じゃないじゃんw
俺、そういう使い方嫌い。
0555デフォルトの名無しさん
2006/06/26(月) 23:40:110556デフォルトの名無しさん
2006/06/26(月) 23:47:11永遠の話題なんだと思うよ。
0557デフォルトの名無しさん
2006/06/26(月) 23:53:49明記しないほうが良い(してはいけない?)というのをどこかで見て、それが
どこだったか忘れて探したけど見つからないことがあったんだけど、誰か
知ってる人いますか?
0558デフォルトの名無しさん
2006/06/26(月) 23:59:14Exceptional C++に書いてあったような気がしたが、記憶が定かではないorz
0559デフォルトの名無しさん
2006/06/27(火) 00:01:57例外仕様のことか?
アレは確か例外仕様を定義しても、守れる保証が全然ないし、
守れなかったら double fault で即死するからメリットより
デメリットのほうがでけぇよって話だったと思う。
0560デフォルトの名無しさん
2006/06/27(火) 00:04:06C++ Coding StandardsのChapter 75にAvoid exception specificationsってのがあるが
それのことじゃまいか
0561デフォルトの名無しさん
2006/06/27(火) 00:08:48項目15.の3. page59-60
索引では「例外仕様」だね
0562557
2006/06/27(火) 00:11:25早速明日(ってもう今日か)調べてみる。
0563デフォルトの名無しさん
2006/06/27(火) 00:15:28http://www.boost.org/more/lib_guide.htm#Exception-specification
http://www.gotw.ca/publications/mill22.htm
あとはここらへんとか
0564デフォルトの名無しさん
2006/06/27(火) 01:18:26この辺に出てるURLも参考にすると良いかもしれない。
0565デフォルトの名無しさん
2006/06/27(火) 01:45:05先にEffective C++の第三版読め。
0566デフォルトの名無しさん
2006/06/27(火) 10:17:12確かに不測の事態の説明には向いてないね。ErrorとかExceptionとかRuntimeExceptionとか、
例外クラスに継承関係を作っとくと便利というのを説明したかったんだけど。
>>557
Mingwのg++限定かもしれないが、以前runtime_errorを継承したHogeExceptionというのを作って、
void hoge() throw(HogeException); というメソッドを定義したら、
catch(runtime_error)では受け取れず、catch(HogeException)でしか受け取れなくなった。
継承関係は無視されるみたいでツカエネとか思ったよ。
0567デフォルトの名無しさん
2006/06/27(火) 10:30:52ふつー、catch(runtime_error&)だろ
0568デフォルトの名無しさん
2006/06/27(火) 11:05:32挙げられてるケースでは状況が変わらないと思うよ。
0569513
2006/06/27(火) 11:31:58>いやそういうもんじゃない。環境依存。
環境によってはconstエリアが絶対に破壊されない場合もあるのですか?
いや、何でこんなこと気にするのかって言うと、変数値以外の全ての領域をconstにすれば
どんなバグが含まれていようと落ちないプログラムが作れるのかなと妄想したもんで。
もちろん中の値は壊れたまま動きつづけるようになって使い物にならなくなるんでしょうけど
0570デフォルトの名無しさん
2006/06/27(火) 11:37:35例えば組み込み系でconst用セグメントをROMに配置する場合、破壊されないヨ
0571デフォルトの名無しさん
2006/06/27(火) 11:40:540572513
2006/06/27(火) 12:09:54なるほど、そういう環境もあるんですね〜T。hxです。
>>571
領域を破壊するバグの一つとしてバッファオーバーフローを挙げてみました。
オーバーフローとかでも桁あふれしてもあふれた分無視とか・・・はっ
昔ファミコンでそんな動きを見たことがあるような気がしてきた。
0573デフォルトの名無しさん
2006/06/27(火) 12:46:010574デフォルトの名無しさん
2006/06/27(火) 12:54:07たとえconst領域が変更できなくても
RAMにあるリターンアドレスや関数ポインタは変更され得るので
そこが狂ったときはコードでない場所にジャンプしてあぼん。
バッファオーバーフロー攻撃はこれを巧妙に改ざんして
用意したコードにジャンプさせるわけだしな。
関数ポインタはC++で仮想関数を含むクラスインスタンスを作れば
vtblとして山ほど作られるのでヒープ上でも攻撃しやすいよな。蛇足だけど。
0575デフォルトの名無しさん
2006/06/27(火) 14:16:42>もちろん中の値は壊れたまま動きつづけるようになって使い物にならなくなるんでしょうけど
プログラムの場合、そういうのを「落ちる」っていうんじゃないかな。
0576デフォルトの名無しさん
2006/06/27(火) 14:19:080577デフォルトの名無しさん
2006/06/27(火) 14:19:41で、特定の変数領域以外すべてread onlyなプログラムにおいて、
read onlyな領域に何かを書き込もうとした場合どうするんだ?
普通なら保護例外吐いて死ぬが。
0578513
2006/06/27(火) 17:51:27なるほど・・・要するにconst領域は安全でもconst領域への入り口が破壊される可能性があって、
入り口は必ずconstの外に必要なものって事かな。
無知だからSEのエスパー能力を働かせてみたよ(´・∀・`)間違ってそうだけど
>>577
>read onlyな領域に何かを書き込もうとした場合どうするんだ?
read onlyな領域が物理的に書き込めない環境の話なのでその質問は答えるのは無理。
>>574さんの回答で妄想は妄想のままということでケリがついたっぽいのでこの辺で退場しまふ。
0579デフォルトの名無しさん
2006/06/27(火) 18:45:25zipファイルを解凍するライブラリって何がよろしいですか?
0580デフォルトの名無しさん
2006/06/27(火) 18:48:020581デフォルトの名無しさん
2006/06/27(火) 18:48:38OSは?
0582579
2006/06/27(火) 18:58:15ごめんなさい><
0583デフォルトの名無しさん
2006/06/27(火) 18:59:360584デフォルトの名無しさん
2006/06/27(火) 19:18:49関数ポインタはC++で仮想関数を含むクラスインスタンスを作れば
vtblとして山ほど作られるのでヒープ上でも攻撃しやすいよな。蛇足だけど。
↑のあたり説明してるサイトない?
dlmallocとかでの関数ポインタの書き換え攻撃は知ってるけど、
vtblを利用したのは初耳だ。おせーてくれ
0585デフォルトの名無しさん
2006/06/27(火) 19:19:31こういうコードを書くとアクセス違反で例外が出されるようです
CFoo *pFoo=0; // ヌルポ
pFoo->foooo(); // メンバ関数にアクセス
そこでこのようにtryブロックで囲んでみたのですが、catch(...)でキャッチ出来ません
なぜでしょうか?catch(...)はどんな例外でも捕まえられると思っていたのですが違うのでしょうか
また、アクセス違反の例外はcatch(?) の?の部分に何と書けば捕まえられるのでしょうか?
どうかお願いします
try{
CFoo *pFoo;
CString str = pFoo->m_str;
}catch(...){
printf("catch sita");
}
0586585
2006/06/27(火) 19:20:33try{
CFoo *pFoo;
pFoo->foooo();
}catch(...){
printf("catch sita");
}
0587デフォルトの名無しさん
2006/06/27(火) 19:25:32環境はVC2005かg++だと思うんだがこいつらはWindowsのSEHをC++のEHでcatchできない。
0588デフォルトの名無しさん
2006/06/27(火) 19:29:53ありがとうございます
SEHとEHの違いを良く分かって居ないようなのでもう少し勉強してみます
0589デフォルトの名無しさん
2006/06/27(火) 19:35:06対応してるのってあります?
0590デフォルトの名無しさん
2006/06/27(火) 19:39:230591デフォルトの名無しさん
2006/06/27(火) 19:47:55標準C++以外のライブラリの相談なら、環境依存スレなどへどうぞ。
0592デフォルトの名無しさん
2006/06/27(火) 20:39:09一応書いておくと、Visual C++ 2005でも/EHa使えば、SEHをcatch (...)で捕まえられる。
>>588
基本的にcatchで捕まえられる例外は、誰かがどこかでthrowした例外だけと思え。
0593デフォルトの名無しさん
2006/06/27(火) 21:09:23{
private:
struct B { int i; };
public:
B& hoge() { return b_; }
private:
B b_;
};
A a;
a.hoge().i = 0; // ここ
A::Bはprivateなのですが、VC++2003ではエラーになりませんでした。
これは言語的に正しいのでしょうか?
正しいのだとしたら、どう解釈したらいいのでしょうか?
0594デフォルトの名無しさん
2006/06/27(火) 21:19:330595デフォルトの名無しさん
2006/06/27(火) 21:24:59「飲むな」と答えるほど的外れな回答。
0596デフォルトの名無しさん
2006/06/27(火) 21:28:53指摘すると必ず怒り出すんだよね。
さあ困った。
0597デフォルトの名無しさん
2006/06/27(火) 21:29:52,.-ヲミ´ \
///イ ,.-ヽ
////イ´ イ´⌒ヽ
,.イノ//彡 ,.-⌒`ヽ / /匁、
/三三三 / ィ刄、 ー'´ Y
!三三三彡 ィf‐―'´ ヽ ヽ、 乂
ト三三彡イ ´ ノ 、 r ) ハ ヽ
`トミ三三ネ、 ゝ '´ ', )
(ヽ、三ト、川 ,.ィ ´ ̄ラソ !
Y⌒厂ソ )ノ! ( f―ニニ‐' !
/.///| | 人_ ヽ `ー―' ,'
{ !| | | ト、く へ ) /
/ ///// ハ _,イく`、 _.ノ(
|(//////////ハヽ \`ー―、  ̄ ̄ ,. ハ
))ノ///////ノヽヽヽ \  ̄ ̄ ̄ ̄ヽ \
ハージ・マッターナー [Herge Mattuner]
(1941〜1999 アメリカ)
0598デフォルトの名無しさん
2006/06/27(火) 21:31:26どっちも同罪
0599デフォルトの名無しさん
2006/06/27(火) 21:35:50その識別子によって定義される対象の可用性を制限するわけではないから。
ですよね
0600デフォルトの名無しさん
2006/06/27(火) 21:36:010601デフォルトの名無しさん
2006/06/27(火) 21:37:580602デフォルトの名無しさん
2006/06/27(火) 21:38:53派生クラスでpublicにする時もそうなんかな
0603デフォルトの名無しさん
2006/06/27(火) 22:56:34class B{ public: int i; }; と等価だから、
いいんじゃねーの?言語的に。
変数 i は public だし。
メソッド hoge も public だし。
0604デフォルトの名無しさん
2006/06/27(火) 23:02:140605デフォルトの名無しさん
2006/06/27(火) 23:20:350606デフォルトの名無しさん
2006/06/27(火) 23:24:490607デフォルトの名無しさん
2006/06/28(水) 00:11:09このたび第三版を読み始めたんですが、P67あたりに、
メンバ変数名はアンダーバーで始めるのが普通である
(第二版まではメンバ変数の取り扱いに set get を使っていたが実は効率が悪いことが判明した)、
というような一節がありました。これがいまいちピンと来ません。
メンバ変数名が m_value で値の取得は getValue() の様にするのが常識だと思っていたのですが
この本が言わんとしてるのは
class num
{
private:
int _value;
public:
void value( int NEW_VALUE ); // 値の書き込み
int value(); // 値の取得
};
という感じでメンバ関数をオーバーロードしてクラスを作れということなんでしょうか?
普段こんな感じでコード書いてる方っていらっしゃいます?
0608デフォルトの名無しさん
2006/06/28(水) 00:31:41俺間違ってるな・・・
0609デフォルトの名無しさん
2006/06/28(水) 00:50:15釣りか? 釣りなのか!?
>>608
でんでん・・
0610デフォルトの名無しさん
2006/06/28(水) 00:58:12統一されていれば好きな物(コーディング規約で指定されている場合は指定されているもの)を使えばいいだけの話。
m_XXX / getXXX()が常識ということは一切ないから、変な誤解はしないように
0611デフォルトの名無しさん
2006/06/28(水) 00:58:20もしかして: うんぬん
0612デフォルトの名無しさん
2006/06/28(水) 01:05:33データメンバ名とget-set系メンバ関数名の話に限らず、
命名はスタイルの問題なんで「これが普通」とか「これが常識」といった
普遍的なものはない。自分の手に馴染むものを選べばいいんでは。
というか俺ルールを初心者に刷り込むのはどうかと…
まあ変に悩ませないって点ではいいのかもしれんが。
0613デフォルトの名無しさん
2006/06/28(水) 01:06:42レスありがとうございます。
しょうもない質問してすいませんでした
0614608
2006/06/28(水) 01:11:23class B
{
public:
void v(){puts("めがっさ");}
};
class D :public B
{
public:
int v;
};
D d;
d.v(); //error
こんなの。こういうの避けるために_つけると思ってた
ごめん。>>607とまったく関係ないわ。すまん。マやめる。
0615デフォルトの名無しさん
2006/06/28(水) 01:11:380616デフォルトの名無しさん
2006/06/28(水) 01:23:30無用な混乱を避けるためにも、アンダーバーを避けるか、
末尾につけるようにするのが妥当か
0617デフォルトの名無しさん
2006/06/28(水) 02:16:14別にやめなくてもいいにょろ
0618デフォルトの名無しさん
2006/06/28(水) 02:20:50ぬるぽに -> した時点で未定義動作。何が起こるかわからない。
移植性に価値があるのなら catch(...) で問題が検出できると思わないほうがいい。
0619デフォルトの名無しさん
2006/06/28(水) 02:24:270620デフォルトの名無しさん
2006/06/28(水) 02:45:27グローバル名前空間での識別子として予約されてる。
どっかのスコープの中では宣言しても衝突しないことになる。
だからといって使っていいかというと、混乱の元なのでやめたほうがいい。
0621デフォルトの名無しさん
2006/06/28(水) 02:50:32色々面倒な規則があるしな。
中にはマクロでスコープを無視してくるお行儀の悪い実装もあるし、
使わないに超したことはないっていうだけ。
でも先頭に付けた方が見やすいっちゃ見やすいんだよな。
0622デフォルトの名無しさん
2006/06/28(水) 15:23:1917.4.3.1.2に明記されているし、GoF本でも使っている。
メンバに m_ なんか付けるより、よっぽどクールだお!
…と、周りに説明するのに疲れたので、最近は諦めてる。
0623デフォルトの名無しさん
2006/06/28(水) 16:07:570624デフォルトの名無しさん
2006/06/28(水) 16:13:18コーディング規約でも作って義務化しないと
0625デフォルトの名無しさん
2006/06/28(水) 17:29:40こんなことやってる俺はダメ?w
0626デフォルトの名無しさん
2006/06/28(水) 17:48:080627デフォルトの名無しさん
2006/06/28(水) 17:52:390628デフォルトの名無しさん
2006/06/28(水) 17:57:13そうしてる(してた)のをどこかで見たからで、後ろ派より前派が多かったんでしょう。
あくまでも、その人が見た範囲でだけど。
0629デフォルトの名無しさん
2006/06/28(水) 18:04:240630デフォルトの名無しさん
2006/06/28(水) 18:44:270631デフォルトの名無しさん
2006/06/28(水) 18:54:06どうやってメンバと非メンバを区別してるの?
0632デフォルトの名無しさん
2006/06/28(水) 19:04:19foo
0633デフォルトの名無しさん
2006/06/28(水) 19:08:55今見ると何となくPHPっぽくも見える。
0634デフォルトの名無しさん
2006/06/28(水) 19:53:000635デフォルトの名無しさん
2006/06/28(水) 20:42:46最初が小文字ならローカル
大文字ならメンバっておれのコードは見難いですかそうですか
0636デフォルトの名無しさん
2006/06/28(水) 21:38:420637デフォルトの名無しさん
2006/06/28(水) 21:48:460638デフォルトの名無しさん
2006/06/28(水) 21:49:14http://pc8.2ch.net/test/read.cgi/tech/1149986051/
0639デフォルトの名無しさん
2006/06/28(水) 21:55:55といいつつ自分も晒し
//空白を空けて、typename(classはどうしても必要なテンプレートテンプレートパラメータにしか使わない)
template < typename T >
class Foo //クラス名の先頭は必ず大文字。
{
private : //デフォルトに頼らず宣言しておく。
int x_ ; //メンバ変数には、アンダーバーを末尾につける。
} ;
//関数名の先頭は小文字。
//K&R形式のインデントは、個人的に嫌いなので使わない。
void func( Foo const & val ) //やはり、空白を入れる。
{
int x ; //セミコロンの前にも空白を入れる。
x = 1 + 1 ; //演算子の間にも空白を入れる。
}
0640デフォルトの名無しさん
2006/06/28(水) 21:57:56コーディングなんとかスレってあったよね、そっちいけばいいんじゃない?
0641デフォルトの名無しさん
2006/06/29(木) 01:00:120642デフォルトの名無しさん
2006/06/29(木) 01:07:50珍しいスタイルだな。
0643デフォルトの名無しさん
2006/06/29(木) 06:37:290644デフォルトの名無しさん
2006/06/29(木) 06:51:240645デフォルトの名無しさん
2006/06/29(木) 06:58:510646デフォルトの名無しさん
2006/06/29(木) 07:27:41(個人的には空白の開けすぎで見辛いように思える)
> typename(classはどうしても必要なテンプレートテンプレートパラメータにしか使わない)
classがどうしても必要になるテンプレートパラメータってなんだ?
templateの仮引数中ではtypenameとclassは同義じゃねーの?
0647デフォルトの名無しさん
2006/06/29(木) 07:30:39template<template<typename>class U>
class A{};
0648デフォルトの名無しさん
2006/06/29(木) 07:47:20ああなるほど。
「typenameの代わりにclassを使わなければいけない場合がある」と勘違いした。
0649デフォルトの名無しさん
2006/06/29(木) 08:52:17いや、>>647のclassの場所にtypenameは使えない。
0650デフォルトの名無しさん
2006/06/29(木) 08:59:33{
int b;
public: A( const int i )b(i){};
};
constで受け取って、constじゃないのに入れるっておかしい?
いまいち、constの有効利用法が解らないんですが・・・
0651デフォルトの名無しさん
2006/06/29(木) 09:05:21とりあえず散歩して来い。川の堤防の上とかジョギングするのもいい。
とにかく一度頭をリセットするんだ。
0652デフォルトの名無しさん
2006/06/29(木) 09:06:51その場合、const int iはコンストラクタ中でiが不変であることをコンパイラに伝える意味しかない。
#つまり、間違ってコンストラクタ中でiに代入することを防止するということ。
別に渡す側にとっては何の関係もない。
0653デフォルトの名無しさん
2006/06/29(木) 09:10:58(といっても、最近のコンパイラは賢いから、変わらない事も多いけど)
0654デフォルトの名無しさん
2006/06/29(木) 10:57:13参照渡しとコピー渡しとプリミティブタイプあたりの関係を勉強した方がいいと思う。
0655デフォルトの名無しさん
2006/06/29(木) 17:37:56C++全体でいうと、constはオブジェクトが不変であることを表明するというという
使い方がある。仮引数にconstを付ければ、そのメンバ関数内ではその引数の
オブジェクトは不変だし、メンバ関数にconstを付ければ、そのメンバ関数呼び出しで
オブジェクトが変わらないことが保障される。
constなメンバ関数から、constでないメンバ関数は呼べない(コンパイル出来ない)から、
知らないところでオブジェクトがいつの間にか変わっているということがない。
0656デフォルトの名無しさん
2006/06/29(木) 17:41:46この効果的な使い方は・・・ググって。
0657デフォルトの名無しさん
2006/06/29(木) 17:43:29constなオブジェクトからはconstなメンバ関数しか呼べない。
意味的に不変であると宣言したオブジェクトは、コンパイル出来ないという
物理的な壁でもって、不変であることが保障される。
0658デフォルトの名無しさん
2006/06/29(木) 17:53:34あと演算子のオーバーロードとか。
ビット的定数性と概念的定数製も読みましたけど、これが必要と思えない...
0659デフォルトの名無しさん
2006/06/29(木) 18:01:32constなメソッドが要求されるのだが、メンバ変数を変更したいとき(そのままやん)。
概念的普遍性が必要になったことはないが、必要な人は必要なんだと思う。
0660デフォルトの名無しさん
2006/06/29(木) 21:31:380661デフォルトの名無しさん
2006/06/29(木) 21:32:340662デフォルトの名無しさん
2006/06/29(木) 22:38:07外に出したくなかったんでmutableにしたことあるな。
0663デフォルトの名無しさん
2006/06/29(木) 22:58:280664デフォルトの名無しさん
2006/06/29(木) 23:02:200665デフォルトの名無しさん
2006/06/30(金) 00:02:14thisポインタをキャストしてたよ。
mutableって何と読むの?ミュテーブル?
0666デフォルトの名無しさん
2006/06/30(金) 00:04:42ttp://dictionary.goo.ne.jp/search.php?mode=0&IE=sjis&type=sleipnir&MT=mutable&kind=ej&ej
0667デフォルトの名無しさん
2006/06/30(金) 00:06:56本当にありがとうございました。
0668デフォルトの名無しさん
2006/06/30(金) 00:10:480669デフォルトの名無しさん
2006/06/30(金) 00:13:340670デフォルトの名無しさん
2006/06/30(金) 00:18:00ttp://www.parashift.com/c++-faq-lite/const-correctness.html
0671デフォルトの名無しさん
2006/06/30(金) 00:21:19exportを使ったら、
物凄くマイナーな国の通貨と、
物凄くマイナーなジャンル(ピザデブ)の彼女ができました。
0672デフォルトの名無しさん
2006/06/30(金) 01:15:37いや、日本語読みを知りたいんだが…
0673デフォルトの名無しさん
2006/06/30(金) 01:16:49普通にミュータブル
0674デフォルトの名無しさん
2006/06/30(金) 01:31:450675デフォルトの名無しさん
2006/06/30(金) 01:52:55var[1.] = new hoge;
ってするとして、varはdestructorでどうやって扱えばいいの?
0676デフォルトの名無しさん
2006/06/30(金) 01:56:22it != var.end(); it++) delete it->second;
これでおかたずけかな
0677デフォルトの名無しさん
2006/06/30(金) 02:01:09std::map<double, boost::shared_ptr<hoge> > var;
とかやりだすんだが。
0679デフォルトの名無しさん
2006/06/30(金) 02:45:04とCマガのバックナンバーに書いてありました
しかし
#include <iostream>
#include <string>
class Base {
Base() { Base("aaa"); }
Base(std::string message) { std::cout << message << std::endl; }
};
int main(void) {
Base b;
return 0;
}
とするとちゃんとaaaと表示されます
どういうことなの?
0680デフォルトの名無しさん
2006/06/30(金) 02:53:54言語仕様で呼び出すことが禁止されているわけではない。
コンストラクタの実行中はまだthisポインタが確定していない。
その状態で別のコンストラクタを呼び出した際の動作は未定義。
だいたいの処理系ではthisがヘンな値を指したままBase(std::string message)が呼び出されるけど
その例ではthisを一切必要としていないから、”たまたま“うまく動いているように見えるだけ。
thisを必要とする処理、たとえばメンバ変数への代入なんかをするとアウト。
0681デフォルトの名無しさん
2006/06/30(金) 03:01:27Base("aaa") という式は Base() で初期化中のオブジェクトに対して
Base(string) を呼び出しているわけではなく、 Base(string) によって
初期化された Base 型の一時オブジェクトを得ることになる。
デストラクタにも出力を置いて試してみるといい。出力には this も加えると
わかりやすいだろう。
>>680
どこから出たデマだ?
0682デフォルトの名無しさん
2006/06/30(金) 03:04:37コンストラクタの中から普通にメンバ関数呼べるわけだし、
this がないわけないだろ。
仮想関数は Base のものになっちゃうが。
0683デフォルトの名無しさん
2006/06/30(金) 03:13:40確かにメンバ関数呼び出しもコンパイルできるし、 this も有効な値を持っているが、
コンストラクタの中では初期化が完了していない状態だということには気をつける必要がある。
0684デフォルトの名無しさん
2006/06/30(金) 03:18:290685デフォルトの名無しさん
2006/06/30(金) 03:21:11コンストラクタの実行中はコンストラクトは完了していない。
もったいぶって書くほどのことか?
0686デフォルトの名無しさん
2006/06/30(金) 06:56:54そうか
mutableを使えばいいのか
ありがとう
0687デフォルトの名無しさん
2006/06/30(金) 07:13:02bを生成中に、一時オブジェクトを生成しただけだろ。
コンストラクタ(だけ)を呼び出しているわけではないと思うのだが。
0688デフォルトの名無しさん
2006/06/30(金) 13:20:07そのデフォルトコンストラクタは、
Base() {
Base unused("aaa");
}
とほぼ意味だから。
コンストラクタで、別のコンストラクタを呼び出すには、
Base() {
new (this) Base("aaa");
}
みたいに、配置newを使うしかない。ただ、コレを使うと
初期化リストとか怖いことになるかもしれないので注意
0689デフォルトの名無しさん
2006/06/30(金) 14:15:54↓こうしたことと同じ。コンストラクタ内の一時変数ができるだけ。
Base(){
Base hensu("aaa");
} // ← 変数hensuが解放されて終わり。
デストラクタ(this->~Base())みたいに、this->Base("aaa")で呼べればいいのにとか思ったんだけど、
コンストラクタってクラスメソッドと同じ扱いっぽいから無理みたいだね。
0690デフォルトの名無しさん
2006/06/30(金) 14:16:45何がいいたいのかさっぱりわからん
0691デフォルトの名無しさん
2006/06/30(金) 15:15:18vector <classのTAG>はどうなんでしょう?
性能うpするにはclassよりstruct?
0692デフォルトの名無しさん
2006/06/30(金) 15:27:54何か根本的な勘違いをしてる
0693691
2006/06/30(金) 15:32:50std::vectorでstructは今まで使ってたけど、
classにしたらどうなるか教えてでつ。
0694デフォルトの名無しさん
2006/06/30(金) 15:39:16ttp://www.bohyoh.com/CandCPP/FAQ/FAQ00117.html
つまりclassにしても変わらない
0695デフォルトの名無しさん
2006/06/30(金) 15:41:46ヘッダファイルなどで
class CHoge;
と書いておくと、CHogeはクラスなのだと認識してくれるので、その下で
CHoge* pHoge;
なんて書いてもOKですよね。(実際にCHogeのclass定義などが後に存在していたとしても)
それと同じ理屈で、
enum HOGE
{
TEST=0
};
と「後に宣言される」HOGEを認識させることはできないでしょうか?
イメージ的には
enum HOGE; // HOGEはenumですよと宣言
HOGE hoge; // HOGE型を生成
//実際にはその下のほうでHOGEの中身を定義
enum HOGE
{
Test=0
};
です。
enumは所詮intなので、可能そうかなと思うのですが…。
0696デフォルトの名無しさん
2006/06/30(金) 15:43:360697デフォルトの名無しさん
2006/06/30(金) 15:48:11処理系依存に決定されるんだったはず。
だから、サイズが分からないという扱いになって、無理。
0698デフォルトの名無しさん
2006/06/30(金) 16:17:32すばやいお返事ありがとうございます。
残念。ダメですか。
enumの分割宣言とかできたらよかったのですけど…。
仕方ないのでint変数として作ることにします。
ありがとうございました。
0699デフォルトの名無しさん
2006/06/30(金) 16:59:05"特定のクラスにだけ継承を許す"というクラスは作成できるでしょうか
全ての関数が純仮想関数なインターフェースクラス(以下IClass)を定義したのですが、
他の人は、そのインターフェースクラスを継承するのではなく
それの一部に機能を実装したベースクラス(以下BClass)を継承してもらいたいのです
friend登録の逆思想で、IClass側に「私はBClass以外には継承されない」と制限をかけさせることはできないでしょうか
0700デフォルトの名無しさん
2006/06/30(金) 17:06:27コンストラクタをprivateにしてfriendすれば?
0701デフォルトの名無しさん
2006/06/30(金) 17:08:130702デフォルトの名無しさん
2006/06/30(金) 17:11:49自分でここまで書いてて答えにたどりつけないところがすごいな
つか、概念的にインターフェースじゃないよな、そのクラス
0703デフォルトの名無しさん
2006/06/30(金) 17:20:46>>701
IClass.hの更新はもうない(ようにしている)のですが、BClassの更新(変数の追加)はまだまだありそうなのです。
変数の増減の度に、この.hを読み込んでいる全ファイルがリコンパイルというのはよろしくないなと思いまして。
0704デフォルトの名無しさん
2006/06/30(金) 17:43:200705デフォルトの名無しさん
2006/06/30(金) 17:55:45ありがとうございます。pimplというのは聞いたことのない単語でしたが、調べたところ実に今回の解決にマッチしそうでした。
導入をテストしてみたいと思います。
0706デフォルトの名無しさん
2006/06/30(金) 18:04:51じゃあabstractクラスはみんなどうしてる?
AHogeか?
ハンガリー使わないって意見は別問題として。
0707デフォルトの名無しさん
2006/06/30(金) 18:11:070708デフォルトの名無しさん
2006/06/30(金) 18:24:340709デフォルトの名無しさん
2006/06/30(金) 18:27:250710デフォルトの名無しさん
2006/06/30(金) 18:38:56virtualじゃない(オーバーライドしないことを前提とした)実装が書いてあってもよさそうなもんだけど。
0711デフォルトの名無しさん
2006/06/30(金) 18:48:32インターフェイスにはI付けるけど、
クラスにはC付けない派。もちろん抽象クラスにも付けない。
0712デフォルトの名無しさん
2006/06/30(金) 19:09:05インターフェースを提供するクラス、って意味だから、
共通のインターフェースを提供してさえいれば、
実装の有無はあまり関係ないと思ってるが。
Javaのinterfaceは位置づけが微妙だな
0713デフォルトの名無しさん
2006/06/30(金) 19:12:380714デフォルトの名無しさん
2006/06/30(金) 19:25:21つNVI
virtualが一切無いけど、
protectedなメンバ変数を利用してインターフェイスを名乗らせたりもした。
0715デフォルトの名無しさん
2006/06/30(金) 19:26:03だよな、やっぱり逆ポーランドじゃないと。
0716デフォルトの名無しさん
2006/06/30(金) 22:09:160717デフォルトの名無しさん
2006/06/30(金) 22:13:31Cは一切付けない。
0718デフォルトの名無しさん
2006/07/01(土) 01:46:37インターフェースには I を付けるべきだが、
クラスには C 付けんな。ってどっかに書いてあった気がした。
あとアンダースコアも使うなとか。
ところでWinFXってなに?外国為替証拠金取引か?って感じだが。
0719デフォルトの名無しさん
2006/07/01(土) 07:35:35WinFXはWin32APIの置き換えとなるはずだったもの。
今では、置き換えされず、名前も単に.NET Framework 3.0になることが決定済み。
0720デフォルトの名無しさん
2006/07/01(土) 08:18:55昔から、MSゴシック/MS明朝とも、濁点と半濁点の区別、付けづらいよな。
その点Macで使われてたOsakaは区別付けやすかったんだが、
そのMacも最近を標準フォントをヒラギノに替え、
やはり濁点と半濁点を区別しづらくなった。
0721デフォルトの名無しさん
2006/07/01(土) 21:38:51class Hoge{
int* pointer;
public:
Hoge( int n ){ pointer = new int(n); }
//Hoge( const Hoge& hoge ){ pointer = new int(*hoge.pointer); }
~Hoge(){ delete pointer; }
};
int main(){
{
std::list<Hoge> list_hoge;
list_hoge.push_back( Hoge(777) );
}
return 0;
}
実行するとスコープを外れた時に、メモリのエラーが出ます。
コメントアウトしてあるコピーコンストラクタを有効にすれば問題は無いのですが、
それよりlistに挿入する度に、一回コピーが発生するのがどうにも無駄で。
実体ではなくポインタのリストにすれば良いのは分かるのですが、
管理の手間を省くために出来れば、実体のリストにしたいところです。
このままの形式で、挿入時にコピーを発生させずに済む方法があれば、教えて頂けないでしょうか。
0722デフォルトの名無しさん
2006/07/01(土) 22:12:160723デフォルトの名無しさん
2006/07/01(土) 22:15:55>実体ではなくポインタのリストにすれば良いのは分かるのですが、
>管理の手間を省くために出来れば、実体のリストにしたいところです。
boost::ptr_list
か
boost::shared_ptr <Hoge>をlistに入れるとか
0724デフォルトの名無しさん
2006/07/01(土) 22:22:05iterator->func() ではなく
(*iterator)->func()
みたいな記述になっちまうのは、妙な話だよな
0725デフォルトの名無しさん
2006/07/01(土) 22:37:07ptr_listにすれば前者の書き方でいけるだろ
0726デフォルトの名無しさん
2006/07/01(土) 22:45:17ああいや、スタンダードなのにこれか、みたいな
0727デフォルトの名無しさん
2006/07/01(土) 23:24:360728721
2006/07/01(土) 23:26:05ということは実体でlistを使うと言うことはほとんど無いんですかね。ちょっと不思議な感じもしますが。
boostの使用も検討してみます。
0729デフォルトの名無しさん
2006/07/01(土) 23:28:53いやだからptr_listはSTLじゃないだろ、くどいな
0730デフォルトの名無しさん
2006/07/01(土) 23:29:160731デフォルトの名無しさん
2006/07/01(土) 23:52:17ptr_listがあるだろ、くどいな
0732デフォルトの名無しさん
2006/07/02(日) 00:00:030733デフォルトの名無しさん
2006/07/02(日) 00:04:55どこでもboostが使えると思うなよw
0734デフォルトの名無しさん
2006/07/02(日) 00:05:180735デフォルトの名無しさん
2006/07/02(日) 08:39:56boost::indirect_iteratorもある。
0736デフォルトの名無しさん
2006/07/02(日) 09:32:36おおboostにもあったか!
0737デフォルトの名無しさん
2006/07/02(日) 10:26:24ptr_listがあるだろ
0738デフォルトの名無しさん
2006/07/02(日) 11:17:19関係ないがコピーベースって言葉、初めて聞いたな
0739デフォルトの名無しさん
2006/07/02(日) 11:21:42環境によるだろ。
俺はVC6で極力Boostを使用するようにして使っているが、
例えばVC8を使っても使わない時と比べ10K個ほどしか「〜もあるだろ」が増えない。
0740デフォルトの名無しさん
2006/07/02(日) 11:25:060741デフォルトの名無しさん
2006/07/02(日) 11:32:26もっとよこせ
0742デフォルトの名無しさん
2006/07/02(日) 13:11:37#define UNIT0_H
namespace Unit0 {
//クラス、関数宣言
}
using namespace Unit0;
#endif
こんな感じでヘッダファイル内の宣言を丸ごとnamespaceで囲んで問答無用でusingするのって問題ありますか?
0743デフォルトの名無しさん
2006/07/02(日) 13:15:400744デフォルトの名無しさん
2006/07/02(日) 13:18:31ソースファイル内なら十分意味があると思うが
そちらに関しても普通は無名名前空間を使うのが筋だし
0745742
2006/07/02(日) 13:20:080746デフォルトの名無しさん
2006/07/02(日) 13:33:52お前、「年齢=彼女が居ない期間」だろ?
1まんこで十分だ、沢山あってもウザイだけだぞ。
0747デフォルトの名無しさん
2006/07/02(日) 13:54:18using namespace Unit0;
これをヘッダじゃなくてソースファイルに書くようにしたら?
0748デフォルトの名無しさん
2006/07/02(日) 14:31:27Unit0::hoge;
べた打ちが吉と視た。
0749デフォルトの名無しさん
2006/07/02(日) 16:28:450750デフォルトの名無しさん
2006/07/02(日) 16:32:03#ifndef SystemHPP
#define SystemHPP
namespace System
{
//ここに宣言
}/* namespace System */
using namespace System;
#endif// System
0751デフォルトの名無しさん
2006/07/02(日) 16:38:52std::list::sort
0752デフォルトの名無しさん
2006/07/02(日) 21:31:45ヘッダで using namespace は曖昧さという危険性を
回避不能な形で強制的に埋め込む行為。禁止一択。
0753デフォルトの名無しさん
2006/07/02(日) 21:52:26その某フレームワークとはおそらくATL/WTLのことだろうが、
それらは、特定の名前のマクロを定義することによってusingディレクティブを行わないようにすることができる。
0754デフォルトの名無しさん
2006/07/02(日) 23:37:56エラーの場合に勝手に警告ダイアログとか出しやがる、
うんこライブラリに気持ち的に似ている感じがするので、
できればusingは辞めてほしい。
0755デフォルトの名無しさん
2006/07/03(月) 00:18:23BCBのVCLも同じことやってたな。
マクロを定義すると…ってとこも同じ。
0756デフォルトの名無しさん
2006/07/03(月) 07:43:510757デフォルトの名無しさん
2006/07/03(月) 11:37:48あるみたいなんですが
windowsな環境ではどちらを使えばよいのですか?
ANSIバージョン?
0758デフォルトの名無しさん
2006/07/03(月) 11:40:15よくわからんが、 ANSI なり ISO なりのほうが移植性が高いといえるんじゃないか?
0759デフォルトの名無しさん
2006/07/03(月) 19:49:14たぶん「UNIX互換バージョン」と呼ばれているのは、
標準Cに入る前の古いヤツの事ね。
<varargs.h>←これが古い頃のヤツ。
<cstdarg>←これが新しいヤツ。(Cでは<stdarg.h>)
0760101
2006/07/03(月) 23:31:04http://pc8.2ch.net/test/read.cgi/tech/1149815331/933-935
これ見てやっと原因把握。VCとg++の挙動が全然違う。
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/2241.txt
VCだと
D:\>ref.exe
Test Constructor 1 : this=0012FF60 : a=3
Derived Constructor 1 : this=0012FF60 : a=3 : b=4
Test Constructor 1 : this=0012FF5C : a=2
0(Test) or other(Derived) : 1
Test Copy Constructor : this=0012FF54 : a=3
Test Copy Constructor : this=0012FF6C : a=3
g++だと
$ ./a
Test Constructor 1 : this=0x22eeb0 : a=3
Derived Constructor 1 : this=0x22eeb0 : a=3 : b=4
Test Constructor 1 : this=0x22eea0 : a=2
0(Test) or other(Derived) : 1
>>101のエラーはコピーコンストラクタが動くせいで
privateメンバに触ってるぞってメッセージだったらしい。
ということで解決というかなんと言うか。まあ参考までに。
0761デフォルトの名無しさん
2006/07/03(月) 23:48:38参照に代入してるとこ?
0762デフォルトの名無しさん
2006/07/03(月) 23:58:080763デフォルトの名無しさん
2006/07/04(火) 00:08:18>std::ostream &out = fout ? fout : std::cout;
そこは↓こうしたらVCも通るかも。
std::ostream &out( fout ? fout : std::cout );
#gccとVCの違いはRVO(Return Value Optimization)絡みな希ガス。
0764デフォルトの名無しさん
2006/07/04(火) 05:08:10当然>>101はコンパイルできない。エラーメッセージは次のような感じ。
だいたい同じ事だろう。
c:\stlport-5.0.2\stlport\stl\_ios.h(131) : error C2248: 'stlp_std::ios_base::ios_base' : private メンバ (クラス 'stlp_std::ios_base' で宣言されている) にアクセスできません。
c:\stlport-5.0.2\stlport\stl\_ios_base.h(217) : 'stlp_std::ios_base::ios_base' の宣言を確認してください。
c:\stlport-5.0.2\stlport\stl\_ios_base.h(48) : 'stlp_std::ios_base' の宣言を確認してください。
コンパイラでのこの診断により関数 'stlp_std::basic_ios<_CharT,_Traits>::basic_ios(const stlp_std::basic_ios<_CharT,_Traits> &)' が生成されました。
with
[
_CharT=char,
_Traits=stlp_std::char_traits<char>
]
0765デフォルトの名無しさん
2006/07/04(火) 07:32:200766デフォルトの名無しさん
2006/07/04(火) 08:27:52こんなの見つけたよ。
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#446
rvalue を使うとコピーによる一時オブジェクトが必要になるらしい。
struct B { B(); private: B(B const&); };
struct D : B {};
int main()
{
B const& x = 0 ? B() : D();
}
でも >>760 や >>101 の例では両方 lvalue で片方がもう一方の
ベースクラスになる場合だから一時オブジェクトは要らないはず。
VC はなぜか rvalue として処理してしまってる気配がする。
で、 rvalue として処理された場合は一時オブジェクトなんで
結果で非 const 参照は初期化できないはずなんだけど、
VC ではなぜか以下略
0767デフォルトの名無しさん
2006/07/04(火) 10:14:12つまり d が Test の参照に変換できて、その参照が d に直接結合も可能。
その結果 d が t に合致するように変換できたっつーことで
第2演算対象と第3演算対象が同じ型の時のルールが適用されて
結果は Test の左辺値になる。勿論コピーはされない。
これが規格上の動作ってことでいいのかな。
0768デフォルトの名無しさん
2006/07/04(火) 11:12:350769デフォルトの名無しさん
2006/07/04(火) 11:26:04コピーコンストラクタ呼び出しがあるって時点でアウトだろ。> VC++8
0770デフォルトの名無しさん
2006/07/04(火) 11:29:30「規格上」なんだから回りくどいの当たり前。
つか>>766と>>767の内容は別物だぞ?
>>766は>>760がDefect Reportに載ってるどのケースに当るか、
VCはそれをどのように処理するかについての話だが、
>>767はlvalueだと一時オブジェクトが要らない理由の説明。
0771デフォルトの名無しさん
2006/07/04(火) 12:06:160772デフォルトの名無しさん
2006/07/04(火) 13:08:09>>760
> >>101のエラーはコピーコンストラクタが動くせいで
> privateメンバに触ってるぞってメッセージだったらしい。
iosは、コピーされるとまずいから、
コピーコンストラクタをprivate宣言してあるだけ。定義なし。
>>101見た瞬間に気付くように。
0773デフォルトの名無しさん
2006/07/04(火) 13:49:400774デフォルトの名無しさん
2006/07/05(水) 00:28:210775デフォルトの名無しさん
2006/07/05(水) 06:39:13vector<...> v;
...
�@
if (!v.empty()) {
for (auto it = v.begin(); it != v.end(); ++it) {
....
}
}
と
�A
for (auto it = v.begin(); it != v.end(); ++it) {
....
}
は同じですか?
0776デフォルトの名無しさん
2006/07/05(水) 08:21:330777デフォルトの名無しさん
2006/07/05(水) 10:05:09後者のほうが無駄なコードがなくていいんじゃないの?
0778デフォルトの名無しさん
2006/07/05(水) 10:54:01イタレータは問題ない。
emptyの時、v[n]するとまずい。
0779デフォルトの名無しさん
2006/07/05(水) 12:00:43なんの話をしてるんだ(´д`;
0780デフォルトの名無しさん
2006/07/05(水) 14:10:250781デフォルトの名無しさん
2006/07/05(水) 14:30:240782デフォルトの名無しさん
2006/07/05(水) 14:38:020783デフォルトの名無しさん
2006/07/05(水) 14:42:08>>778の上の行は質問への返事で、下の行は独り言なんだと思う。
0784デフォルトの名無しさん
2006/07/05(水) 22:19:10最近認識したのですが、webで断片的にページを読んで調べていてもいまいちよく判らないです
そこで、何ぞ詳しく説明してる本がないかと思ったのですが
どなたか心当たりはありませんでしょうか
0785デフォルトの名無しさん
2006/07/05(水) 22:41:040786デフォルトの名無しさん
2006/07/05(水) 22:59:14Hoge hogehoge{
{hogehoge_a, hogehoge_b, hogehoge_c},
{hogehoge_a, hogehoge_b, hogehoge_d},
};
↑これっを↓みたいに置換できないでしょうか?
それかコンパイル時に↑みたく展開できるような宣言方法はないでしょうか。
#define HOGEEEE (hogehoge_a, hogehoge_b})
Hoge hogehoge{
{HOGEEEE, hogehoge_c},
{HOGEEEE, hogehoge_d},
};
0787デフォルトの名無しさん
2006/07/05(水) 23:05:24Hoge hogehoge{
{HOGEEEE, hogehoge_c},
{HOGEEEE, hogehoge_d},
};
でいけない?
0788デフォルトの名無しさん
2006/07/07(金) 12:51:19void
swap(vector& __x)
{
std::swap(this->_M_impl._M_start, __x._M_impl._M_start);
std::swap(this->_M_impl._M_finish, __x._M_impl._M_finish);
std::swap(this->_M_impl._M_end_of_storage, __x._M_impl._M_end_of_storage);
}
/// See std::vector::swap().
template<typename _Tp, typename _Alloc>
inline void
swap(vector<_Tp,_Alloc>& __x, vector<_Tp,_Alloc>& __y)
{ __x.swap(__y); }
これでどうして中身の置き換えになるのか読み解けないです・・・
分かる人教えてけろ。
0789デフォルトの名無しさん
2006/07/07(金) 12:59:01{
void swap(A& x) { std::swap(this->i, x.i); }
int i;
};
inline void swap(A& x, A& y) { x.swap(y); }
と同じ事。
0790デフォルトの名無しさん
2006/07/07(金) 13:20:44中身がswapされるんじゃない。中身を挿しているポインタ、個数カウンタ、
アロケートされた領域、の3つが交換される。
0791デフォルトの名無しさん
2006/07/07(金) 15:42:59inline void
swap(vector<_Tp,_Alloc>& __x, vector<_Tp,_Alloc>& __y) のことを
std::swapと勘違いしていたようです。
どうも、お騒がせしました。
0792デフォルトの名無しさん
2006/07/07(金) 18:20:190793デフォルトの名無しさん
2006/07/08(土) 11:35:520794デフォルトの名無しさん
2006/07/08(土) 12:04:330795デフォルトの名無しさん
2006/07/08(土) 12:27:21ネタフリがあったほうがいいかもしれない。
0796デフォルトの名無しさん
2006/07/08(土) 12:28:260797デフォルトの名無しさん
2006/07/08(土) 12:59:04つ[boostスレ]
簡単な質問なら初心者スレでもいいかも知らん。
0798デフォルトの名無しさん
2006/07/08(土) 13:04:05全然関係ないが、
http://mytown.asahi.com/kanagawa/news.php?k_id=15000000607070002
0799デフォルトの名無しさん
2006/07/08(土) 16:39:380800デフォルトの名無しさん
2006/07/08(土) 19:31:37それを言うならこうだろ↓
ああアサヒのメンバ関数ね。イメージ向上作戦によく使われる。
0801デフォルトの名無しさん
2006/07/08(土) 23:58:21template < class T > struct F
{
template < class T2 > void Func( T2 );
template <> void Func( int i );
};
こういうクラスがあって、T2を取る関数を書く場合
template < class T >
template < class T2 >
void F<T>::Func( T2 ){...}
でコンパイル通るのですが、2番目のintを取るように特殊化したものを
template < class T >
template <>
void F<T>::Func( int i){...}
とかくと
C2244:関数の定義を既存の宣言と合致させることができませんでした
となって通りません。どのように書けばいいのでしょうか?
VS2003.netを使用してます
0802デフォルトの名無しさん
2006/07/09(日) 00:13:48規格書読んでみればわかるという回答でも無責任だしな、すまん。
0803デフォルトの名無しさん
2006/07/09(日) 01:33:21了解しました。ありがとうございます
0804デフォルトの名無しさん
2006/07/09(日) 01:36:20こんな難しいことやろうとしたことが無いから、わからん。
template < class T >
class F
{
public:
template <class T2>
void Func(T2 a) { }
template<> void Func(int i) {}
};
0805デフォルトの名無しさん
2006/07/09(日) 02:22:46〜
template<class T> void F<T>::Func(int i) {〜}
やりたいのはこういうこととは違うの?
0806デフォルトの名無しさん
2006/07/09(日) 02:35:39わかんないなら口を出すなよ恥ずかしいな
0807デフォルトの名無しさん
2006/07/09(日) 03:34:20<>→<int>
0808デフォルトの名無しさん
2006/07/09(日) 11:12:01はusing ディレクティブ
using std::cout;
はusing宣言
で合ってる?
0809デフォルトの名無しさん
2006/07/09(日) 11:50:45using-declaration:
using typenameopt ::opt nested-name-specifier unqualified-id ;
using :: unqualified-id ;
7.3.4 Using directive [namespace.udir]
using-directive:
using namespace ::opt nested-name-specifieropt namespace-name ;
0810デフォルトの名無しさん
2006/07/09(日) 18:26:40お、これでコンパイルできた。
だけど、実際にインスタンスを作製して、メンバを呼び出すとき
F<int> f;
f.Func(100);
f.Func<int>(100);
f.Func<>(100);
どれを呼び出しても、
template < class T >template < class T2 > void F<T>::Func(T2)
こっちが使われるみたい。
0811デフォルトの名無しさん
2006/07/09(日) 18:42:57template < class T >
struct F
{
template < class T2 > void Func( T2 );
void Func( int i );
};
じゃだめ?
0812デフォルトの名無しさん
2006/07/09(日) 18:53:25それだとテンプレートの明示化とは違った、普通のメンバになるから
呼び出すときに
Func(int)を呼び出すときは
f.Func(100);
Func(T2)を呼び出すときは
f.Func<>(100);
と使い分けなくちゃいけない。
0813デフォルトの名無しさん
2006/07/09(日) 19:08:45引数がintかint以外かでディスパッチしたいだけなんじゃないの?
f.Func(100);
f.Func(100.0);
で呼び分けるだけじゃダメなのかい?
0814812
2006/07/09(日) 20:06:49すまん、俺が勘違いしてたみたいだ。
確かに、それでうまくいきますね。
ってことは、template 関数の特殊化って何のためにあるんだろうと。わからなくなってきた。。
半年ROMることにするorz
0815デフォルトの名無しさん
2006/07/09(日) 20:27:480816デフォルトの名無しさん
2006/07/09(日) 23:32:33どこで手に入れられるのでしょうか?
0817デフォルトの名無しさん
2006/07/09(日) 23:42:570818デフォルトの名無しさん
2006/07/09(日) 23:45:500819デフォルトの名無しさん
2006/07/09(日) 23:46:17http://www.google.co.jp/search?q=%22JIS+X+3014%3A2003%22
画像形式のものならダウンロードできる。
日本語っていう条件がなければ >>6 の
↓ここからダウンロードできるドラフトがお勧め。
> [JTC1/SC22/WG21 - C++]
> http://www.open-std.org/jtc1/sc22/wg21/
0820デフォルトの名無しさん
2006/07/09(日) 23:46:370821デフォルトの名無しさん
2006/07/09(日) 23:59:22>>818
>>819
>>820
どうもありがとうございます。
0822デフォルトの名無しさん
2006/07/10(月) 00:41:10http://www.jisc.go.jp/
ここで、「JIS検索」 → X3014 で検索 → あとはがんばれ
0823デフォルトの名無しさん
2006/07/10(月) 01:13:06gcc -lstdc++ a.cpp
とすると
/cygdrive/c/DOCUME~1/ADMINI~1/LOCALS~1/Temp/ccfRcOaV.o:a.cpp:(.text+0xd): undefi
ned reference to `std::basic_string<char, std::char_traits<char>, std::allocator
<char> >::size() const'
/cygdrive/c/DOCUME~1/ADMINI~1/LOCALS~1/Temp/ccfRcOaV.o:a.cpp:(.text+0x60): undef
ined reference to `std::basic_string<char, std::char_traits<char>, std::allocato
r<char> >::operator[](unsigned int) const'
とずらずらとエラーが出ます
#include <string>
#include <iostream>
int main(void ) {
std::string s = "a";
std::cout << s << std::endl;
}
gccのバージョンは
gcc --version
gcc (GCC) 3.4.4 (cygming special) (gdc 0.12, using dmd 0.125)
Copyright (C) 2004 Free Software Foundation, Inc.
どこがまずいのでしょうか?
0824デフォルトの名無しさん
2006/07/10(月) 01:41:27gcc a.cpp -lstdc++
g++ a.cpp
0826デフォルトの名無しさん
2006/07/11(火) 00:16:07ODR (One Definition Rule)違反とやらは
namespace{int val;}
template<typname T>
class A {
void foo(T t) { val = 0;}
};
テンプレートクラスAが実体化する時に
valが外部リンケージを持たないのでヤバイよ
っていう認識でいいんですかね
0827デフォルトの名無しさん
2006/07/11(火) 00:25:04なぜそうなる?
定義の重複は許しませんよっていうルールだ。
その例は確かに違反だが、 template に限ったルールじゃない。
ついでに、その例で val は外部リンケージ持ってるよね?
0828デフォルトの名無しさん
2006/07/11(火) 00:41:49レスありがとうです
templateはあくまで例なんですが、
他の翻訳単位から実体化する時にvalを参照する場合、
翻訳単位毎に違うvalを参照する→ODRの原則に違反
という認識でいいのかなと思って
思い切り言葉足らずでしたね
>ついでに、その例で val は外部リンケージ持ってるよね
すいません。static int val;と書く予定がコピペ間違えました
0829デフォルトの名無しさん
2006/07/11(火) 10:40:14SunStudio の C++ ではコンパイル時にエラーになるらしい。下記参照。
http://developers.sun.com/prodtech/cc/documentation/ss11/ja/mr/READMEs/c++.html#cUndefined
0830デフォルトの名無しさん
2006/07/11(火) 14:44:29size_t NumberOfElements(T (&)[N])
{
return N;
}
配列の要素数を取得するこんなの、標準やboostにありますか?
0831デフォルトの名無しさん
2006/07/11(火) 15:17:16template <class T>
class A {
public:
typedef T type;
type f();
private:
type data;
};
----------a.cpp--------
#include "a.h"
template <class T>
type A<T>::f()
{
return data;
}
このコードをコンパイル(VC7.1)しようとすると
a.cpp(4) : error C2143: 構文エラー : ';' が 'A<T>::f' の前にありません。
a.cpp(4) : error C2501: 'type' : 識別名を宣言するのに、型が指定されていません。
というエラーが出ますが理由がわかりません。
typedefを使わずにtypeをTに変えるとコンパイルできます。
エラーの理由を教えてください。
0832デフォルトの名無しさん
2006/07/11(火) 15:24:150833デフォルトの名無しさん
2006/07/11(火) 16:04:59手軽に使えるものがあるといんですが。。
0834デフォルトの名無しさん
2006/07/11(火) 16:12:37boost::program_options
0835831
2006/07/11(火) 16:15:33ありがとうございました。
a.cppの4行目を
typename A<T>::type A<T>::f()に変えたらコンパイルできました。
0836デフォルトの名無しさん
2006/07/11(火) 16:21:02for ( int i = 0; i < 3; i++ ) { }
このコードは以下と等価ですが
int i;
for ( i = 0; i < 3; i++ ) {}
このバグとも思える仕様はVC7や8
では直っているのでしょうか?
0837デフォルトの名無しさん
2006/07/11(火) 16:26:02コンパイラのオプションで指定できる。
0838デフォルトの名無しさん
2006/07/11(火) 16:27:05VC8では直ってる。
VC7は知らん。
0840デフォルトの名無しさん
2006/07/11(火) 16:39:51/Zc:forScope
http://msdn.microsoft.com/library/ja/vccore/html/vcrefZcforScope.asp
ちなみに昔はむしろその仕様で正しかった。
VC++はそれをいつまでもずるずる引きずっているだけで、単純にバグと言い捨てるものどうかとは思う。
0841デフォルトの名無しさん
2006/07/11(火) 16:41:37boost::size
ただし、Boost.Rangeの一部だから、コンテナに使うとメンバのsize()を呼ぶなどという具合で、適用できる幅が広い。
0842デフォルトの名無しさん
2006/07/11(火) 16:48:18それ今もひきずってんの?
838の
>VC8では直ってる。
はスコープのデフォルトを直したってことかな
0843デフォルトの名無しさん
2006/07/11(火) 16:52:570844デフォルトの名無しさん
2006/07/11(火) 16:54:43ごめんVC手元にないんだよ
0845デフォルトの名無しさん
2006/07/11(火) 16:58:20VC8はデフォルトで/Zc:forScopeが指定された状態になっている。
0846838
2006/07/11(火) 16:59:38だったら最初からこんなところで聞くなヴォケ
0847デフォルトの名無しさん
2006/07/11(火) 17:12:05聞き返したぐらいで気を悪くしないでおくれ
ごめんよ
>>845
どうもありがとう
0848デフォルトの名無しさん
2006/07/11(火) 17:15:18VC7では直ってなくて
VC7.1ではデフォルトでは直ってないがオプション指定で回避可能
VC8直ってる
でOK?
0849デフォルトの名無しさん
2006/07/11(火) 17:34:07これは例外を投げない事は保証されているのでしょうか?
0850デフォルトの名無しさん
2006/07/11(火) 17:43:12ほかに多くの問題が出るので、実質使えないオプションだけど。
0851デフォルトの名無しさん
2006/07/11(火) 18:38:38VC7.1では/Zc:forScopeなしでfor文の外でも使えるけど、
外で既に同名の変数が宣言されていたらそっちを優先するようになった。
例えば
void func() {
int i;
for(int i;;) {
}
}
これはVC6だと宣言がダブってるってエラーが出てコンパイルできなかった。
0852851
2006/07/11(火) 18:40:28-外で既に
+ローカルスコープのどこかで
0853デフォルトの名無しさん
2006/07/11(火) 18:40:55#include <windows.h>
しなければ何ともないぜ。
0854デフォルトの名無しさん
2006/07/11(火) 18:42:280855デフォルトの名無しさん
2006/07/11(火) 18:59:36Sequence (std::vector, std::deque, std::list) については保証されています.
AssociativeContainer (std::[multi]set, std::[multi]map) に関しては,
要素比較の関数オブジェクトのコピーコンストラクタが例外を送出しない限り,
swap も例外を送出しないことを保証しています.
0856849
2006/07/11(火) 19:45:16ありがとうございます。
比較関数オブジェクトで思いついたんですけど
アロケータが異なる場合も保証されないと思うんですけどどうなんでしょ?
0857デフォルトの名無しさん
2006/07/11(火) 21:18:59>アロケータが異なる場合も保証されないと思うんですけどどうなんでしょ?
「異なる」の意味が少なくとも2つ考えられるんですけれど,どっちでしょうか?
「型が異なる」場合の話なら,そもそも異なるアロケータ型を指定された
コンテナ同士は swap が定義されていないですし,
「オブジェクトが異なる」場合の話なら,標準の範囲では
コンテナに対して指定するアロケータのオブジェクト各々が
異なる状態を持つことを明示的に禁止しています.
0858849
2006/07/11(火) 21:46:46「オブジェクトが異なる」場合の話です。
VC++2003付属のSTL見たら、アロケータを比較して別の処理してたので。
>コンテナに対して指定するアロケータのオブジェクト各々が
>異なる状態を持つことを明示的に禁止しています.
知りませんでした。
じゃあ何故コンストラクタでアロケータのインスタンスを取るようになっているのか
と思ったりするんですが。
0859デフォルトの名無しさん
2006/07/11(火) 23:06:49先日 boost で提案されてた。 VC6 でも使える実装とか、いろいろこねくりまわしてたが、
結局どうなったかわからん。少なくとも現時点では含まれていない。
0860デフォルトの名無しさん
2006/07/11(火) 23:14:40異なるアロケータインスタンスは禁止されているわけじゃない。
ライブラリの実装に対してそれらをサポートすることを要求していないだけ。
しかしサポートしようとすると難しい問題が発生するので
現存するほとんどの実装ではサポートされていない。
最近 STLport で条件付だがサポートされたらしい。
0861デフォルトの名無しさん
2006/07/11(火) 23:14:54>>841
0863デフォルトの名無しさん
2006/07/12(水) 00:00:240864デフォルトの名無しさん
2006/07/12(水) 03:09:31y個の要素をランダムに選び出す高速な方法ってないでしょうか。
例えば、各アルファベットの出現確率に合わせて
y個のアルファベットを選び出すような感じです。
累積ヒストグラムを作ってやる方法位しか思いつかないんですが、
もっと高速な方法は無いでしょうか?
0865デフォルトの名無しさん
2006/07/12(水) 03:25:48お前はもっとみっともないけどな
0866デフォルトの名無しさん
2006/07/12(水) 04:17:150867デフォルトの名無しさん
2006/07/12(水) 09:24:23post-construction
て単語があるんだけどこれはどういう意味ですか?
コンストラクタに関するうんぬんの後の処理って意味?
0868デフォルトの名無しさん
2006/07/12(水) 10:05:34インスタンスにvirtual tableの設定などをした後ってことだと。
その後、ユーザ定義コンストラクタのコードが実行される。
0869デフォルトの名無しさん
2006/07/12(水) 10:26:030870デフォルトの名無しさん
2006/07/12(水) 11:45:47通常、
class X* ptr = new X();
という感じでインスタンスを作成してから
delete ptr;
でメモリ開放します。ですが、
new X();
という形で作成した場合は、どうやって開放すればいいでのしょうか?
よろしくお願いします。
0871デフォルトの名無しさん
2006/07/12(水) 11:57:03言ってる意味がよく分からないが、
newした結果をどこにも格納していない場合は明示的に解放はできない。
オブジェクトがdelete this;で自身を解放するようになっていない限り、リークする。
0872デフォルトの名無しさん
2006/07/12(水) 12:56:17delete new X(); でおk
0873デフォルトの名無しさん
2006/07/12(水) 14:02:53読み込めるような関数ってありますか?
もしくはGetPrivateProfileString()でセクションを意識しなくてもいい方法があれば
教えてください。
0874デフォルトの名無しさん
2006/07/12(水) 14:08:48プロジェクト名:TEST1
データセット名:TestDataset1
新しい項目の追加で「データセット」を追加し、テーブルDatasetTestを作成しました。
この時点でビルドをしてもエラーは出ないのですが
Form1(デザイン)でdatasetを追加する時に
[型指定されたデータセット]にチェックを入れ作成したデータセットを指定し
ビルドすると、自動生成されたTestDataset1.hの
public: __delegate System::Void Test1RowChangeEventHandler(System::Object * sender, Test1::TestDataset1::Test1RowChangeEvent * e);
部分で「\test1\TestDataset1.h(57): fatal error C1004: 予期しない EOF が見つかりました。」
とエラーになります。
ヘルプ等を見てもどうして突然エラーになるのか分かりません。
宜しくお願いいたします。
0875デフォルトの名無しさん
2006/07/12(水) 15:15:360876デフォルトの名無しさん
2006/07/12(水) 15:16:59>>1読め
スレ違い
0877874
2006/07/12(水) 15:26:360878867
2006/07/12(水) 16:35:50ありがとう
そっか、コンストラクションは構築だから単純にクラスを作った
あとでよかったのか。で、そのあとにコンストラクタが起動する・・・と
0879デフォルトの名無しさん
2006/07/12(水) 20:58:55クラスを作った→インスタンスを作った
0880デフォルトの名無しさん
2006/07/12(水) 22:22:44コンストラクションのあとにコンストラクタが起動する・・・っておかしくね?
0881デフォルトの名無しさん
2006/07/12(水) 23:08:440882デフォルトの名無しさん
2006/07/13(木) 01:08:21あーごめん。見逃してた。そうだな。頭がおかしいな。
0883878
2006/07/13(木) 11:06:50結局post-constructionの意味は
クラスのインスタンスが作成されて
そのインスタンスのコンストラクタ
が実行されたあと
ってことですか?
それともインスタンスが作成されて、
コンストラクタが実行される前のこ
とですか?
0884デフォルトの名無しさん
2006/07/13(木) 11:46:250885デフォルトの名無しさん
2006/07/13(木) 14:15:40建造物や設備等の構築後の運用・管理のことを指しますよ。
いかにC++の本でも、定義等も無しでいきなり出てきたんなら
たぶん間違いなく100%こういう意味で使ってると思うけど。
0886デフォルトの名無しさん
2006/07/13(木) 15:09:18そもそも"C++の洋書"とは何という本なのか
なにも補足せずにそう書いたということは禿の原書?
0887デフォルトの名無しさん
2006/07/13(木) 18:59:540888デフォルトの名無しさん
2006/07/13(木) 21:14:30で、禿なら邦訳あるんだから、センテンスが特定できてるんなら
どう訳されてるか見ればいいんでないのかと
0889デフォルトの名無しさん
2006/07/13(木) 22:49:400890デフォルトの名無しさん
2006/07/14(金) 00:58:29英語に限らず、文脈を無視して、
単語の意味が一意に決まると考えていると、
文章読解うまくいかないよ。
母国語では自然とやっているんだけど。
国語辞典だって意味は何項目も書いてあるでしょ。
0891デフォルトの名無しさん
2006/07/14(金) 08:12:42WINDOWSで使えるようなツールって、ほかにありますか?
0892デフォルトの名無しさん
2006/07/14(金) 08:24:50スレ違い。
すれ立てるまでもない質問は〜というスレッドがあるはずなんだが、
ちょうど 1000 行ったところみたいだな。
0893デフォルトの名無しさん
2006/07/14(金) 08:48:12↓ここ行ってみれば?
Service for UNIX
http://pc8.2ch.net/test/read.cgi/unix/1015676742/
0894デフォルトの名無しさん
2006/07/14(金) 08:50:19ちがうところ探します。
0895デフォルトの名無しさん
2006/07/14(金) 08:51:30ありがとうございます!
いってみます。
0896デフォルトの名無しさん
2006/07/15(土) 13:11:59と某所で書いてあったんですが、どういう意味でしょうか?
.hファイルに関数定義を書いてると#includeしてその関数呼び出すところは
全部インラインになるってこと?まじ?
0897デフォルトの名無しさん
2006/07/15(土) 13:14:44インライン展開されるか否かはコンパイラの御心次第。
コンパイラによっては、別ソースの関数でもインライン化してくれるかも知らん。
サイズを問題にするなら、コンパイルオプションを併用するのが無難。
#そしてその話題はスレ違いなので以下個別環境向けスレでどうぞ。
0898デフォルトの名無しさん
2006/07/15(土) 13:33:450899デフォルトの名無しさん
2006/07/15(土) 13:45:11インライン関数になるかどうかは inline と明示するか、
クラス定義内でメンバ関数の定義まで書いてしまうかで決まる。
ヘッダに書いたからインライン関数になるわけじゃない。
サイズが大きくなるっていうのは言い訳で、
ほんとはなるべくヘッダに実装を晒すべきじゃない
ってことが言いたいんじゃないかな?
効率を求めない限りはインライン関数なんて
積極的に使うもんじゃないしね。
0900デフォルトの名無しさん
2006/07/15(土) 13:51:47>>899
>効率を求めない限りはインライン関数なんて
>積極的に使うもんじゃないしね。
kwsk
0901デフォルトの名無しさん
2006/07/15(土) 13:56:56>最近のコンパイラはinlineつけなくてもメンバ関数じゃなくてもインライン展開するからなぁ。
リンク時コード生成?まだまだ一般的じゃないような
0902デフォルトの名無しさん
2006/07/15(土) 13:59:58詳しくも何も、そのまんまだよ。インライン関数はヘッダに定義を晒す必要があるから、
関数の中身を変更したときは使ってる側の再コンパイルが要ることになるだろ。
中身を書くためには追加でヘッダのインクルードが必要になったりするしね。
ヘッダの依存関係はなるべく小さいほうがいいでしょ?
0903デフォルトの名無しさん
2006/07/15(土) 14:04:27しったか乙
0904デフォルトの名無しさん
2006/07/15(土) 14:06:31int main() {
foo();
}
は、大抵のコンパイラならインライン化することない?
0905デフォルトの名無しさん
2006/07/15(土) 14:07:48知らなくて聞いただけなんだから
>>897はバカ無能クソ低脳カス知ったかだけど
0906デフォルトの名無しさん
2006/07/15(土) 14:09:30コンパイラの勝手だ。 foo() の中身にもよる。
それが大抵のコンパイラで事実だとしても、それに依存した
コーディングをしていいわけじゃないし。
0907デフォルトの名無しさん
2006/07/15(土) 14:13:41だいたい合っていると思うんだが。
0908デフォルトの名無しさん
2006/07/15(土) 14:16:430909デフォルトの名無しさん
2006/07/15(土) 14:17:14単体では間違っていないが、質問への返答としては見当違い。
0910デフォルトの名無しさん
2006/07/15(土) 14:30:56別に検討違いじゃないと思うけど
0911デフォルトの名無しさん
2006/07/15(土) 14:40:560912デフォルトの名無しさん
2006/07/15(土) 14:41:21違うという奴は、ほのめかしではなくて、きちんと指摘しろ。
0913897
2006/07/15(土) 14:41:22確かに漏れの回答はベクタが違う。
それを指して馬鹿だ無能だ低脳だとまぁ言いたい放題だこと。
>>901
iccの場合、オブジェクトモジュール内にインライン展開用の情報を埋めておいてリンク前に
プロシージャ間最適化している模様。
但し,gccも含めて>904のケースはコンパイル時にインライン展開してしまう。
#ついでに末尾再帰のループ化とか。
0914デフォルトの名無しさん
2006/07/15(土) 14:46:37「見当違い」と指摘されて「ベクタが違う」と言い直すのが見苦しいな。
スレ違いだと自分で言っていたのに、勝手に特定のコンパイラの話まで持ち出すし。
これではさすがに知識披露厨と罵られても仕方がない。
0915デフォルトの名無しさん
2006/07/15(土) 14:49:46ウザいな、お前。
どこがどう見当違いなのか、具体的に指摘しろ。
出来なければ消えろ。
0916デフォルトの名無しさん
2006/07/15(土) 14:50:53これは酷いな。
>>909は「指摘」なんかじゃなくてただの「言いがかり」。
「勝手に」持ち出したんじゃなくて聞かれたから答えた。
途中から読んでもこんくらいのことすぐわかる。
頭大丈夫?
0917デフォルトの名無しさん
2006/07/15(土) 14:51:080918デフォルトの名無しさん
2006/07/15(土) 14:53:16>>899は定義を別ファイルにしてもinline化される可能性について排除しているから、
>>897の方が俺はいいと思うけどな。
0920デフォルトの名無しさん
2006/07/15(土) 14:56:42inline もあんま意味ないの?
0921デフォルトの名無しさん
2006/07/15(土) 14:59:37まあ転送関数だよ、程度の意味にしか使ってないな
0922デフォルトの名無しさん
2006/07/15(土) 15:08:14関わってただろ。
0923デフォルトの名無しさん
2006/07/15(土) 16:47:30ヘッダに関数の定義を書けるという効果があるから、
ヘッダだけの簡易的なライブラリを作るのに使える。
だめ?
0924デフォルトの名無しさん
2006/07/15(土) 17:00:07お前が消えろ。臭い。
0925デフォルトの名無しさん
2006/07/15(土) 19:50:56だまれ、糞ガキ
0926デフォルトの名無しさん
2006/07/15(土) 20:12:06インラインにするかどうかの判断基準に入れてるコンパイラなんてあるの?
もちろんそうするのは勝手だろうが、
(順序でなく)記述場所によって意味が変わることになってしまうのは・・
0927デフォルトの名無しさん
2006/07/15(土) 20:29:33リンカに頼らなくても、定義を利用できるかどうかの問題だろ。
中間コードを利用してリンカでinline展開するコンパイラもあるけどね。
0928デフォルトの名無しさん
2006/07/15(土) 22:09:48差し詰め言いがかり厨といったところか
0929デフォルトの名無しさん
2006/07/16(日) 01:07:46お前が黙れ、糞ガキ
0930デフォルトの名無しさん
2006/07/16(日) 04:23:140931デフォルトの名無しさん
2006/07/16(日) 10:22:21class Session {};
class SessionFactory {
public:
Session Create( );
Session* CreatePtr( );
void Create(Session*& p);
};
Session SessionFactory::Create( ) {
Session s;
return(s);
}
Session* SessionFactory::CreatePtr( ) {
return(new Session( ));
}
void SessionFactory::Create(Session*& p) {
p = new Session( );
}
static SessionFactory f; // The one factory object
int main( ) {
Session* p1;
Session* p2 = new Session( );
*p2 = f.Create( ); // Just assign the object returned from Create
p1 = f.CreatePtr( ); // or return a pointer to a heap object
f.Create(p1); // or update the pointer with the new address
}
このコードc++cookbookのサンプルコードなんだけど
p1 = f.CreatePtr()で新しいSessionがnewされて
次にf.Create(p1)でまた新しいSessionがnewされてるけど
このままじゃメモリリークしないですか?
0932デフォルトの名無しさん
2006/07/16(日) 10:31:580933デフォルトの名無しさん
2006/07/16(日) 10:57:490934デフォルトの名無しさん
2006/07/16(日) 12:01:29Factoryの使い方を説明しているだけのコードだろ。
小さいことにこだわるな。
0935デフォルトの名無しさん
2006/07/16(日) 12:06:09そういう問題じゃない気がするが
0936デフォルトの名無しさん
2006/07/16(日) 12:07:03public:
void setHoge(�@) { ... }
�A getHoge() { ... }
private:
tr1::shared_ptr<Hoge> hoge_;
};
このようなクラスがあったとき、�@と�AはHoge*かtr1::shared_ptr<Hoge>の
どちらにするのがいいのでしょうか?
�Aはユーザーが誤ってdeleteできないようにtr1::shared_ptrを返す
べきとは思うのですが
0937デフォルトの名無しさん
2006/07/16(日) 12:33:36そういう問題でしょ
0938デフォルトの名無しさん
2006/07/16(日) 13:02:15get出来ないのがいいと思う。
access用のinterfaceを用意して。
0939デフォルトの名無しさん
2006/07/16(日) 14:51:47ちがう
0940デフォルトの名無しさん
2006/07/16(日) 14:59:02いや、そういう問題でしょ
0941デフォルトの名無しさん
2006/07/16(日) 15:01:59だからmainが終わるからと言って呼ばなくて良いことにはならない。
そう書くと、今度は931のSessionにはデストラクタがないとか言われそうだけどさ。
0942デフォルトの名無しさん
2006/07/16(日) 15:06:070943デフォルトの名無しさん
2006/07/16(日) 15:10:11当方、C/C++の開発をやってみようと思って、いろいろサイトを見て回ったのですが、
統合開発環境が沢山ありすぎ、
どれを使ったらよいのかわかりません。
お勧めなものや、一般的に普及している統合開発環境ってありますでしょうか。
0944デフォルトの名無しさん
2006/07/16(日) 15:15:08Unix系ならeditor + Makefile。
Macは知らん。
0945デフォルトの名無しさん
2006/07/16(日) 15:15:14デストラクタに重要な動作があれば必須かと。
0946デフォルトの名無しさん
2006/07/16(日) 15:16:57で、>>931のコードには、その重要な何かがあると?
0947デフォルトの名無しさん
2006/07/16(日) 15:20:430948デフォルトの名無しさん
2006/07/16(日) 15:22:34早いレスありがとうございました。
申し訳ありません、詳細を記述しておりませんでした。
当方の環境はWindowsXPです。
Windows系なので、一択といえるものがあり、安心しました。
VCとはVisual C++のことだと思うのですが、EEとは何の略称なのでしょうか?
0949デフォルトの名無しさん
2006/07/16(日) 15:32:120950デフォルトの名無しさん
2006/07/16(日) 15:33:26コードをちゃんと嫁
読んでも分からんのなら勉強しろ
mainで解放していようがいまいが、>>931のクラスと使い方ではリークする
0951デフォルトの名無しさん
2006/07/16(日) 15:45:12早速Visual C++ Express Edition についていろいろ調べてみようとおもいます。
0952デフォルトの名無しさん
2006/07/16(日) 16:00:39「ゲーム作成ができない」という表現がございました。
まず、当方のやりたい事を記述していなくて申し訳ありませんでした。
ネットゲームでのツール(オートログイン、経験値時給表示、キャラ自動操作等)
を作成してみたいと考え、C/C++の開発を行おうとおもっています。
ゲーム作成とネットゲームのツール作成は
確かに異なりますが、私のやりたいことはVCEEにて可能なのでしょうか
0953デフォルトの名無しさん
2006/07/16(日) 16:03:37じゃあ、ソースを呼んだお前が>>931のクラスと使い方の問題点でも
指摘すればいいんじゃね?
0954デフォルトの名無しさん
2006/07/16(日) 16:20:57基本的に何でもできると思うよ。
平易か困難かは別問題だが。
まぁ自力で調べる力はあるようなので心配はいらないかもな。
0955デフォルトの名無しさん
2006/07/16(日) 16:24:05色々なのが欠乏してたと思う。
0956デフォルトの名無しさん
2006/07/16(日) 17:04:59それは別途Platform SDKをダウンロードすればよいだけ。
0957デフォルトの名無しさん
2006/07/16(日) 17:07:48すぐにmain()が終わってるから所詮サンプルコードって意味じゃね
「main()が終わる前にdeleteすればちゃんと動く」とは誰も言ってない気が
0958デフォルトの名無しさん
2006/07/16(日) 18:27:10その手の人に言わせると使えてしまうらしいが
0959デフォルトの名無しさん
2006/07/16(日) 18:28:43structはデフォルト公開子がpublicで
classはprivate
っていうだけですか?
例えばC#ではstructはスタックにclassはヒープ
っていう違いがあるけどC++ではどうなのでしょうか?
0960デフォルトの名無しさん
2006/07/16(日) 18:33:58それだけ。全く違いは無い
one keyword, one functionality.ということで
自分はstructが好きだが
Boostを見るとみんな好みで使ってるようだな
0961デフォルトの名無しさん
2006/07/16(日) 18:34:260962デフォルトの名無しさん
2006/07/16(日) 18:36:26>>access用のinterfaceを用意して
kwsk
0963959
2006/07/16(日) 18:39:22>>961
了解。ありがとうございました
ところで
one keyword, one functionality
とはどこが出典の格言でしょうか?
それとどういう意味ですか?
一つのキーワードは一つの機能と対応すべし
って意味だと思うんですが、
もともとstructがクラスとしての機能を果たしえたのに
名前的な対応のためにclassキーワードが追加された
とかいう背景でもあるのですか?
0964デフォルトの名無しさん
2006/07/16(日) 18:52:36普通なら頑張れと言うところだが、升(チート)作りが目的なら寧ろ頑張るな。
別にMFCでGUIを作るわけじゃなさそうだからそれこそVC2005EEで充分だとは思うが。
0965デフォルトの名無しさん
2006/07/16(日) 18:57:44>>964 升がチートの略表記なのね。1/3圧縮か。おもしろいなあ
0966デフォルトの名無しさん
2006/07/16(日) 19:03:23Cとの互換性のためにstructではディフォルトがpublicになっているが、
オブジェクト指向のデータの隠蔽という概念からすれば、ディフォルトがprivate が望ましい。
だから新たなキーワード class が必要だったんじゃない?
0967デフォルトの名無しさん
2006/07/16(日) 22:34:09「常に内部の#includeガードを書こう
決して外部の#includeガードを書いてはいけない」
の中に以下の文があるのですが、理解できません。
「
昔の本に提唱されていた古臭い外部の#includeガードを
使うのはやめよう。
#ifndef FOO_H_INCLUDE_
#include "foo.h"
#define FOO_H_INCLUDE_
#endif
外部の#includeガードは冗長で、現在のコンパイラでは時代
遅れである。また、インクルードする側とヘッダーファイルが
ガード名について合意していなければならない。
これにより密接な結合が生じ脆弱になる。
」
文章中の「インクルードする側とヘッダーファイルがガード名について
合意しなければならない」とは具体的にどういう状況なのでしょうか?
0968デフォルトの名無しさん
2006/07/16(日) 22:44:49その例では foo.h の中で使われるインクルードガードが
FOO_H_INCLUDE_ である必要がある。 foo.h が勝手に
インクルードガード変えたりすると破綻する。変更に対応しようとすると
FOO_H_INCLUDE_ を使ってる箇所を全部置換してまわる必要がある。
0969デフォルトの名無しさん
2006/07/16(日) 22:47:34D&Eに何かないかとざっと探してみたが、classという言葉をSimulaから持ってきたということは書いてあったけど、
そもそもstructではだめだったのかということを直接的に書いているところは見当たらなかった。
強いて言えば4.4の中、「シンタクスは重要だ」とかが関係あるかな。
structとclassについて書いてあったのはこれくらい。
---3.5.1の後半の要約
しかしそれではなぜ私はstructとclassを別の概念にすることを選ばなかったのだろうか?
私の意図は、概念を1つにすることだった。ルールを二つにしてもそんなに困らなかったかもしれないが、
しかし単一概念のほうが、各機能の円滑な統合化と単純な実装を可能にする。
概念を一つにしなければ、"伝統的なCスタイルのプログラミング"から"抽象データタイプ"へ、
そしてさらに"オブジェクト指向プログラミング"への、円滑で斬新的な移行はできない、と感じていた。
結局のところ、こういう考え方が、実用ツールとしてのC++の成功のためにきわめて重要だったのではないだろうか。
0970デフォルトの名無しさん
2006/07/16(日) 23:04:58君、何か大きな勘違いをしてるよ
0971デフォルトの名無しさん
2006/07/16(日) 23:07:440972968
2006/07/16(日) 23:35:14外部インクルードガードって、ヘッダ内のガードを外でも検査するガードのことじゃないの?
確かに >>967 で #include の後にもう一度 #define しているのは辻褄が合わないな。
どうも勘違いをしているのかもしれない。
そう思って今一度 Google に聞いてみたが、 >>967 の例がおかしいんじゃないかと思った。
0973デフォルトの名無しさん
2006/07/16(日) 23:40:01#ifndef FOO_H_INCLUDE_
#include "foo.h"
#define FOO_H_INCLUDE_
#endif
みたいなインクルードのしかたは頭悪すぎ、って話でしょう
0974デフォルトの名無しさん
2006/07/16(日) 23:44:450975デフォルトの名無しさん
2006/07/16(日) 23:50:140976デフォルトの名無しさん
2006/07/17(月) 00:00:34ヘッダ外部にガードを委託するべきでない、と
0977967
2006/07/17(月) 00:19:04すみません
本では内部インクルードを以下のように定義しています
---foo.h---
#ifndef インクルードガード名
#define インクルードガード名
//ここにヘッダファイルの中身を書く
#endif
で、この内部インクルードは置いておいて、
>>967のような外部インクルード[のみ]を使う方法について、
どうしてインクルードする側とインクルードされるヘッダ側に
インクルードガード名についての合意が必要なのかが
わからないのです
たとえばa.cppで
#ifndef FOO_
#include "foo.h"
#define FOO_
#endif
としてガード名をFOO_としてfoo.hをインクルードするとき、
foo.h側は別にガード名FOO_を知らなくても何も問題が
ないじゃないかと思ったのです
一体どこらへんが合意なのかと
>>968さんの回答が理解できません
上記の例ではfoo.h自体はインクルードガードをしていないのです
foo.h自身がするインクルードガードを内部インクルードガードと
呼んでいる様なのです
0978デフォルトの名無しさん
2006/07/17(月) 00:39:09外部インクルードガードのみを使う場合でも、すべての箇所で
同じガード名を使わないと意味ないから、ガード名について
妙なスコープでの統一が要るようになるのは確かだな。
何も問題がないとは言えないだろう。
翻訳が腐ってるとか、そんなオチだったりして。
0979デフォルトの名無しさん
2006/07/17(月) 00:42:59foo.hは次のようになっていて、
#ifndef FOO_
#define FOO_
/* ... */
#endif
hoge.cppは次のようにする。
#include "bar.h" //ここで既にfoo.hはインクルードされているかもしれない
#ifndef FOO_
#include "foo.h"
#define FOO_
#endif
hoge.cppはそのまま"foo.h"をインクルードすると、
大量の空行を読み込むことになる。それを気にするほどメモリがないから、
予めhoge.cpp側でFOO_が定義されているかどうかを調べるという具合。
で、hoge.cppのようなことはやめようというのが件の記述ではないか?
0980デフォルトの名無しさん
2006/07/17(月) 00:45:34あとね、外部インクルードガードの効果は、 #ifndef によって結局は無駄になる
ヘッダファイルの(ある意味物理的な)読み取りによるオーバーヘッドを避けるのが
よくある使用意図であって、外部インクルードガードだけを使うことなんて無いと思うよ。
この意図で多く使われるようになったが、コンパイラの実装によって
内部インクルードガードのパターンを認識してファイルの読み取り自体を
スキップするようなこともできるから、結局外部インクルードガードは無駄になる。
0981デフォルトの名無しさん
2006/07/17(月) 01:28:49多分それが正解。今手元にないから確かめられないけど、『大規模C++
ソフトウェアデザイン』に載ってた話。
で、理由がちょっと違ってて、大規模プロジェクトにおけるコンパイル時間を
短縮するために、external include guardも書きましょう、という話だったと思う。
10年前の本だからね。コンパイル時間も数時間、あるいは10時間を超える
ようなこともあたりまえだった。
だけど今では、external include guardを書かなくても、プリプロセッサが
読み込んだヘッダファイルを覚えていて、たとえ二重にインクルードしても
ディスクアクセスが発生しなくなったから、というのが理由だったと思う。
多分、多分で恐縮だけど、こんな話だったと思う。
0982981
2006/07/17(月) 01:30:180983デフォルトの名無しさん
2006/07/17(月) 02:03:26http://www.radiumsoftware.com/0403.html
冗長インクルードガード
0984v(^・^)v
2006/07/17(月) 03:13:46以下は次スレの準備に使わせてほしい。
相談は次スレが建つまで待ってくれ。
0985v(^・^)v
2006/07/17(月) 03:25:59反対意見があれば言ってほしい。ただし肯定意見や埋まりそうな気配があれば
以下の要領でさっさと建てるんであしからず。
>>6
ISO の規格を参照するなら open-std のサイトからダウンロードできる
最新のドラフトが pdf 内でリンク貼られててすごく見やすいと思った。
こっちがあれば怪しい kuzbass のやつはリンク削除してもおk?
CUJ へのリンクは更新してみようとしたけど、新しいとこは何か
見にくいサイトになってるんで要らないかも。削除おk?
[Dr. Dobb's Journal | C++ (was C/C++ Users Journal)]
http://www.ddj.com/dept/cpp/
cppll のリンクも確認のために見てみたけど、リンクに使われてる
バーの背景が見にくくて嫌だった。こっちも要らないかも。削除でおk?
>>11
実際の関連スレは多すぎ、 Boland C++ や C++ Builder のスレも復活してるし。
もう「スレタイ C++ で検索してくれ」でいいかな?
それでも Boost スレと GCC スレはヒットしないから、別途リンク貼る。
ATL/WTL は削除するつもり。
0986デフォルトの名無しさん
2006/07/17(月) 04:42:150987デフォルトの名無しさん
2006/07/17(月) 05:20:48リンク先のリンク先を流し読みしたところ、次のような記述がありました。
> I wrote a quick script to add redundant guards to all the source code
> and did a full build again. The number of includes reported by the compiler
> went down to 10,568 (from over 15,000). That means that there were about
> 5,000 redundant includes in a full build. However, the overall build time
> didn't change at all.
>
> Result: Zero. Apparently Visual Studio .NET 2003 (and probably most of
> the major compilers) does a pretty good job caching those includes by itself.
これは数百ファイルからなるプロジェクトをVS .NET 2003でビルドするときの
話なんですが、のべ15,000回を超えるincludeが、”冗長”guard(=external
include guard)をすることによって、10,568回に減ったそうです。
ところが、フルビルド時間は全く変わっていない。
このことから、VS .NET 2003ではincludeファイルの読み込みをうまくキャッシング
してるのであろうし、他のメジャーなコンパイラもそうであろうと結論付けています。
0988デフォルトの名無しさん
2006/07/17(月) 05:24:00業界にもたらしたんだと思う。
俺もこの本を読んだときに、脊髄に電気が走った記憶がある。
ただ、今となってはどんな内容だったのか思い出せないが・・・。
0989デフォルトの名無しさん
2006/07/17(月) 05:53:200990v(^・^)v
2006/07/17(月) 05:55:48C++相談室 part51
http://pc8.2ch.net/test/read.cgi/tech/1153079297/
削除した ATL/WTL スレが上がってたんで何事かと思ったが、
削除してよかったような気がした。
0992デフォルトの名無しさん
2006/07/17(月) 12:43:34config.hの中で外部インクルードガード風のコードが多用されています。
インクルードガードのように二度読み込むのを防ぐんじゃなくて、
プラットフォームの違いを吸収するのが目的だけど。
こういう目的以外には外部インクルードガード「風」はほとんどないんじゃないかと思います。
0993デフォルトの名無しさん
2006/07/17(月) 13:32:51どうして外部インクルードガード風のコードが
プラットフォームの差を吸収できるのか
もうちょっと
kwsk
0994デフォルトの名無しさん
2006/07/17(月) 13:52:35クロスコンパイル環境を作りたくて
glibcを直してたときに見たなー
実際に見た方が早いよ
0996デフォルトの名無しさん
2006/07/17(月) 16:13:270997デフォルトの名無しさん
2006/07/17(月) 16:20:220998デフォルトの名無しさん
2006/07/17(月) 16:28:530999デフォルトの名無しさん
2006/07/17(月) 16:31:091000デフォルトの名無しさん
2006/07/17(月) 16:32:1210011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。