C++相談室 part46
レス数が1000を超えています。これ以上書き込みはできません。
0001v(^・^)v
2006/01/08(日) 12:15:07ただし質問の前にはFAQに一通り目を通してください。
IDE(VC++など)などの使い方の質問はその開発環境のスレに
お願いします。
前スレ
C++相談室 part45
http://pc8.2ch.net/test/read.cgi/tech/1133007604/
0002デフォルトの名無しさん
2006/01/08(日) 12:15:462 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
0003v(^・^)v
2006/01/08(日) 12:16:5817 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/
0004v(^・^)v
2006/01/08(日) 12:17:2832 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/
0005v(^・^)v
2006/01/08(日) 12:18:02[C++ FAQ]
http://www.parashift.com/c++-faq-lite/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
Cとその仕様を比較しながらの解説なので分かりやすい。
***** 質問の前に必ずこの二つに目を通してください *****
[禿 Stroustrup]
http://www.research.att.com/~bs/
[C++ International Standard]
http://www.kuzbass.ru/docs/isocpp/
http://www.kuzbass.ru/docs/ansi_iso_iec_14882_1998.pdf
http://www.iso.org/iso/en/CatalogueDetailPage.CatalogueDetail?CSNUMBER=38110&ICS1=35&ICS2=60&ICS3=
[JTC1/SC22/WG21 - C++]
http://www.open-std.org/jtc1/sc22/wg21
[C/C++ Users Journal]
http://www.cuj.com/
[cppll (ML)]
http://www.trickpalace.net/cppll/ (日本語)
0006v(^・^)v
2006/01/08(日) 12:18:29amazon.com C,C++関連書籍
http://www.amazon.com/exec/obidos/tg/browse/-/3956/ref=br_bx_c_1_3/
The C++ Programming Language
http://www.amazon.com/exec/obidos/ASIN/0201700735/
http://www.amazon.co.jp/exec/obidos/ASIN/475611895X/ (翻訳)
C++ Primer (3rd Edition)
http://www.amazon.com/exec/obidos/ASIN/0201824701/
http://www.amazon.co.jp/exec/obidos/ASIN/4756140068/ (翻訳)
The C++ Standard Library
http://www.amazon.com/exec/obidos/ASIN/0201379260/
http://www.amazon.co.jp/exec/obidos/ASIN/4756137156/ (翻訳)
Effective C++
http://www.amazon.com/exec/obidos/ASIN/0201924889/
http://www.amazon.co.jp/exec/obidos/ASIN/4756118089/ (翻訳)
More Effective C++
http://www.amazon.com/exec/obidos/ASIN/020163371X/
http://www.amazon.co.jp/exec/obidos/ASIN/4756118534/ (翻訳)
Exceptional C++
http://www.amazon.com/exec/obidos/ASIN/0201615622/
http://www.amazon.co.jp/exec/obidos/ASIN/4894712709/ (翻訳)
More Exceptional C++
http://www.amazon.com/exec/obidos/ASIN/020170434X/
Exceptional C++ Style
http://www.amazon.com/exec/obidos/ASIN/0201760428/
0007v(^・^)v
2006/01/08(日) 12:19:06http://www.amazon.co.jp/exec/obidos/ASIN/0321113586/
http://www.amazon.co.jp/exec/obidos/ASIN/4894716860/(翻訳)
■Books(Templateまわり)■
Effective STL
http://www.amazon.com/exec/obidos/ASIN/0201749629/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714108/ (翻訳)
Modern C++ Design
http://www.amazon.com/exec/obidos/ASIN/0201704315/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714353/ (翻訳)
C++ Templates
http://www.amazon.com/exec/obidos/ASIN/0201734842/
C++ Template Metaprogramming
http://www.amazon.com/exec/obidos/ASIN/0321227255/
0008v(^・^)v
2006/01/08(日) 12:19:34[Boost]
Boost http://www.boost.org/
(日本語) http://www.kmonos.net/alang/boost/
(日本語) http://shinh.skr.jp/boost/
[STL]
STLport http://www.stlport.org/
SGI-STL http://www.sgi.com/tech/stl/
STLFilt http://www.bdsoft.com/tools/stlfilt.html
(日本語) http://www005.upp.so-net.ne.jp/episteme/html/stlprog/
(日本語) http://www.wakhok.ac.jp/~sumi/stl/
[Loki]
http://www.moderncppdesign.com/
LokiPort-MSVC7 http://www.geocities.com/rani_sharoni/LokiPort.html
LokiPort-MSVC6sp5 http://fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport
0009v(^・^)v
2006/01/08(日) 12:22:03【初心者歓迎】C/C++室 Ver.24【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1131691023/
【C++】STL(Standard Template Library)相談室 4
http://pc8.2ch.net/test/read.cgi/tech/1130680264/
C/C++の宿題を片付けます 56代目
http://pc8.2ch.net/test/read.cgi/tech/1135125328/
C/C++でのWindowsPrograming議論スレ(質問お断り)
http://pc8.2ch.net/test/read.cgi/tech/1049790146/
managed C++ やろうぜ!!
http://pc8.2ch.net/test/read.cgi/tech/1014486422/
【.NET】 C++/CLI について語ろうぜ 【最適】
http://pc8.2ch.net/test/read.cgi/tech/1126450441/
ATL/WTL Part4
http://pc8.2ch.net/test/read.cgi/tech/1134388951/
0010v(^・^)v
2006/01/08(日) 12:25:16環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
#include <stdafx.h>
後氏ね。
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
テンプレは以上です。足りない所、間違っている所がありましたら、追加訂正よろ。
0011デフォルトの名無しさん
2006/01/08(日) 12:44:581レスで一気にやったら面白みがないだろ。
0012デフォルトの名無しさん
2006/01/08(日) 12:46:240013デフォルトの名無しさん
2006/01/08(日) 12:48:00スマソ(´・ω・`)
レスを節約しようとしたんだけど。次回から別レスにするね。
0014デフォルトの名無しさん
2006/01/08(日) 12:48:10ところでBoostの日本語文書といえばcppllの翻訳を抜かしていいのか?
0015デフォルトの名無しさん
2006/01/08(日) 12:49:3444 http://pc8.2ch.net/test/read.cgi/tech/1128512737/
これ抜けてた。
0016デフォルトの名無しさん
2006/01/08(日) 12:51:45STLport http://stlport.sourceforge.net/
0017デフォルトの名無しさん
2006/01/09(月) 05:04:26class B{
public:
void func(void){}
B(void)
{
void (B::*p)(void);
// p=B::func;//エラー メンバー関数は呼び出すかそのアドレスをとらなければならない
}
};
class C{
public:
C(void){
void (B::*p)(void);
p=B::func;
}
};
int main(void){
B b;
C c;
void (B::*p)(void);
p=B::func;
return 0;
}
他のクラスやmain関数では上手くいくのに…納得できません
class Bのコンストラクタ内でBのメンバ関数ポインタの代入はできないのでしょうか
0018デフォルトの名無しさん
2006/01/09(月) 05:13:260019デフォルトの名無しさん
2006/01/09(月) 05:15:28それ、Borlandのコンパイラだろ。多分バグだよ。
gccだとちゃんとエラーが出るぞ。
0020デフォルトの名無しさん
2006/01/09(月) 05:23:59関数ポインタへの代入を全部p = &B::func;にしたらコンパイル通りました。
ありがとうございます。この書き方が正しいのですね。
…ではロベールさんとこの関数ポインタの書き方は、一体???
0021デフォルトの名無しさん
2006/01/09(月) 05:38:47間違ったサイトを見ずに、規格書を読め。
0022デフォルトの名無しさん
2006/01/09(月) 05:46:490023デフォルトの名無しさん
2006/01/09(月) 17:08:340024デフォルトの名無しさん
2006/01/09(月) 17:10:040025デフォルトの名無しさん
2006/01/09(月) 17:56:320026デフォルトの名無しさん
2006/01/10(火) 11:09:16ファイルストリームに変更して、
出力をファイルに落としています。
ofstream ofs("out.txt");
std::cerr.rdbuf(ofs.rdbuf());
場合によってはエラー出力を抑制したいことがあるのですが、
Windows なので /dev/null に出力するということもできません。
ヌルデバイスを表現するストリームというモノは
標準で用意されてるモノなのでしょうか?
0027デフォルトの名無しさん
2006/01/10(火) 12:00:37/dev/nullがあるから、標準では用意されなかったんだろ。
WindowsはNULにでも出すしかないな。
0028デフォルトの名無しさん
2006/01/10(火) 16:10:420029デフォルトの名無しさん
2006/01/10(火) 19:12:27相談です。
VC++でやってるんですけどね
ボタンを押したときはちゃんと別ウインドウに表示されるんです。
しかしエンターキーを押したときに用意した別ウインドウに表示されない。
そうとうこまって降ります。
case WM_KEYDOWN:
switch( wParam )
{
case VK_RETURN:
GetWindowText(hWndEdit2,sBuff,79);
SetWindowText(hWndEdit1,sBuff);
return TRUE;
}
return 0;
case ....以下続く
0030デフォルトの名無しさん
2006/01/10(火) 19:15:070031デフォルトの名無しさん
2006/01/10(火) 19:16:19なんですれ違いなのか理解不能だが
切々と語ってくれ
sageについては正直すまんかった
0032デフォルトの名無しさん
2006/01/10(火) 19:23:200033デフォルトの名無しさん
2006/01/10(火) 19:48:54技術系の板で質問でageるのは普通だろ。
0034デフォルトの名無しさん
2006/01/10(火) 19:51:57VBスレが上がっててもVB知らなきゃ答えられんし
0035デフォルトの名無しさん
2006/01/10(火) 20:01:570036デフォルトの名無しさん
2006/01/10(火) 20:11:36バッファをフラッシュしてくれるマニピュレータですが、
この改行文字は固定なのでしょうか?
CR/LF/CR+LF を何らかのフラグで切り替える
ということは出来ないでしょうか?
0037デフォルトの名無しさん
2006/01/10(火) 20:14:20もうsage強迫観念だよな、精神病の一種だw
なんでそんなになっちゃったんだろう
0038デフォルトの名無しさん
2006/01/10(火) 20:36:03坊主憎けりゃ袈裟まで憎い。
スレ違いに腹をたてたばかりに、ageまで憎く思えてしまいました。
ちなみに、>>31の
「言語と環境の区別くらい付けてくれ」は、いまいちでした。
「もっと適したスレがある」というべきでした。
反省しています。
0039デフォルトの名無しさん
2006/01/10(火) 20:45:12Win32API質問箱 Build39
http://pc8.2ch.net/test/read.cgi/tech/1136673250/
004036
2006/01/10(火) 20:51:34'\x0a' を出力するしかないのかなぁ。
004136
2006/01/10(火) 20:59:25std::endl は結局のところ "\n" を出力している
だけで、それを受けたストリームが
通常の '\n' の解釈にしたがって改行コードを
出力しているだけですね。
0042デフォルトの名無しさん
2006/01/10(火) 21:04:13UNIXだと普通に
\r CR
\n LF
だが
0043デフォルトの名無しさん
2006/01/10(火) 21:29:200044デフォルトの名無しさん
2006/01/10(火) 21:41:37出力文字 unix dos mac
\r \r \r \r
\n \n \r\n \r
\r\n \r\n \r\r\n \r\r
入力文字 unix dos mac
\r \r \r \n
\n \n \n \n
\r\n \r\n \n \n\n
0045デフォルトの名無しさん
2006/01/10(火) 21:59:33Perlなんかだと違ったりしているようなので気になった。
ttp://www.din.or.jp/~ohzaki/perl.htm#CRLF_Unify
0046デフォルトの名無しさん
2006/01/10(火) 22:00:10おおそうなっているのか
Winはdosと変わってないんだよね?
MacもOSXと昔のMacOSで変わってないのかな?
0047デフォルトの名無しさん
2006/01/10(火) 22:10:23UnixもDOSもMacもASCIIを使っているのでそのとおり。
ついでに言えばストリームをバイナリモードにすればどれもUnixと同じくそのままの文字が出力されるはず。
0048デフォルトの名無しさん
2006/01/10(火) 22:55:12なんとかtemplate内部で、そのポインタ型の、ポインタじゃないインスタンスを生成する方法ないすかねぇ。
int main(){
Hoge<int*> hoge;
hoge.create();
}
と、した時
template <class TPTR> class Hoge{
TPTR p;
void create(){
//ここで p = new int; としたいのですが……無理っすかねぇ。
}
}
最初からHoge<int>を前提としてtemplate書けって感じですが、そこをなんとか
0049デフォルトの名無しさん
2006/01/10(火) 22:56:000050デフォルトの名無しさん
2006/01/10(火) 23:02:37Hogeのテンプレート引数は必ずポインタ型であることが必要なら、
初めから元の型をテンプレート引数に取るようにするのが一番楽。
template <class T> class Hoge{
T *p;
void create(){
p = new T;
}
};
それが駄目ならboost::remove_pointer<T>
>>49
mainだけはintを返すように宣言してあり、なおかつreturnがなければ
return 0;が行われるという扱いがなされるから問題ない。
0051デフォルトの名無しさん
2006/01/10(火) 23:20:25レスありがとうございますx2
remove_pointerのソース観てみましたが、いやはやさっぱり分かりません。
もとからない自信が、すっかり無くなってしまいました。
やはりそうですよね…おとなしく書き直すことにします。変更個所オオス!!
0052デフォルトの名無しさん
2006/01/10(火) 23:43:40boost::remove_pointer<int *>::typeはintになっているという具合。
0053デフォルトの名無しさん
2006/01/11(水) 02:12:01{
char *str = new char[100];
char* retstr = str;
delete str;
return retstr;
};
こういう書きかたってマズイんでしょうか。
0054デフォルトの名無しさん
2006/01/11(水) 02:18:54返したretstrを何に使うの?
0055デフォルトの名無しさん
2006/01/11(水) 02:21:35ポインタが指すメモリにアクセスするつもりならマズイ。
deleteした時点でもう使えなくなっている。
ところで48が気になったのでremove_pointerを読んでみた。
それで48の望む動作をするコードが一応出来た。
template<typename T> struct remove_pointer
{
};
template<typename T> struct remove_pointer<T*>
{
     typedef T type;
};
template<typename TPTR> struct Hoge
{
     TPTR p;
     void create()
     {
         p = new remove_pointer<TPTR>::type;
     }
};
テンプレートに慣れていないせいなのかなんかキモイ。
やはり普通に元の型でやるべきだと思った。
005653
2006/01/11(水) 02:46:41コードに意味はなくなんとなく考えてみただけです。
有難うございました。
0057デフォルトの名無しさん
2006/01/11(水) 02:51:180058デフォルトの名無しさん
2006/01/11(水) 06:43:06実際にはコンパイラ(のランタイムライブラリ)によって変わるみたいだよ。
だから例えば同じ dos 環境下でも Microsoft のコンパイラで作成したプログラムと
Borland のコンパイラで作成したプログラムでは結果が違う。 >>4 の表のdosの欄は恐らく
Microsoft のコンパイラで作成したプログラムでの結果だろうけど、Borland のコンパイラで
作成したプログラムの場合、"\r\n" の出力結果は "\r\n" のままになる。
cf. http://www.trickpalace.net/cppll/reference/printf.htm ( このページの一番最後 )
0059デフォルトの名無しさん
2006/01/11(水) 06:50:530060デフォルトの名無しさん
2006/01/11(水) 12:22:58typename 付けないといけないです
template<typename TPTR> struct Hoge
{
TPTR p;
void create()
{
p = new typename remove_pointer<TPTR>::type;
}
};
0062デフォルトの名無しさん
2006/01/11(水) 19:58:30標準ライブラリの解説は、ここが参考になる。
//www.cc.nao.ac.jp/fsunman/japanese/C++/index.html
0063デフォルトの名無しさん
2006/01/11(水) 22:12:42うーん、凄い…ありがとうございます。
ここまで簡単に書いて頂いたのに、理解できない自分に絶望ですが。
何故こうなるんだろ…。奥が深いですねぇ(俺には)。
0064デフォルトの名無しさん
2006/01/12(木) 21:27:48テンプレートがもう少し使いやすい概念になってくれるとありがたいんだけどな。
0065デフォルトの名無しさん
2006/01/13(金) 01:29:52template<template<template<hoge>,hoge>,hoge> とかの
多段テンプレートってのはLispの書式に近いんだそうだが、
そのLispの書式がこれまたわけわからんかったりする。
0066デフォルトの名無しさん
2006/01/13(金) 01:47:240067デフォルトの名無しさん
2006/01/13(金) 02:04:24テンプレートクラスを1つの関数とみなして使う使い方も重要かと.
boost::mpl, boost::type_traits あたりは後者の見方がないと
なかなか使いこなせないように思うのですが.
0068デフォルトの名無しさん
2006/01/14(土) 01:44:4810.1 2.33 4.1 8 9.443
とかってあるとする。
こいつの最小桁は小数点何位かを知りたいんだけど、
簡単にやる方法ってあります?
上の数字列を入れると、
0.1 0.01 0.1 1 0.001
と得られると希望通りの動作。
ただし、1.20とかって数字のときにも、
0.1ではなく0.01が出ないと駄目。
0069デフォルトの名無しさん
2006/01/14(土) 01:53:38実験データひとつを、ひとつの文字列として読み出し、
文字列の後ろから小数点を検索して距離を調べ、
見つかれば距離に応じた値が答え。見つからなければ1。
C++関係無いな。
0070デフォルトの名無しさん
2006/01/14(土) 02:00:26scanf("%s.%[^ ]", null, po)
みたいな感じで読めそうだけどC++核のは面倒くさそうだな
0071デフォルトの名無しさん
2006/01/14(土) 02:01:18+ C++っぽく書く
0073デフォルトの名無しさん
2006/01/14(土) 09:54:190074デフォルトの名無しさん
2006/01/14(土) 10:25:150075デフォルトの名無しさん
2006/01/14(土) 12:08:000076デフォルトの名無しさん
2006/01/14(土) 13:26:20ただし、1.20とかって数字のときにも、
0.1ではなく0.01が出ないと駄目。
よく嫁
007768
2006/01/14(土) 15:21:06double GetPrecision(const string value)
{
int length = value.size();
int dotPos = value.find(".");
if(dotPos>=0) return pow(10., 1+dotPos-length);
else return 1.;
}
0078デフォルトの名無しさん
2006/01/14(土) 16:04:26const string&にしろよ。
0079デフォルトの名無しさん
2006/01/14(土) 16:06:29dotPosがsigned型であることと、return 1だな。
0080デフォルトの名無しさん
2006/01/14(土) 16:26:060081デフォルトの名無しさん
2006/01/14(土) 16:29:240082デフォルトの名無しさん
2006/01/14(土) 16:33:33・引数が値渡しである必要は無いので参照に。
・length は string のメンバ関数を使えばいい。
・find() の引数を長さ1の文字列ではなくひとつの文字に。
・dotPos を fin() の戻り値にあわせて string::size_type に。
・見つからない判定は string::npos で。
double GetPrecision(const string& value)
{
string::size_type const dotPos = value.find('.');
if(dotPos != string::npos) return pow(10, 1+dotPos-value.length());
else return 1;
}
008382
2006/01/14(土) 16:39:170084デフォルトの名無しさん
2006/01/14(土) 16:42:00for(;i>=0; i--)
008582
2006/01/14(土) 16:45:26double GetPrecision(const string& value)
{
string::size_type const dotPos = value.find('.');
if(dotPos != string::npos)
return pow(10,-static_cast<int>((value.length()-1)-dotPos));
else
return 1;
}
0086デフォルトの名無しさん
2006/01/14(土) 17:46:16stringのメンバlengthとsizeは全く同じだよ。好きなほうを選べばいい。
0087デフォルトの名無しさん
2006/01/14(土) 19:27:300088デフォルトの名無しさん
2006/01/14(土) 20:40:18なので不都合がおきてる
class Base {
public:
int x_, y_; //ここが問題
//できればこうしたい
// std::vector<int> xy; int &x_; int &y_;
//Base(int x , int y): xy(2),x_(xy[0]), y_(xy[1]){}
Base(int x , int y): x_(x), y_(y){}
int doSome() { return (x_*y_);}
};
けれど他人のライブラリなので変更できないので
派生クラスで解決しようとした
class Derived :public Base
{
public:
std::vector<int> xy; int &x_; int &y_;
Derived(int x , int y): xy(2),x_(xy[0]), y_(xy[1]){}
};
main()
{
Derived d(1,2)
d.doSome() ;// x_ * y_ = 1*2 が帰ってくるようにしたい。
}
けれどdoSome()はちゃんと動かない当然だけど
Baseを変更しないでメンバー関数doSome()を使う方法ないんでしょうか?
0089デフォルトの名無しさん
2006/01/14(土) 20:46:04Base b(1,2);
b.doSome();
これで不満な理由がわからんことには答えようが無い。
0090デフォルトの名無しさん
2006/01/14(土) 20:54:38func(int *p_xy){ return *p_xy + *(++p_xy) }
とかと同時に使いたい
0091デフォルトの名無しさん
2006/01/14(土) 20:59:24それは Base を使ってる限り無理だな。
ローカルな配列に一旦コピーして、後で戻すことができれば
同じ結果にできるだろうけど。
0092デフォルトの名無しさん
2006/01/14(土) 21:01:28> func(int *p_xy){ return *p_xy + *(++p_xy) }
これは未定義動作だな。メモリー上の連続性とか関係無しに。
0093デフォルトの名無しさん
2006/01/14(土) 21:01:47そういう阿呆なことをしようとするな。
0094デフォルトの名無しさん
2006/01/14(土) 21:02:20Base::x_しかみえんだろうが。
doSomeをオーバーライドしない限りどうしようもなかろうに。
0095デフォルトの名無しさん
2006/01/14(土) 21:14:44直前の副作用完了点から次の副作用完了点までの間で
同一オブジェクトに対して読み取りや変更が行われる回数は
高々1度でなければならないってのだっけ?よく覚えてないが。
0096デフォルトの名無しさん
2006/01/14(土) 21:20:11具体的に言ってしまえば*p_xyと*(++p_xy)のどちらが
先に評価されるか未定義になってる。
0097デフォルトの名無しさん
2006/01/14(土) 23:41:160098デフォルトの名無しさん
2006/01/14(土) 23:53:580099デフォルトの名無しさん
2006/01/14(土) 23:58:020100デフォルトの名無しさん
2006/01/15(日) 04:46:16ICU?iconv?std::codecvt?
オレはICUで落ち着きそうなんだが
いい方法、ナイスライブラリがあったら教えて
0101デフォルトの名無しさん
2006/01/15(日) 11:13:08std::string s1,s2;
std::cin >> s1 >> s2;
として aiueo を s1 に、12345 を s2 に格納したいのですが、
可能でしょうか?
0102デフォルトの名無しさん
2006/01/15(日) 11:26:490103デフォルトの名無しさん
2006/01/15(日) 11:44:32いままで scanf を使っていたのですが、
C++ のストリームを使う方が安全だし便利ですね。
0104デフォルトの名無しさん
2006/01/15(日) 11:54:22最近じゃCRTの可変長引数関数にタイプチェックあるんだっけ?
VC8.0限定だった気もするけど。
0105デフォルトの名無しさん
2006/01/15(日) 12:14:59その前にまず標準に準拠しろと
0106デフォルトの名無しさん
2006/01/15(日) 13:30:32scanf の方がむしろ書式文字列をパースする
必要があるので、コストつきそうな気もする。
0107デフォルトの名無しさん
2006/01/15(日) 13:47:01計測せずに言うな
0108デフォルトの名無しさん
2006/01/15(日) 14:05:27オレも ICU で落ち着いてる。つか、 ICU で良いんじゃね?
他の国際化の機能まで視野に入れると iconv より俄然強力だし
少なくとも std::codecvt よりはマシと思うw
0109デフォルトの名無しさん
2006/01/15(日) 15:11:31使ったことないけど挙げとく。暇ができたら趣味プログラムで使ってみる予定……
ttp://tricklib.com/cxx/ex/babel/
0110デフォルトの名無しさん
2006/01/15(日) 16:45:440111デフォルトの名無しさん
2006/01/15(日) 16:48:00long double
0112100
2006/01/15(日) 18:44:37iconv は手軽だけど char のみの対応
std::codecvt は使い方がよく判らん + C/C++ 各環境の実装が胡散臭い(wchar_t が 2byteとか)
ICU は大がかりだけど独自UChar に安心感が・・・
その結果で ICU に落ち着きそうな俺ガイル
詳しそうな人の意見が聞けて嬉しいなり
>>109
入れるの忘れてた
それも気になる気になる
レスどーもでした
参考になります、ありがとうございました
0113デフォルトの名無しさん
2006/01/15(日) 22:53:54そんなに本格的に文字コードを扱う必要がないのなら、codecvtで十分だとは思うけどね。
【C++】STL(Standard Template Library)相談室 4
http://pc8.2ch.net/test/read.cgi/tech/1130680264/622
0114デフォルトの名無しさん
2006/01/15(日) 23:08:090116デフォルトの名無しさん
2006/01/16(月) 06:49:32派生クラスのメンバ関数ポインタfuncをだけを元に
メンバ関数を呼び出すことはできませんか?
(this->*func)(param);とするわけにもいかず困っております。
(面倒くさいので、基底クラスでvirtual宣言したくないのです。)
もしくは、イベント処理を実装するのに
よいライブラリ、もしくはヒントでもいいのでありませんか?
boostですか?
0117デフォルトの名無しさん
2006/01/16(月) 06:54:50これが根本的に間違っていると思う。
0118デフォルトの名無しさん
2006/01/16(月) 10:24:42disable_if_c< is_class<X>, typedef A'>::type X;
などとすると Xが それ以前にtypedef されていない場合に
Xは定義さfれていません、と怒られます
0119デフォルトの名無しさん
2006/01/16(月) 11:19:02やりたいことはなんとなく想像尽くけど、別の方法を検討した方がいいと思う。
一番無難なのは、結局基底クラスにexecute関数をvirtualで持って、
派生クラスの内部で状態によって分岐だね。
派生した処理関数の呼び出し方にトリッキーな方法はいくらでもあるけど、
コンパイラの実装依存とかになりやすいし、変に複雑になるんなら
基本に立ち返るのが吉
0120デフォルトの名無しさん
2006/01/16(月) 19:08:02基本に立ち返ります。
0121デフォルトの名無しさん
2006/01/16(月) 19:10:23ただ、Boost や STL のコード中に紛れ込むと違和感は歩けど。
0122デフォルトの名無しさん
2006/01/16(月) 19:36:360123デフォルトの名無しさん
2006/01/16(月) 20:50:09派生じゃなくてテンプレートを使うのはどうかな?
//base
template class Events<class HandlerT>
{
void event1()
{
Handler::event1();
}
...
};
//derived
class Handler
{
void event1()
{
printf("event1");
}
...
};
Event<Handler> EventHandler;
0124デフォルトの名無しさん
2006/01/16(月) 20:51:010125デフォルトの名無しさん
2006/01/16(月) 23:59:11Boost なら Signals とかかな
0126デフォルトの名無しさん
2006/01/17(火) 20:52:19べたに処理を書くのではなく
type2 output1,output2;
DoSome1(type1 &input, type2 &output1);
DoSome2(type2 &output1, type2 &output2);
処理結果outputをclass内のメンバー変数として保持できる
class CDoSome1{
public:
type2 output1;
CDoSome1(type1 &input){output1 = ...}
};
class CDoSome2: public CDoSome1
{
public:
type2 output2;
CDoSome2(type1 &input):CDoSome1(input)
{output2 = ...}
};
というスタイルで処理しています。
けれどやっぱりべた書きのほうがいいのかとも悩んでます。
どちらのほうがいいのでしょうか?
0127デフォルトの名無しさん
2006/01/17(火) 21:02:07何か間違っている気がしてならない。
0128デフォルトの名無しさん
2006/01/17(火) 21:25:05delete this;
と自分自身を削除するのはアリなんでしょうか?
0129デフォルトの名無しさん
2006/01/17(火) 21:32:270130デフォルトの名無しさん
2006/01/17(火) 21:32:50そのコードを活かして type2 の替わりに CDoSome1 を使うと、
何らかの結果が格納されていることが保証できる。
それが利点にならないのなら、ほとんど無駄な感じ。
CDoSome2 辺りは、たぶん間違い。
一般的に、クラスが存在する意味を他の人にも
説明できないようなら、クラスを作るべきじゃない。
0131デフォルトの名無しさん
2006/01/17(火) 21:34:220132デフォルトの名無しさん
2006/01/17(火) 21:35:29最近俺も、戻り値が複数ある関数をクラス化してみたりしてる。
が、コンストラクタで処理を実行するのは如何なものか?
判りにくいから継承もするべきではないと思う。
0133デフォルトの名無しさん
2006/01/17(火) 23:29:37いつもクラス・構造体を返す関数にしている。
0134デフォルトの名無しさん
2006/01/17(火) 23:34:560135デフォルトの名無しさん
2006/01/18(水) 03:46:38どんな例外を投げるかとかを指定するべきでしょうか?
0136デフォルトの名無しさん
2006/01/18(水) 03:53:34例外仕様はむしろ避けるべき。
詳しくはC++ Coding Standardsの第75項あたりを参照のこと。
0137デフォルトの名無しさん
2006/01/18(水) 04:20:3732ドルくらいだし買うか、生協で。
その本の内容を読まずにレスするけど、
例外つかわないってのがトレンドなのか?
コンストラクタで例外投げるのは時々躊躇することがあるが。
0138デフォルトの名無しさん
2006/01/18(水) 04:22:11例外はむしろ使うべきだろ。
コンストラクタでは特に。
デストラクタで投げちゃいかんけど。
0139デフォルトの名無しさん
2006/01/18(水) 04:33:06C++ の規格に含まれる例外つー仕様は使うな、
ってことかと思た。
コンストラクタでの例外を投げるのを躊躇するってのは、
投げないって言う意味じゃなくてコンストラクタ内での
投げる場所について慎重になるって意味ね。
中途半端に初期化された状態ってのが怖くて。
ところで、いまさら何をですまんが、
例外でコンストラクタを抜けるときって
そのオブジェクトの *this について
デストラクタ呼ばれるんだっけ?
0140デフォルトの名無しさん
2006/01/18(水) 04:34:460141デフォルトの名無しさん
2006/01/18(水) 04:36:430142デフォルトの名無しさん
2006/01/18(水) 04:40:00> 中途半端に初期化された状態ってのが怖くて。
中途半端に初期化されたオブジェクトが使われることは絶対にないから安心しる。
0143デフォルトの名無しさん
2006/01/18(水) 04:48:43member1 = new char[100];
if (member1 == NULL) throw std::bad_alloc();
member2 = new char[200];
if (member2 == NULL) throw std::bad_alloc();
とかやるとまずいよなぁ、ってのが
コンストラクタ内での例外に慎重になってた原因の一つ。
0144デフォルトの名無しさん
2006/01/18(水) 04:50:06こわくない、こわくない、って自分に言い聞かせればいいのか?
0145デフォルトの名無しさん
2006/01/18(水) 07:34:31メンバ変数や派生元クラスのデストラクタは呼ばれる。
動的配列をメンバとして使いたければ std::vector にしとくとか。
0146デフォルトの名無しさん
2006/01/18(水) 08:33:19なんか、その「例外仕様」って用語、無茶苦茶紛らわしい命名だね。
いや、仮に、俺がその用語を命名する立場だったとしても同じような名前をつけてしまいそうだとは思うけど。
なんだかなぁ。
0147デフォルトの名無しさん
2006/01/18(水) 08:54:49class Hoge
{
boost::scoped_array<char> member1;
boost::scoped_array<char> member2;
public:
Hoge() : member1(new char[100]), member2(new char[100])
{}
};
としとけば、member2 の new が std::bad_alloc 投げても member1 の
デストラクタが呼ばれて member1 の char[100] も解放されるね。
0148デフォルトの名無しさん
2006/01/18(水) 09:27:10とくに効率が問題にならなければ std::vector を
使っておいたほうがいいんじゃないか?
class Hoge
{
std::vector<char> member1;
std::vector<char> member2;
public:
Hoge() : member1(100), member2(100)
{}
};
0149デフォルトの名無しさん
2006/01/18(水) 09:58:16今はそういうことを問題にしてるんじゃないんだけど。
0150デフォルトの名無しさん
2006/01/18(水) 12:25:20効率重視なら std::auto_ptr でよくないか?
これでもちゃんと開放されるだろ?
0151デフォルトの名無しさん
2006/01/18(水) 12:28:35>>147-149のように配列を構築したいときには駄目
auto_ptrが呼び出すのはdeleteだから。
配列の場合delete[]を呼ばないといけないですからね。
# 標準ライブラリにauto_ptrに対応するauto_arrayがないのが惜しまれる
0152デフォルトの名無しさん
2006/01/18(水) 12:29:570153デフォルトの名無しさん
2006/01/18(水) 12:36:310154デフォルトの名無しさん
2006/01/18(水) 12:39:02遅いからって嫌がる人もいるけど。
0155デフォルトの名無しさん
2006/01/18(水) 12:39:26boost::shared_array 使って書いていたみたいだ。
0156デフォルトの名無しさん
2006/01/18(水) 12:40:00Javaかわいそう
0157デフォルトの名無しさん
2006/01/18(水) 12:43:110158自分用メモ
2006/01/18(水) 12:47:25http://www.gotw.ca/publications/mill22.htm
http://www.tietew.jp/cppll/archive/7726
0159デフォルトの名無しさん
2006/01/18(水) 13:17:030160デフォルトの名無しさん
2006/01/18(水) 14:27:13int x;
xに値を代入(0から99)のときに、xが0から9までのときは、
00、01、、、09みたいに頭に0が付くように出力する簡単な方法はないでしょうか。
setwを使うと0が出ません。はじめにケタを調べればできますが、もっといい
方法はないでしょうか。
0161デフォルトの名無しさん
2006/01/18(水) 14:29:170162デフォルトの名無しさん
2006/01/18(水) 14:32:43throw をマクロで弄って __FILE__ と __LINE__ を例外オブジェクトに付加したり
catch されなくても自分で出した例外を throw の時点で全部ログに吐くなんて使い方もできるしなぁ。
まぁ、C++の規格的には予約語である throw をマクロで弄る時点で違法だけどw
0163デフォルトの名無しさん
2006/01/18(水) 14:34:31素直に printf 使おうぜ!
printf("%02.2d\n", x);
0164デフォルトの名無しさん
2006/01/18(水) 14:35:30"%02d"で十分な気が......
0165デフォルトの名無しさん
2006/01/18(水) 15:05:33予約語をマクロで弄ってはいけないなんて規定あったか?
0166デフォルトの名無しさん
2006/01/18(水) 15:28:38関数ポインタの型がそれぞれ違う場合、関数ポインタをコンテナのようなものでひとまとめに保持することは不可能でしょうか?
static const int EVENT1 = 0;
static const int EVENT2 = 1;
...
typedef int (*func) (int, int);
func funcArray[SIZE];
funcArray[EVENT1] = func1;
funcArray[EVENT2] = func2;
...
funcArray[EVENT1](10, 10);
と等価なようなことをやろうと思っているんですが、型が違う場合はポインタをバラバラに保持するしかないでしょうか?
0167デフォルトの名無しさん
2006/01/18(水) 15:34:32仮に型が違う関数ポインタをまとめてコンテナに入れられたとしても、
関数を呼び出すときには、適切な型にキャストしてやらなきゃならないんだから
別々に保持しても変わらないと思うが
0168デフォルトの名無しさん
2006/01/18(水) 15:44:12「型が違う」ってどの程度違う?
その例だと、(10, 10)で呼び出しているから、
・型はT (T1, T2)という形であり、
・int -> T1, int -> T2の暗黙の変換がある。
という条件を仮定している。
こういう条件があるなら、細かい型の違いを無視して
boost::function<void (int, int)>に入れられたと思う。
0169166
2006/01/18(水) 16:02:44やっぱり呼び出すときに型情報が要りますよね・・
intにマップしたEVENTXから関数ポインタの型を取得するようなtemplate書こうと思ったけど
結局そのテンプレートにアクセスするときに型が必要で意味なかった orz
>>168
ありがとう。でも引数の数と型から返り値の型まで違うんでboost::functionは無理そうです。
0170162
2006/01/18(水) 16:53:52バグベアードを作る時に違法じゃないか一応調べてさぁ
>17.4.3.1.1 マクロ名
>1 ヘッダ中でマクロとして定義された名前は,翻訳単位がそのヘッダを取り込んだ場合,いか
>なる用途に対しても,処理系用に予約する。
>2 ヘッダを取り込んだ翻訳単位は,そのヘッダ中で宣言又は定義された名前を定義するマクロを
>含んでいてはならない。更に,そのような翻訳単位は,字句的にキーワードと一致する名前をマ
>クロとして定義してはならない。
てなモノを見つけて、「キーワード(予約語)はマクロで定義するのは違法」って解釈したんだけど、
俺の解釈がなんか間違ってる?
# で、まぁ、違法と認識しつつ結局そのままバグベアードを作ったんだけどw
0171デフォルトの名無しさん
2006/01/18(水) 16:59:310172デフォルトの名無しさん
2006/01/18(水) 17:07:280173デフォルトの名無しさん
2006/01/18(水) 17:20:53知らなかった。サンクス
0174デフォルトの名無しさん
2006/01/18(水) 19:14:31検索結果を一覧で表示するプログラム
をc++builder6で作成するプログラムがわかりません。
どなたか教えてください。
0175デフォルトの名無しさん
2006/01/18(水) 19:17:500176デフォルトの名無しさん
2006/01/18(水) 19:20:38スレ違い
くだすれC++Builder(超初心者用)
http://pc8.2ch.net/test/read.cgi/tech/1117225464/
0177デフォルトの名無しさん
2006/01/18(水) 19:32:110178デフォルトの名無しさん
2006/01/18(水) 20:08:25「自作のデータベース」
これ大変な事だぞ。一から作れって言うのか。
BDE使ったらだめなのか。
0179デフォルトの名無しさん
2006/01/18(水) 20:09:44「プログラムをc++builder6で作成するプログラム」
これ大変な事だぞ。
0180デフォルトの名無しさん
2006/01/18(水) 20:12:270181デフォルトの名無しさん
2006/01/18(水) 23:08:47boost::tokenizer::iterator itで(特にコレに限らないけど)
func( *it++, *it );
だと引数の評価順序は不定でしたっけ?
0182デフォルトの名無しさん
2006/01/18(水) 23:20:270183デフォルトの名無しさん
2006/01/18(水) 23:24:16auto_array など要らない、って禿がゆってた。
ttp://www.research.att.com/~bs/bs_faq2.html#auto_ptr
0184デフォルトの名無しさん
2006/01/18(水) 23:28:260185デフォルトの名無しさん
2006/01/19(木) 13:51:07struct HogeComp{
int func(){ return 777; }
};
//hoge.h-------------------------------------------------------------
class HogeComp; //hoge_comp.hを伝染させないため、ヘッダではクラス宣言のみ
class Hoge{
HogeComp* hoge_comp; //本当はここは HogeComp hoge_comp; で良いのですが…
public:
Hoge();
~Hoge();
int func_comp();
};
//hoge.cpp-------------------------------------------------------------
#include "hoge.h"
#include "hoge_comp.h" //あえてこの順で
Hoge::Hoge() : hoge_comp( new HogeComp ){}
Hoge::~Hoge(){ delete hoge_comp; }
int Hoge::func_comp(){
return hoge_comp->func();
}
//main.h-------------------------------------------------------------
#include <iostream>
#include "Hoge.h"
int main(){
Hoge hoge;
std::cout << hoge.func_comp() << std::endl;
return 0;
}
hoge.cppでしか使わないhoge_compの宣言と実装とを、hoge.hを読み込む他のソースに伝染させないため
上のように書いています。この書き方はどうなんでしょうか。これではJavaっぽくて、C++の良さを失っていそうな気もします。
0186デフォルトの名無しさん
2006/01/19(木) 14:30:29Efficient C++だったかに、そういう実装のやり方について書いてあった。
ビルドに要する時間をできるだけ短くするために、そうすることもあると。
0187デフォルトの名無しさん
2006/01/19(木) 14:32:38良かった、オーソライズして頂き安心しました。
レスありがとうございました。
0188デフォルトの名無しさん
2006/01/19(木) 15:56:34>hoge.cppでしか使わないhoge_compの宣言と実装
分量にもよるけどhoge_comp.hの内容をhoge.cppに書いて
hoge_comp.hを無しにしてもいいかもね
0189uroko
2006/01/19(木) 16:59:25本の内容に関する質問はこのスレでもよいですか?
0190デフォルトの名無しさん
2006/01/19(木) 16:59:590191uroko
2006/01/19(木) 17:04:46質問します。よろしくです。
0192デフォルトの名無しさん
2006/01/19(木) 17:42:230193デフォルトの名無しさん
2006/01/19(木) 17:44:320194デフォルトの名無しさん
2006/01/19(木) 17:50:17構造体を用意してnewしたあと p_testにポインタで渡しているはずなのに
p_testの中のxとyに未定義の値と表示されそれを他の変数に代入すると
エラーが発生します。
CではエラーにならないのでC++では特別な書き方等あるのでしょうか?
すいませんがご教授お願いします。
typedef struct _POINT{
int x;
int y;
}POINT;
typedef struct _TEST{
int s;
POINT p;
}M_TEST;
int WINAPI WinMain(...){
TEST * test = new TEST;
POINT * p_test = &test->p;
...
0195194
2006/01/19(木) 17:52:25VC.net 2003です。先日までVC6.0を使用していました。
0196デフォルトの名無しさん
2006/01/19(木) 17:53:29たぶんコンパイラ・デバッガの仕業。
未初期化の変数の値を読み込もうとするとエラーにするコンパイラ・デバッガを俺は知っている。
0197194
2006/01/19(木) 17:58:28返答ありがとうございます。
一応ソースコードには間にZeroMemory関数を使用して初期化しているのですが
結局だめでした。
また関数にポインタも渡せなくて困っています・・・
0198196
2006/01/19(木) 17:58:44やっぱりそうだ。
VC++ .Net 2003では196のとおり。変数をきちんと初期化すれば良い。
ただの構造体をnewしただけでは初期化されない(0埋めなどされない)
0199196
2006/01/19(木) 18:01:13TEST * test = new TEST();
0200デフォルトの名無しさん
2006/01/19(木) 18:06:040201デフォルトの名無しさん
2006/01/19(木) 18:07:110202194
2006/01/19(木) 18:12:06>>199
ありがとうございました。
参考になります。
グローバル変数で
POINT * p_test;
を定義したら中身が見えるようになりました。
お騒がせしました。
あ、というか関数内で定義したポインタは中身見れないのは仕様なのですか?
0203デフォルトの名無しさん
2006/01/19(木) 19:10:21あなたがやろうとしていることは、C++の流儀には従っていないと思われる。
「こう書けばコンパイルが通るから」という理由で、グローバル変数にするのはやめた方がいい。
void f() {
TEST* test = new TEST();
}
この場合、TEST型へのポインタtestのスコープは、関数f()内である。
(厳密には、testが宣言された次の文から、関数の最後の}まで)
従って、この関数f()の外からtestにアクセスすることはできない。
複数の関数からtestをアクセスしたければ、次のようなオプションが取れる:
1. アクセスしたいすべての関数にtestへのポインタを渡す
2. 関連のある関数をまとめ、testと共にクラス化する
蛇足だが、ZeroMemory()を使うより、_POINT, _TESTのコンストラクタで初期化した方がいいと思う。
0204uroko
2006/01/20(金) 01:03:04質問1 (page x)
次のコードは、コンパイル時に評価を行うことができるassertマクロだそうです。
template<bool> struct CTAssert;
template<> struct CTAssert<true> {};
このCTAssertの使い方と、とういう状況のときに使うのかがわかりません。
(コンパイル時に評価をおこなう必要がある状況というのがわからない)
0205デフォルトの名無しさん
2006/01/20(金) 01:09:43「未定義の値」とはどこに表示されるのか?
他の変数に代入すると発生するエラーの内容(エラーメッセージ)は?
ソース貼るなら実際に動かしてるソース貼れ。
それから、コンパイル通るのぐらい確認しろ。
typedef struct _POINT {...} POINT; は C++ では struct POINT {...}; でいい。
C で使うにしても struct _POINT は struct POINT にしとけ。
>>202
「中身が見える」というのがどういう状態のことを言ってるのかわからん。
>>203
エスパー乙。
test のスコープは厳密には次の文からではなく test の直後から。
0206デフォルトの名無しさん
2006/01/20(金) 01:11:27ttp://www.kmonos.net/alang/boost/classes/static_assert.html
このあたりが参考になるかと
0207uroko
2006/01/20(金) 08:23:47ありがとうございます。よくわかりました。
0208デフォルトの名無しさん
2006/01/20(金) 15:22:15getusage() というものは有るのでしょうか?
昔、どこかのスレッドで同様の質問をしたときに、
getusage() 使え、という回答を頂いたのですが、
getusage() なる関数の使い方を見つけることが
できませんでした。 getusage() という関数は
実在するのでしょうか?
0209デフォルトの名無しさん
2006/01/20(金) 15:40:06C++標準にはない
これだけだと可哀想なのでフォローしておくと
君が探しているのはたぶん getrusage だろう
0210デフォルトの名無しさん
2006/01/20(金) 21:10:56int* foo( a(*)[ 定数式 ] ) ;
の形式でないと,コンパイラが受け取ってくれない..んですよね?
どうすればいいでしょうか?
できるだけ配列をグローバル変数にはしたくないのですが..
そのほうがオブジェクト指向の適うと思うんです.
<状況>
#include<iostream>
using namespace std ;
int* foo( ) ;
int main( void )
{
int n ; // 配列のサイズ
cin >> n ;
int a[ n ][ n ] ;
・・・ ・・・
int* foo( ) ; // 何とかして配列の先頭アドレスを渡したい
return 0 ;
}
int* foo( )
{
・・・ ・・・
}
0211デフォルトの名無しさん
2006/01/20(金) 21:14:42> int a[ n ][ n ] ;
これが既にダメ。
0212デフォルトの名無しさん
2006/01/20(金) 21:22:19いくつかの選択枝がある。
1. std::vector<std::vector<int> >
ただし、int[][]のようなメモリ上の連続性はないし、大きさの初期化が必要。
2. new
1.のデメリットに加えて、deleteが面倒くさい。
3. boost::multi_array
1.2.のデメリットはない。ただし、非標準。
4. その他
0213デフォルトの名無しさん
2006/01/20(金) 21:28:520214デフォルトの名無しさん
2006/01/20(金) 21:33:530215デフォルトの名無しさん
2006/01/20(金) 21:43:320216デフォルトの名無しさん
2006/01/20(金) 21:48:060217デフォルトの名無しさん
2006/01/20(金) 21:58:14int main(){
void * p = malloc(sizeof(int)*100);
((int[10][10])p)[1][2] = 3;
}
Cの話になりそうだけど、こういうことって出来ないの?
0218デフォルトの名無しさん
2006/01/20(金) 22:03:56それだと結局要素数は定数でなきゃいかんが。
0219デフォルトの名無しさん
2006/01/20(金) 22:19:20配列のポインタ使えばこんな多分こんな感じ。
0220デフォルトの名無しさん
2006/01/20(金) 22:22:410221デフォルトの名無しさん
2006/01/20(金) 22:27:00デリファレンスするのね。
#include<stdlib.h>
int main(){
typedef int arrint[10][10];
void * p = malloc(sizeof(int)*100);
(*(arrint*)p)[1][2] = 3; //OK
(*(int***)p)[1][2] =3; //error
((int**)p)[1][2] =3; //error
}
0222デフォルトの名無しさん
2006/01/20(金) 22:39:22使うときにはコンパイラはたとえリテラルが書き込まれてても
チェックしてくれないのね。。。当たり前か。
#include<stdio.h>
#include<stdlib.h>
int main(){
void * p = malloc(sizeof(int)*100);
//typedef int arrint[][]; //error
typedef int arrint[10][10];
(*(arrint*)p)[0][12] = 3; //OK
printf("%d\n",(*(arrint*)p)[1][2]);
}
0223デフォルトの名無しさん
2006/01/20(金) 23:22:126. std::vector<int>やnew int[n * n]など1次元配列を使う。
薄いラッパでもあれば結構使える。
>>217
たぶんreintepret_cast<int(&)[10][10]>(p)[1][2] = 3;ならいけるはず。
>>221-222
同様にreinterpret_cast<arrint&>(p)[0][12] = 3;や((arrint&)p)[0][12] = 3;とできるはず。
さらにnew arrintというようにはできないか?
しかしtypedefでそもそも要素数がコンパイル時に決定しているので本末転倒。
0224デフォルトの名無しさん
2006/01/21(土) 01:17:47{
size_t IndexSize=sizeof( void * )*x ;
void **p=malloc( IndexSize+size*x*y ) ;
void *pY=( char* )p+IndexSize ;
size_t i ;
for( i=0 ; i<x ; i++ ) p[i]=( char* )pY+i*y*size ;
return p ;
}
int **m ;
m=(int **)Alloc2(n-1,n-1,sizeof(int)) ;
こうやるとコンパイラに怒られます..
void* 型は void** 型に変換できない..と
どうしたものでしょうか?Cでやった時には問題なかったんですが・・
0225デフォルトの名無しさん
2006/01/21(土) 01:21:57void **p=malloc( IndexSize+size*x*y );
↓
void **p=(void **)malloc( IndexSize+size*x*y ) ;
0226デフォルトの名無しさん
2006/01/21(土) 01:22:07void **p=(void**)malloc( IndexSize+size*x*y );
次からはどの行でエラーがでたのかちゃんと書こうな?
0227デフォルトの名無しさん
2006/01/21(土) 01:28:53typedef int arrint[10][10];
arrint * p = new(arrint);
この場合、gcc-3.4.4(cygwin)とVC++7.1の両方で上手くいきませんでした。勘違いしてますかね。
VC++
arrint.cpp(5) : error C2440: 'initializing' : cannot convert from 'int (*)[10]' to 'arrint (*)'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style
g++
arrint.cpp:5: error: cannot convert `int (*)[10]' to `int (*)[10][10]' in initialization
また配列に対する代入および参照のところでgccのだけは挙動がおかしいかったです。VC++では完璧。
(*(arrint*)p)[0][12] = 3; //OK
//((arrint&)p)[0][12] = 3; //gccでは0になる
//reinterpret_cast<arrint&>(p)[1][2] = 3; //gccでは0になる
std::cout << (*(arrint*)p)[1][2] << std::endl; //代入した値を取得できる
//std::cout << ((arrint&)p)[1][2] << std::endl; //なぜか5になる。
//std::cout << reinterpret_cast<arrint&>(p)[1][2] << std::endl; //なぜか5になる。
0228デフォルトの名無しさん
2006/01/21(土) 01:33:56おおーっ!!やっぱりベテランは違いますね!
どうもありがとうございます!m(_._.)m
作ったプログラムが無事にコンパイルできました!
0229デフォルトの名無しさん
2006/01/21(土) 02:24:48初期化がコンパイル通ってないのに挙動が確認できるのか?
ポインタを参照に reinterpret_cast して挙動がおかしいのは当たり前。
0230デフォルトの名無しさん
2006/01/21(土) 02:29:30だからboost::multi_arrayを使えと。
0231デフォルトの名無しさん
2006/01/21(土) 02:34:57#include<cstdlib>
#include<iostream>
using namespace std;
int main(){
typedef int arrint[10][10];
arrint * p = (arrint *)malloc(sizeof(arrint));
(*(arrint*)p)[0][12] = 12; //OK
((arrint&)p)[0][13] = 13; //OK
reinterpret_cast<arrint&>(p)[0][14] = 14;
cout << "(*(arrint*)p)[1][2] " << (*(arrint*)p)[1][2] << endl;
cout << "(*(arrint*)p)[1][3] " << (*(arrint*)p)[1][3] << endl;
cout << "(*(arrint*)p)[1][4] " << (*(arrint*)p)[1][4] << endl;
cout << "(*(arrint*)p)[0][12] " << (*(arrint*)p)[0][12] << endl;
cout << "(*(arrint*)p)[0][13] " << (*(arrint*)p)[0][13] << endl;
cout << "(*(arrint*)p)[0][14] " << (*(arrint*)p)[0][14] << endl;
0232デフォルトの名無しさん
2006/01/21(土) 02:35:46cout << "((arrint&)p)[1][3] " << ((arrint&)p)[1][3] << endl;
cout << "((arrint&)p)[1][4] " << ((arrint&)p)[1][4] << endl;
cout << "((arrint&)p)[0][12] " << ((arrint&)p)[0][12] << endl;
cout << "((arrint&)p)[0][13] " << ((arrint&)p)[0][13] << endl;
cout << "((arrint&)p)[0][14] " << ((arrint&)p)[0][14] << endl;
cout << "reinterpret_cast<arrint&>(p)[1][2] " << reinterpret_cast<arrint&>(p)[1][2] << endl;
cout << "reinterpret_cast<arrint&>(p)[1][3] " << reinterpret_cast<arrint&>(p)[1][3] << endl;
cout << "reinterpret_cast<arrint&>(p)[1][4] " << reinterpret_cast<arrint&>(p)[1][4] << endl;
cout << "reinterpret_cast<arrint&>(p)[0][12] " << reinterpret_cast<arrint&>(p)[0][12] << endl;
cout << "reinterpret_cast<arrint&>(p)[0][13] " << reinterpret_cast<arrint&>(p)[0][13] << endl;
cout << "reinterpret_cast<arrint&>(p)[0][14] " << reinterpret_cast<arrint&>(p)[0][14] << endl;
}
0233デフォルトの名無しさん
2006/01/21(土) 02:39:35こんなんじゃダメなの?(行数詰めたから見難いけど)
template <typename T> struct array_2d {
T* data_; int size1_, size2_;
array_2d(int size1, int size2) : data_(new T[size1 * size2]) , size1_(size1), size2_(size2){}
~array_2d() {delete[] data_;}
struct proxy {
array_2d* parent_; int offset_;
proxy(array_2d* parent, int offset) : parent_(parent), offset_(offset) {}
operator T*() {return parent_->data_ + offset_;}
};
proxy operator[](int x) {return proxy(this, size2_ * x);}
};
template <typename T> void assign(T& a) {
for (int i = 0; i < 2; ++i) for (int j = 0; j < 3; ++j) a[i][j] = 10 * i + j;
}
#include <iostream>
int main() {
array_2d<int> a(2, 3); assign(a);
for (int i = 0; i < 6; ++i) std::cout << a.data_[i] << ' ';
std::cout << std::endl;
int b[2][3]; assign(b);
for (int i = 0; i < 6; ++i) std::cout << reinterpret_cast<int*>(b)[i] << ' ';
std::cout << std::endl;
return 0;
}
0234デフォルトの名無しさん
2006/01/21(土) 02:43:15あ、俺は210じゃないっす。ただの通りすがりの暇人ですw
>>229
>ポインタを参照に reinterpret_cast して挙動がおかしいのは当たり前。
あーこれはだめなんですか。未定義の部類になるのかな。じゃあgccとVCで結果が違って当たり前ですね。
0235デフォルトの名無しさん
2006/01/21(土) 07:17:46class X
{
public:
virtual void func1() {};
virtual void func2() {};
virtual void func3() {};
};
のような場合、func1()について0、func2()について4(32ビットシステムの場合)、func3()について8が得られる書き方ですが・・・
あと、インスタンスのVtblのアドレスを得るにはどうしたらよいのでしょうか?
X x;
printf("%X\n", *(void **)&x);
こんな書き方しかないのでしょうか?
0236デフォルトの名無しさん
2006/01/21(土) 07:57:42処理系依存
確実に取得したいなら自前で仮想関数テーブルをエミュレートするしかない
0237デフォルトの名無しさん
2006/01/21(土) 09:02:30諦めてメンバへのポインタを普通に使え。
0238デフォルトの名無しさん
2006/01/21(土) 14:06:53要するに p は配列を指すポインタであるので、
配列を指す参照にキャストしてしまうと、間接参照のレベルが一段ずれてしまう。
配列を指す参照を用いるなら
((int (&) [10][10]) (*p)) [1][2] = 3; が正解
0239デフォルトの名無しさん
2006/01/21(土) 20:52:20当然規格はその結果を保証してないよね?
0240デフォルトの名無しさん
2006/01/21(土) 23:45:36外部から見えないようにするために、namespace { } を使うのですが、
個人的に.cppにclassを書くので、class内部に実装もがんがん書くし
さらに内部structなんかを持たせる時もある、
なーんて事をしていると、(エディタでソース全体を整形することも多いので)
インデントが深くなってちょっと嫌な感じ。
で、
namespace {
namespace local {
class localclass;
}
}
class local::localclass { ... };
using local::localclass;
などという事を考えたのですが、
これ(無名のnamespaceのさらに内部のスコープだけを明示して使用)って合法ですか?
vc,bcc,gcc等でのコンパイルは問題ないみたいですが。
(未定義のstatic変数のエラーメッセージで確認)
0241デフォルトの名無しさん
2006/01/22(日) 00:23:46大丈夫だと思います。
0242デフォルトの名無しさん
2006/01/22(日) 00:27:58(質問の意図を思いっきり無視して)
namespaceでインデントしなければいい。
0243デフォルトの名無しさん
2006/01/22(日) 00:47:420244デフォルトの名無しさん
2006/01/22(日) 00:51:090245デフォルトの名無しさん
2006/01/22(日) 00:54:56どもです。
>>242
xyzzyでソース全体を整形すると、勝手にインデントしてしまうのですよ・・・
#includeを使って
"namespace hogehoge {" だけのファイルと
"}" だけのファイルを
先頭と最後に入れてごまかそうとした事も。
0246デフォルトの名無しさん
2006/01/22(日) 01:02:58> #includeを使って
インデントが深くなるよりもこっちの方が気持ち悪い。
0247デフォルトの名無しさん
2006/01/22(日) 01:03:380248デフォルトの名無しさん
2006/01/22(日) 01:17:17なぜそう思う?
malloc も operator new も 返す型は void* なんですが。
0249デフォルトの名無しさん
2006/01/22(日) 01:19:28ちょっと名前を汚して良いのなら
#define NAMESPACE_hogehoge namespace hogehoge {
#define END_OF_NAMESPACE_hogehoge }
とか?
0250デフォルトの名無しさん
2006/01/22(日) 02:00:03どうすればよいでしょうか?
A.OBJ : error LNK2005: "class B b" (?b@@3VB@@A) はすでに C.OBJ で定義されています
(A.h)
#include <stdio.h>
#include "B.h"
extern B b;
class A
{
};
(A.cpp)
#include "A.h"
B b;
int main()
{
return 0;
}
0251デフォルトの名無しさん
2006/01/22(日) 02:00:57class B
{
};
(B.cpp)
#include "B.h"
(C.h)
#include "B.h"
extern B b;
class C
{
};
(C.cpp)
#include "C.h"
B b;
0252デフォルトの名無しさん
2006/01/22(日) 02:04:010253デフォルトの名無しさん
2006/01/22(日) 02:04:14Bのクラス宣言だけをB.hppに残して、定義をB.cppに移動する。
0254デフォルトの名無しさん
2006/01/22(日) 02:06:25a.cpp と c.cpp から B b; を消して b.cpp に書いて、
a.h と c.h から extern B b; を消して b.h に書いとけ。
0255デフォルトの名無しさん
2006/01/22(日) 02:12:420256250
2006/01/22(日) 03:17:32(B.h)
class B {
public:
int hoge;
};
(C.h)
#include "B.h"
extern B b;
class C {
public:
void func();
};
(A.cpp)
#include "A.h"
//B b;
int main() {
b.hoge;
return 0;
}
(C.cpp)
#include "C.h"
B b;
void C::func() {
b.hoge;
}
これで使い方合ってるでしょうか?
0257250
2006/01/22(日) 03:19:03(B.h)
class B {
};
(B.cpp)
#include "B.h"
B b;
こうですか?
>>254
error C2146: 構文エラー : ';' が、識別子 'b' の前に必要です。
fatal error C1004: 予期せぬ EOF が検出されました。
コンパイルエラーになりました。
0258デフォルトの名無しさん
2006/01/22(日) 03:23:31あと氏ね。
0259デフォルトの名無しさん
2006/01/22(日) 03:34:370260デフォルトの名無しさん
2006/01/22(日) 03:50:39言葉が悪いな。それで教えているつもりか。
まぁヒントにすらなっていないが、
うむごくろう。
0261デフォルトの名無しさん
2006/01/22(日) 05:13:09気長にマターリ…ねみぃ。。。
0262デフォルトの名無しさん
2006/01/22(日) 05:24:47list<list<int>> l;
と>>の間にスペース入れなくてよくなりそうな感じだね。
0263デフォルトの名無しさん
2006/01/22(日) 07:58:000264デフォルトの名無しさん
2006/01/22(日) 08:06:400265デフォルトの名無しさん
2006/01/22(日) 08:15:540266デフォルトの名無しさん
2006/01/22(日) 08:23:470267デフォルトの名無しさん
2006/01/22(日) 08:24:57>>を1つのトークンと見なしちゃう
0268デフォルトの名無しさん
2006/01/22(日) 08:33:59パースできないってことか。
現代のコンパイラはレキシカルアナライザが分離してないのが当たり前?
0269デフォルトの名無しさん
2006/01/22(日) 09:15:031万桁とかの計算はどうするんですか?
型宣言でlong doubleまでは掛け算割り算できるけどそれ以上の仕方が分かりません
そこら辺も自作しないといけないんですk?
0270デフォルトの名無しさん
2006/01/22(日) 09:18:49自作するなりそこらに落ちてるライブラリを使うなりご自由に
0271デフォルトの名無しさん
2006/01/22(日) 09:21:42GNU多倍長整数ライブラリですか?
0272デフォルトの名無しさん
2006/01/22(日) 09:23:47GNU MP ライブラリでいいのか。
0273デフォルトの名無しさん
2006/01/22(日) 09:23:580274デフォルトの名無しさん
2006/01/22(日) 13:33:42話はそれからだ。
0275デフォルトの名無しさん
2006/01/22(日) 14:10:23exportはサポートしなくても標準に合致している事が保証されたから、
それはなかなか難しいだろう。
0276デフォルトの名無しさん
2006/01/22(日) 16:53:40それソースプリーズ
0277デフォルトの名無しさん
2006/01/22(日) 18:36:00callFunc関数で登録した関数をコールしたいのですが、以下のエラーで
コンパイルできません。コールの方法が間違っていますでしょうか?
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
func.cpp:
エラー E2314 func.cpp 49: 関数でないものを呼び出している(関数 Func::callFunc(st ::string) )
*** 1 errors in Compile ***
-- ここから --
class Func {
public:
void Init();
int callFunc(std::string);
private:
typedef int (Func::*PFUNC)(std::string);
std::vector<PFUNC> funcs;
int index;
int func1(std::string);
int func2(std::string);
};
0278デフォルトの名無しさん
2006/01/22(日) 18:36:37void Func::Init()
{
funcs.push_back(&Func::func1);
funcs.push_back(&Func::func2);
index=0;
}
int Func::func1(std::string str)
{
std::cout << "This is func1: " << str << "\n";
return 1;
}
int Func::func2(std::string str)
{
std::cout << "This is func2: " << str << "\n";
return 2;
}
int Func::callFunc(std::string str)
{
PFUNC pf = funcs[index++];
return (&pf)(str); // ここでエラー
}
0279デフォルトの名無しさん
2006/01/22(日) 18:45:50メンバ関数のポインタから関数呼び出しをするには、演算子 ->* または .* を使う。
> typedef int (Func::*PFUNC)(std::string);
この typedef ができるのに呼び出し方がわからないってのは、不思議な感じだな。
0280デフォルトの名無しさん
2006/01/22(日) 18:56:29ありがとうございます。277ですが、C言語は知っているので、
typedefはなんとなくわかっているつもりですが・・・。
>メンバ関数のポインタから関数呼び出しをするには、演算子 ->* または .* を使う。
すみません、具体的にどのように変更すればよいということですしょうか?
return (&pf)(str);を変更するということですよね?
0281デフォルトの名無しさん
2006/01/22(日) 19:02:35ちっとは調べてから訊こうな。
http://www.google.co.jp/search?q=%E3%83%A1%E3%83%B3%E3%83%90%E9%96%A2%E6%95%B0+%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF+%E6%BC%94%E7%AE%97%E5%AD%90
0282デフォルトの名無しさん
2006/01/22(日) 19:07:26すみません、君らと違って暇じゃないもので・・・
0283デフォルトの名無しさん
2006/01/22(日) 19:09:070284デフォルトの名無しさん
2006/01/22(日) 19:11:35コンパイルできますた。
return (this->*pf)(str);
でした。
0285デフォルトの名無しさん
2006/01/22(日) 19:27:400286デフォルトの名無しさん
2006/01/22(日) 22:40:10暇じゃないなら2chに書き込んで都合のいい回答を待つより
自分で調べた方がいいと思う。絶望的に調べ物が下手とかでないなら。
0287デフォルトの名無しさん
2006/01/22(日) 22:49:30禿本くらい読めアフォ
0288デフォルトの名無しさん
2006/01/22(日) 23:06:16いい加減起こるぞほんとに
0289デフォルトの名無しさん
2006/01/22(日) 23:49:370290デフォルトの名無しさん
2006/01/23(月) 00:10:53禿本なんてよまねーよ、カス
0291デフォルトの名無しさん
2006/01/23(月) 00:14:030292デフォルトの名無しさん
2006/01/23(月) 04:21:230293デフォルトの名無しさん
2006/01/23(月) 09:20:540294デフォルトの名無しさん
2006/01/23(月) 09:28:13四段ですが。別のところに載ってますか?
0295デフォルトの名無しさん
2006/01/23(月) 09:56:350296デフォルトの名無しさん
2006/01/23(月) 10:45:5115.5
0297デフォルトの名無しさん
2006/01/23(月) 11:50:47おっしゃる通りです。
読んで来ます。
>>296
禿しくThanXです。
0298Stroustrup
2006/01/23(月) 12:00:090299デフォルトの名無しさん
2006/01/23(月) 14:27:420300デフォルトの名無しさん
2006/01/23(月) 17:14:37お前も口先だけじゃないか。
0301デフォルトの名無しさん
2006/01/23(月) 19:48:36「禿本読め、コンパイラのマニュアル読め、コード読め。」
これらは相談スレ的には酷すぎんか?
「入門書読め」ならわかるが。
0302デフォルトの名無しさん
2006/01/23(月) 19:57:40そうだね、あんまり禿、禿、言うのはかわいそう。
0303デフォルトの名無しさん
2006/01/23(月) 20:00:59禿本は我慢して読むだけの価値があると教えているわけだが?
使い方1つで原価の1万倍くらい当たる本だぞ
0304デフォルトの名無しさん
2006/01/23(月) 21:13:35集中して読めば一週間で読了できるのに。理解が進むのはさらに後だとしても。
0305デフォルトの名無しさん
2006/01/23(月) 21:25:560306デフォルトの名無しさん
2006/01/23(月) 21:26:130307デフォルトの名無しさん
2006/01/23(月) 21:35:16なんだと、おれはちゃんと金もらうだけのことをやってるぞ!
0308デフォルトの名無しさん
2006/01/23(月) 21:37:13でも、もらってないんだろ? 満額
0309デフォルトの名無しさん
2006/01/23(月) 21:40:100310デフォルトの名無しさん
2006/01/23(月) 21:46:260311デフォルトの名無しさん
2006/01/23(月) 22:39:510312デフォルトの名無しさん
2006/01/23(月) 23:06:070313デフォルトの名無しさん
2006/01/23(月) 23:16:19(゚Д゚)ハァ?
0314デフォルトの名無しさん
2006/01/23(月) 23:52:03もらってますが何か?
0315デフォルトの名無しさん
2006/01/24(火) 00:24:470316デフォルトの名無しさん
2006/01/24(火) 09:26:410317デフォルトの名無しさん
2006/01/25(水) 08:57:53あれは何か新しいことが書いてあるの?
0318デフォルトの名無しさん
2006/01/25(水) 12:42:18http://public.research.att.com/~bs/bs_faq.html#SE
ハードカバーになり、その分値段が上がったこと以外の違いはない。
ただし、3rd ed.の初刷からは、記述ミスの修正が1000以上なされている。
0319デフォルトの名無しさん
2006/01/25(水) 12:58:51残念ながら不正解。直後の、
「As a heavy C++ user, I find that significant. There are also the two new appendices (just over 100 pages; available for download: Locales and Standard-Library Exception Safety).」
を見落としている。まぁダウンロードできるものだが。
0320デフォルトの名無しさん
2006/01/25(水) 13:23:24俺の禿本は持ちすぎて表紙が溶けかかってる
0321デフォルトの名無しさん
2006/01/25(水) 20:04:09prevやnextといったメンバを持たせたりするけど、C++の場合は
全てvectorやlistで管理するんですか?
0322デフォルトの名無しさん
2006/01/25(水) 20:08:05Cスタイルで書きたければCスタイルで書けばいい話じゃ?
0323デフォルトの名無しさん
2006/01/25(水) 20:23:33自分でわざわざ作る必要はないけど、
特殊なデータの保持の仕方をしたければ
自分で作ればいいんじゃない?
0324デフォルトの名無しさん
2006/01/25(水) 20:28:45STLの奴は全部、ある程度以上のパフォーマンスを出せることが
保証されてるわけだし
0325デフォルトの名無しさん
2006/01/25(水) 20:29:30STLを使うと
・素晴らしいアルゴリズムの恩恵を受けられる
・STLは世界共通
・例外安全
・速い
・メモリ領域に関して無駄に悩む必要がなくなる
他にもいろいろあるだろう。
自分で直線的なリスト形式を実装するのは、
Chain Of Responsivilityのときくらい。
0326デフォルトの名無しさん
2006/01/25(水) 20:38:44カリカリにチューンするならSTLは使わないけど。
0327デフォルトの名無しさん
2006/01/25(水) 20:55:26例えばリストなど、新規ノードの追加で必ずコピーコンストラクタが呼ばれる。
ポインタ型にすれば解決できるが、参照とサイズが無駄になる。
0328デフォルトの名無しさん
2006/01/25(水) 20:57:52マジでかりかりにチューンが必要な場合は、
スクラッチからコンテナを書くな。
最近コンテナ書いたのって、歯抜けを許すリングバッファかなぁ。
0329デフォルトの名無しさん
2006/01/25(水) 21:00:480330デフォルトの名無しさん
2006/01/25(水) 21:03:34マンコをチンポに合わせるんじゃない。
チンポをマンコに合わせるんだ。
0331デフォルトの名無しさん
2006/01/25(水) 23:55:08class A
{
private:
typedef int Hoge;
static Hoge aaa;
public:
class B
{
public:
B() { Hoge i = A::aaa; }
};
};
A::BがAのプライベートメンバにアクセスしても怒られないのですが
これは暗黙に friend class B; が宣言されると解釈していいのでしょうか?
0332デフォルトの名無しさん
2006/01/26(木) 00:00:37フレンドとは別物。
0333デフォルトの名無しさん
2006/01/26(木) 00:08:50いや、おかしいと思うぜ
C++ の規格では ill-formed でも診断メッセージの出力は義務づけないとされているケースが多いから
もしかして・・・とは思うが、それは自分で調べれ
0334デフォルトの名無しさん
2006/01/26(木) 00:12:06BはAのメンバなのだからAのprivateメンバにアクセスできて当然。
class Aの中に書いたものはネストしたクラスでも何でも全てAのメンバ。
0335デフォルトの名無しさん
2006/01/26(木) 00:15:410336デフォルトの名無しさん
2006/01/26(木) 00:25:110337デフォルトの名無しさん
2006/01/26(木) 00:33:29class A
{
private:
int i;
public:
class B
{
public:
B()
{
A a;
a.i = 0;
}
};
};
なんてのも通りました。コンパイラはVC++2003です。
0338デフォルトの名無しさん
2006/01/26(木) 01:08:09>A a;
>a.i = 0;
インスタンス化したらコンパイルされるのはあたりまえ。
0339デフォルトの名無しさん
2006/01/26(木) 01:28:47defect report でアクセスできるように決まった。
そんなわけで古いコンパイラだとアクセスできない。
なんか今 open-std.org が見れないんではっきりソースは出せない。
0340デフォルトの名無しさん
2006/01/26(木) 02:13:57BCC5.5.1とBCC5.6.4で変わってた覚えがあるから(どちらになったかは覚えてないが)
>>339の言う通りに違いないだろう、と俺は思う。
0341デフォルトの名無しさん
2006/01/26(木) 02:15:08まあとにかく、変わったって事で。
0342デフォルトの名無しさん
2006/01/26(木) 08:52:52これだな。
ttp://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#10
ttp://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#45
0343デフォルトの名無しさん
2006/01/27(金) 00:08:50com::example::cvs::mylib::hoge
とかにするのはどうよ??
0344デフォルトの名無しさん
2006/01/27(金) 00:12:360345デフォルトの名無しさん
2006/01/27(金) 00:22:24>>344 逆じゃね?
0346デフォルトの名無しさん
2006/01/27(金) 00:44:53tuple<int,int,double,double>
tuple<char,char,int>
みたいなクラスを自分で作りたいんだが。
いろんなところを調べると、
template<class T1,class T2,...,class TM>
class tuple;
みたいな書き方がされてるけど、当然のごとく
このままではコンパイル通らないし…
0347デフォルトの名無しさん
2006/01/27(金) 00:48:300348デフォルトの名無しさん
2006/01/27(金) 00:51:08真に可変長のテンプレート引数なんてものはできない。
デフォルトのクラス指定があって省略可能なだけ。
0349デフォルトの名無しさん
2006/01/27(金) 00:58:22なるほど。
可能な最大長で宣言されてて、デフォルト引数は無効を示す
型タグになってて、さらに無効な型タグによる特殊化をしてるんだね。
thx
0350デフォルトの名無しさん
2006/01/27(金) 01:30:13名前空間をユニークにするために
標準的に使われている名前付け規則ってある?
0351デフォルトの名無しさん
2006/01/27(金) 08:38:09C++ を純粋にオブジェクト指向言語としての恩恵を受けるだけのために
使いたいときに、STL や boost を使うともれなくジェネリックプログラミングの
世界に引きずり込まれてしまうのが何かイヤン。
テンプレートは分割コンパイルにも(メジャーなコンパイラは)対応してないし。
0352デフォルトの名無しさん
2006/01/27(金) 08:44:32なんか Java に影響されすぎだなw
実際問題、名前空間って作者(制作会社)の名前(ニックネーム)や
ソフトの名前が多いと思うけど、適当に付けて被ることそんなにあるかいな。
0353デフォルトの名無しさん
2006/01/27(金) 08:48:25というか、インクルードパスと名前空間とを統合した
新しいインポート規則とか便利じゃね?
って、それもJavaに影響され杉とか言われそうだな。
実際、Javaをそれほど使ってる訳じゃないんだが、
どうしてもグローバルにユニークな、ってのに
こだわってしまうんだよな。
それはむしろXMLの名前空間からの影響かも。
0354デフォルトの名無しさん
2006/01/27(金) 08:54:36プログラムを使うときまでクラスパス指定などでずっとついて回る問題だから、
世界規模でユニークというのを保証するのはまあ必要だと思う。
ただ C++ の場合は、一度コンパイル・リンクしてしまってネイティブコードに
なったら、名前空間もへったくれもないからなあ。
0355デフォルトの名無しさん
2006/01/27(金) 09:00:34ソースレベルの共有ならリファクタリングブラウザさえあれば問題起きないし
0356デフォルトの名無しさん
2006/01/27(金) 09:45:30STLのvectorとJavaのArrayListとで、
「ジェネリックプログラミングの世界」とやらの
複雑さは微塵も変わらんと思うんだが。
イテレータだって、その詳細を気にしなければ
ジェネリックプログラミングを意識する必要はないし。
C++ 0xでは、以下のように書けるようになるから
ますますSTLの記法の特殊性は減る。
vector<int> v = { 0, 1, 2, 3, 4 };
for( auto i = v.begin() ; i != v.end() ; ++i ){
cout << *i << endl;
}
0357デフォルトの名無しさん
2006/01/27(金) 10:03:240358デフォルトの名無しさん
2006/01/27(金) 15:32:370359デフォルトの名無しさん
2006/01/27(金) 15:43:00今年中に出せマヌケな禿め
0360デフォルトの名無しさん
2006/01/27(金) 15:48:50コーヒーでも飲んで落ち着け。
0361デフォルトの名無しさん
2006/01/27(金) 15:57:36{
A(T a, T b, T c);
T array[3];
};
というクラスで、コンストラクタの初期化でarrayを{a, b, c}に設定したいんですが
どうすればいいんでしょーか。
A::A(T a, T b, T c): array({a, b, c}) {}
A::A(T a, T b, T c): array[0](a), array[1](b), array[2](c) {}
とかやってみましたがエラーが出て終わりですよ!
0362デフォルトの名無しさん
2006/01/27(金) 16:00:17{
array[0] = a;
array[1] = b;
array[2] = c;
}
ってやるしかないと思うよ。
0363デフォルトの名無しさん
2006/01/27(金) 16:01:48サンクス!あきらめます!
0364デフォルトの名無しさん
2006/01/27(金) 16:27:32class Aのコンストラクタの引数に配列を取るようにしたら?
0365デフォルトの名無しさん
2006/01/27(金) 17:07:13class A
{
A(T a, T b, T c) : array0(a), array1(b), array2(c) {};
union {
T array[3];
struct {
T array0;
T array1;
T array2;
};
};
};
0366デフォルトの名無しさん
2006/01/27(金) 17:10:390367デフォルトの名無しさん
2006/01/27(金) 17:14:05それってPODにしか使えないからあまり価値なくね?
0368デフォルトの名無しさん
2006/01/27(金) 17:25:43無名共有体は独自拡張だから使いたくない代物であるのはわかってるけどね。
0369デフォルトの名無しさん
2006/01/27(金) 17:31:20あれ? Cでは独自拡張だけど、
C++では言語仕様として認められてたはずだけど
0370デフォルトの名無しさん
2006/01/27(金) 17:32:47規格何ページあたりかわかります?
0371デフォルトの名無しさん
2006/01/27(金) 17:33:23ゴメ。ぼけてた。
0373デフォルトの名無しさん
2006/01/27(金) 17:47:15C++でも独自拡張かと思ってた
0374デフォルトの名無しさん
2006/01/27(金) 18:44:31struct xxx {
...
char name[0];
};
のような、末尾のメンバのサイズを0に出来るというのも、
Cだと独自拡張でC++だと標準だったような気がするんだけど
どこかに載ってますかね?
0375デフォルトの名無しさん
2006/01/27(金) 18:57:430376デフォルトの名無しさん
2006/01/27(金) 18:59:540377デフォルトの名無しさん
2006/01/27(金) 19:11:29C99では、最後のメンバのサイズを0にするのではなく、
最後のメンバのサイズを省略できるらしいですね。
つまり、事実上ラベルとしてのみ使われるメンバを作れると。
0378デフォルトの名無しさん
2006/01/27(金) 20:26:29reference operator[](diff_type Off)
{ return *(*this + Off); }
と実装されてます。
これって一時オブジェクトの参照を返してるように見えるけど
合ってますか?
0379デフォルトの名無しさん
2006/01/27(金) 20:31:070380デフォルトの名無しさん
2006/01/27(金) 20:32:01それを実行するためのコマンドもわかっていたら
C++でCGIを呼び出す(?)ことは可能でしょうか?
0381デフォルトの名無しさん
2006/01/27(金) 20:32:45間違ってる。単に一時オブジェクトのメンバ関数を呼んでいるだけ。
return (*this + Off).operator*();
0382デフォルトの名無しさん
2006/01/27(金) 20:44:570383デフォルトの名無しさん
2006/01/27(金) 20:56:20ギャー、operator*(), operator+()を見直したらちゃんとメンバ変数の参照を返してました・・・
どうもありがとうございました。
0384デフォルトの名無しさん
2006/01/27(金) 21:35:48{
private:
void test( void )
{
}
};
template <class T> class B
{
private:
T t;
public:
void testB( void )
{
t.test();
}
};
main()
{
B<A> b;
b.testB();
}
っていうふうにtemplateクラスの関数から別クラスのプライベート関数を呼びたいんですが
どうすればよろしいでしょうか?
templateクラスじゃなければ普通にclass Aにfriend class B;を書けばいいと思うんですが…
おねがいしまつ。
0385デフォルトの名無しさん
2006/01/27(金) 21:43:55friend class B<A>;
0386デフォルトの名無しさん
2006/01/27(金) 21:49:530388デフォルトの名無しさん
2006/01/27(金) 22:13:02あと、どのコンテナがどんな操作をするとイテレータが無効になるか
書いてあるとこありませんでしょうか?
0389デフォルトの名無しさん
2006/01/27(金) 22:27:55作業用にコピーして使うとかそんな感じになると思う。
0390デフォルトの名無しさん
2006/01/27(金) 22:30:17内容を破壊しないソートってなんだよw
0391デフォルトの名無しさん
2006/01/27(金) 22:39:02ランダムアクセスイテレータを条件にしてるからlistに使えねーよw
それに内容を破壊しないんじゃなくてstable_sortは安定したソート。
0392デフォルトの名無しさん
2006/01/27(金) 22:41:38std::list のイテレータが無効になるのはイテレータが指す要素が削除されたときだけ。
ここ見れば全部分かるよ。
http://www.sgi.com/tech/stl/
0394デフォルトの名無しさん
2006/01/27(金) 22:49:070395デフォルトの名無しさん
2006/01/27(金) 22:54:380396デフォルトの名無しさん
2006/01/27(金) 23:03:33並び替える要素の中に等価のものがあっても、
元の順番と変わらない。
quick_sortは安定ではないために、
並び替える要素の中に等価のものがあったら、
元の順番と同じとは限らない。
0397デフォルトの名無しさん
2006/01/27(金) 23:30:060398デフォルトの名無しさん
2006/01/27(金) 23:58:09stable_sort がマージソートである保証はない.規定されてるのは安定であることと,
追加計算領域を使わない場合 O(n (log n)^2),追加計算領域を使う場合 O(n log n) であることだけ.
これを満たすマージ以外のソートには二分木ソートや,前処理付の不安定ソート群がある.
0399デフォルトの名無しさん
2006/01/28(土) 00:28:320400デフォルトの名無しさん
2006/01/28(土) 00:46:17yes
0401デフォルトの名無しさん
2006/01/28(土) 00:49:31C++的にはlistでも最も高速なやつを標準にして
stableを別個で実装するのが普通だと思うのだが
0402デフォルトの名無しさん
2006/01/28(土) 01:10:35もっとも速いsortがstableだっていうだけじゃねーの?
0403デフォルトの名無しさん
2006/01/28(土) 01:30:24class Ikimono()
class Tako : public Ikimono {
static int legs;
}
class Neko : public Ikimono {
static int legs;
}
int Tako::legs = 8;
int Neko::legs = 4;
こんな感じで派生したクラスでクラスに固有の値を設定しています。
聞きたいことは2つで
・上記より何かもっとうまい設計方法はないだろうか
・Ikimonoの派生クラスではlegsの定義を強要させる仕組みはできるか
アドバイスよろしくお願いします。
0404デフォルトの名無しさん
2006/01/28(土) 01:34:58class Ikimono {
virtual int legs() =0;
};
class Tako : public Ikimono {
int legs() { return 8; }
};
class Neko : public Ikimono {
int legs() { return 4; }
};
「うまい設計」かどうかは別として後者は満たしてると思うけど
0405デフォルトの名無しさん
2006/01/28(土) 01:47:41なるほど。
その手法思いついていたんだけど
Ikimonoをインスタンス化できなくなるのが嫌だなぁと思ってやらなかった。
でもあらためて出されてよく考えるとIkimonoをインスタンス化することなんてねーや。
ありが�d
0406デフォルトの名無しさん
2006/01/28(土) 01:47:57「何かもっとうまい」と言われてもわかんねーよ。
なにが不満なのか言ってもらわないと。
0407403
2006/01/28(土) 01:58:02いや、マジその通りでごめん。
コンパイル時に具体的なユニークナンバー(4とか8とか)を決定するのではなくて
実行時にダイナミックに設定する方法はないかなぁとぼんやり思って。
(今書いてるプログラムでは>>404で十分なんだけどね)
・実行時にクラス固有の値を設定することができる
・インスタンスを複数生成してもその値は1つでメモリに優しい
・templateを使うとどうなるのかな?
の3つが知りたい方法。
3つ目が馬鹿っぽいこと言ってるのはわかるけどtemplateって個人的に何か憧れるのよw
0408デフォルトの名無しさん
2006/01/28(土) 02:04:07C++にはフリーのO/Rマッピングライブラリは無いんでしょうか?
C++はDB扱うのにはむいてないですか?
0409デフォルトの名無しさん
2006/01/28(土) 02:22:45言語の向き不向きの問題ではない。自分で作れば?
0410デフォルトの名無しさん
2006/01/28(土) 02:26:28テンプレートを使ったら「実行時にダイナミックに設定する方法」じゃなくて
「コンパイル時に具体的なユニークナンバーを決定する」ことになるよ。
>>404の方法は、君の要件を完全に満たしている。
無理にテンプレートを使って実現するとすると
struct Ikimono
{
virtual int legs() = 0;
};
template<int N>
struct IkimonoN : public Ikimono
{
virtual int lets(){ return N; }
};
typedef IkimonoN<8> Tako;
typedef IkimonoN<4> Neko;
0412デフォルトの名無しさん
2006/01/28(土) 07:39:49単に表示させるのはできるのですが、void型ポインタなどに入れることができません。
どうキャストすればいいのでしょうか?
#include <stdio.h>
class X
{
public:
virtual func() = 0;
};
class Y : public X
{
public:
virtual func(){ return 1; };
};
void main()
{
X *px = new Y;
printf("%08X\n", &px->func); // これは一応できる
void *pv = (void *)&px->func; // これはエラー
int i = (int)&px->func; // これもエラー
}
0413ケッミュ
2006/01/28(土) 08:57:26Visual Studio 2005をつかいなさぁい!
0414デフォルトの名無しさん
2006/01/28(土) 09:02:120415デフォルトの名無しさん
2006/01/28(土) 09:15:37メンバ関数へのポインタだろ?
void* や int にキャストって、もしかしてそいつが4バイトとかって前提で考えてるか?
0416デフォルトの名無しさん
2006/01/28(土) 09:36:460417デフォルトの名無しさん
2006/01/28(土) 09:38:142003だとC2276になるんだけど。
0418enumのスコープ(?)
2006/01/28(土) 10:02:51public:
enum BBB {
ITEM1 = 1
};
enum CCC {
ITEM1 = 2
};
};
こうするとエラーになります。
AAA::BBB::ITEM1 と AAA:CCC:ITEM1 は区別される物ではなく、
むしろ両方 AAA::ITEM1 ということでしょうか?
0419デフォルトの名無しさん
2006/01/28(土) 10:13:07その通り。
0420デフォルトの名無しさん
2006/01/28(土) 12:13:37(STLの)stable_sortはマージソート
という意味
0421デフォルトの名無しさん
2006/01/28(土) 13:29:06だから、そのSTLにおいてstable_sortがマージソートでなければいけないって規定はないでしょって話でないの?
0422デフォルトの名無しさん
2006/01/28(土) 13:38:410423デフォルトの名無しさん
2006/01/28(土) 15:42:22標準C++ではできない。
普通はメンバへのポインタを使う。
ただ仮想関数のメンバへのポインタは気が利かせてあって、
きちんとポリモーフィズムが働く。
0424デフォルトの名無しさん
2006/01/28(土) 15:50:36エラーを表示させるウィンドウと、処理結果を表示させるウィンドウの二つに分けたいんですけど
そういうことは出来ないでしょうか?
簡単にウィンドウをもう一つ表示っていうのは難しいですかね?
初心者なんですみません。
0425デフォルトの名無しさん
2006/01/28(土) 15:54:03スレ違い。環境依存OKなスレへどうぞ
【初心者歓迎】C/C++室 Ver.24【環境依存OK】
ttp://pc8.2ch.net/test/read.cgi/tech/1135828083/l50
0426デフォルトの名無しさん
2006/01/28(土) 15:54:25環境依存なのでスレ違い。
ちなみにWindowsは1プロセス1コンソールと決まっているので
同一プロセス内で2個のコンソールを持つことはできないよ。
0427デフォルトの名無しさん
2006/01/28(土) 16:10:08std::cout と std::cerr を分ければいいじゃん。
ってところまでは環境非依存。
それぞれのストリームが実際にどこに行くかってのは環境依存。
俺なら std::cerr の rdbuf() に、エラーログ用に開いた
ofstream の rdbuf() をつっこんでエラーログに吐く。
0428デフォルトの名無しさん
2006/01/28(土) 16:46:25max の定義がおかしいようなのですが、どう直せばよいのか分かりません。
分かる方、詳しい方、お教えいただければ幸いに存じます。
class stack
{
private:
static int max;//ここがおかしいようです
int data[max];
int sp;
public:
void push(int d){ assert(sp<max); data[sp++] = d;}// データをプッシュ
void pop(){ assert(0<sp); --sp;}// データをポップ
bool empty() const{return sp == 0;}// スタックが空のとき true を返す
int top() const{return data[sp-1];}// スタックトップのデータを返す
int size() const{return sp;}// 現在格納されているデータ数を返す
stack::stack(int sz=100)// コンストラクタ
{
sp = 0;
max = sz;
data = new int[max];
}
stack::~stack() {delete [] data;}// デストラクタ
};
0429デフォルトの名無しさん
2006/01/28(土) 16:49:16C99ではdata[max]ってのは許容されてるが
C++でもよかったっけ?ダメだったと記憶してるが
素直にvector使え
っていうか、std::stack使え
0430デフォルトの名無しさん
2006/01/28(土) 16:50:59-static int max;//ここがおかしいようです
+int max;
-int data[max];
+int *data;
0431デフォルトの名無しさん
2006/01/28(土) 16:52:02宿題はよそでやりなさい。
0433デフォルトの名無しさん
2006/01/28(土) 19:14:49問題ないのかねえ。
0434デフォルトの名無しさん
2006/01/28(土) 21:57:040435デフォルトの名無しさん
2006/01/28(土) 22:03:470436デフォルトの名無しさん
2006/01/28(土) 22:34:30まぁそりゃ他の高級言語と比べたら低級な言語だからね。
スレも低レベルな話題になるのは仕方がないだろう
0437デフォルトの名無しさん
2006/01/28(土) 23:04:39メンバ関数へのポインタが void* に変換できない理由について
「低級な」説明ができないアフォがでかい面するところじゃねえよな
0438デフォルトの名無しさん
2006/01/28(土) 23:25:024バイトとか、そういうの関係ないだろ。
0439デフォルトの名無しさん
2006/01/28(土) 23:32:17自分ごと批判するってつらくね?
0440デフォルトの名無しさん
2006/01/28(土) 23:37:230441デフォルトの名無しさん
2006/01/28(土) 23:39:54それをやめろと言える場じゃないんで静観するが俺に言わせりゃ(ry
0442デフォルトの名無しさん
2006/01/28(土) 23:42:22何もしないで文句言ってる
真性のお馬鹿さんよりは1万倍マシ
0443デフォルトの名無しさん
2006/01/28(土) 23:48:090444デフォルトの名無しさん
2006/01/28(土) 23:54:26try{
hoge();
}
で、hoge()が例外を投げずにreturnできる場合の実行速度は、
tryブロックが無い時と比べて目立って落ちるのでしょうか?
もし囲むだけでも結構なコストがあるのなら、tryの乱発は避けて
ある程度場所を吟味せねばいかんのかな、という事を考えております。
0445デフォルトの名無しさん
2006/01/28(土) 23:56:03そんなもん自分で計れよ
0446デフォルトの名無しさん
2006/01/29(日) 00:02:22無理だよ
影響が大きくなりそうなテストパターンと
影響が小さそうなテストパターンが作れない者の
実験と称する無目的な奇行からは何も帰納できないよ
0447デフォルトの名無しさん
2006/01/29(日) 00:07:27参考までに。
0448デフォルトの名無しさん
2006/01/29(日) 00:24:01try で囲まなくても、デストラクタのあるローカルオブジェクトを作れば
巻き戻しのために try と同等のポイントができる。
ソースコード上に表れる try を避けるだけじゃ意味が無い。
で、ローカルオブジェクトの作成まで吟味してから決めるようだと
ほとんど本末転倒じゃないかな?
0449デフォルトの名無しさん
2006/01/29(日) 00:46:07class AAA {
private:
int a[10];
}
のようなクラスがあったとして A aaa;と宣言します。
ここからaaaのポインタを取得してprivateで宣言されてる変数にアクセス
することは可能ですか?
0450デフォルトの名無しさん
2006/01/29(日) 00:46:470451デフォルトの名無しさん
2006/01/29(日) 01:15:120452デフォルトの名無しさん
2006/01/29(日) 01:19:36#define private public
とすればいいやん。
0453デフォルトの名無しさん
2006/01/29(日) 01:22:09undeclared identifier 'A'.
0454デフォルトの名無しさん
2006/01/29(日) 01:26:31改めて言っておく。鼻から悪魔が(ry
#include <iostream>
class dummy {public:int a[10];};
class AAA {
public:
AAA(){for (int i = 0; i < 10; ++i) a[i] = i;}
private:
int a[10];
};
int main(void) {
AAA a;
int *pa = reinterpret_cast<dummy*>(&a)->a;
for (int i = 0; i < 10; ++i) std::cout << pa[i] << ' ';
std::cout << std::endl;
}
0455デフォルトの名無しさん
2006/01/29(日) 01:32:44そんなこと自体考えてはいけない
0456デフォルトの名無しさん
2006/01/29(日) 01:36:580457デフォルトの名無しさん
2006/01/29(日) 02:11:46前々からどうすべきなのか悩んでいることがあるので
皆さんならどうするのか質問させてください。
class A でコンストラクタで設定するパラメータとして、
多くの場合にはデフォルト値を使用するため、次のようにします。
class A
{
public:
static const int default_a;
A(int a = default_a) : a_(a) {}
private:
int a_;
};
他のクラスBやCでも同じようにします。
すると、このdefault_aとかdefault_bとかはほとんど変更しないため、
結果的にあちこちのクラスに定数が散らばってしまうことになります。
これの何が問題なのかというと、
結局クラスを利用する側ではほとんどデフォルト値だけを使用して、
たまにプログラム全体の挙動を変更させたい場合にだけ、
default_aとかの値自体を変更してコンパイルし直して
テストしたりするわけです。
その場合に、あちこちのファイルに回って、
default_hogeを変更するのが面倒だなあ、と。
0458457
2006/01/29(日) 02:12:52AやBやCを利用する側のクラスとかでまとめて定数を定義すれば
いいのかもしれませんが、
利用者側がクラスの定数を定義しているというのは変な気がします。
A,B,Cで共通のヘッダファイルを読み込ませるしかないのかもしれませんが、
このaとかbとかは、それぞれのクラス固有の情報なので、
別のところに定数が設定されてるのもなんだかなあ、という気がしますし、
A,B,Cとか、全く関連のないもの同同士の情報が一箇所に集まってるのも
どうかな、という気がします。
クラスの独立性を重視した場合、
A固有の情報である定数が、他の定数を定義してある部分と
同時に与えられるのはどうも気持ちが悪いというか。
A,B,C、みたいな書き方だと、なんかこいつら仲間みたいだから
一箇所で定義すればいいだろ、みたいに思えますが、
全く関連のないもの同士だと考えてください。
デフォルト値を一切しないで、利用する側で、適宜、
利用者側の定数(利用する側では、常にこの値を用いる)、
みたいなものを作る方法も考えましたが、
クラスA等を、複数の場面で利用する場合を考えると、
デフォルト値はあった方が便利な気がします。
すごく長くてすいません。
0459デフォルトの名無しさん
2006/01/29(日) 02:17:240460デフォルトの名無しさん
2006/01/29(日) 02:17:52難しい日本語でよくわからないが、たぶんそれはお前の都合でしか決められない。
0461デフォルトの名無しさん
2006/01/29(日) 02:19:22結局ちらばってしまうか、
共通ヘッダで何とかするか、
しかおもいつかない。
0462デフォルトの名無しさん
2006/01/29(日) 02:26:37class A
{
public:
A(int a = ::createDefault_a()) : a_(a) {}
private:
int a_;
};
で、クライアント側で、必ず「::createDefault_a()」を実装させる
0463デフォルトの名無しさん
2006/01/29(日) 02:27:33それがどうした
0464デフォルトの名無しさん
2006/01/29(日) 02:38:07>>457の悩みは解決してると思うが
0465デフォルトの名無しさん
2006/01/29(日) 02:42:41ちゃんとnamespace使ってれば。
0466457
2006/01/29(日) 02:43:30皆さんありがとうございます。
>>460
確かに自分でも、なんか無茶なことを言ってる気がしてきました。
自分がそのクラスをどう作りたいのか、によりますね。
>>462
それだと、AからZまでクラスがあったら、
クライアント側で26個関数を供給する必要があって
デフォルトどころか、逆に大変な気がします。
やっぱりうまい方法はないというか、無理な要求っぽいですね。
今後も悩み続けることにします…
0467デフォルトの名無しさん
2006/01/29(日) 02:48:07>クライアント側で26個関数を供給する必要があって
>デフォルトどころか、逆に大変な気がします。
・・・・・
そう言うもんな気がする
>クラスA等を、複数の場面で利用する場合を考えると、
これがしたいのなら尚更
0468デフォルトの名無しさん
2006/01/29(日) 02:59:37class ZENBU {
sratic int reateDefault_a() {
return 1;
}
}
template<class T=ZENBU>
class A
{
public:
A(int a = T::createDefault_a()) : a_(a) {}
private:
int a_;
};
0469457
2006/01/29(日) 03:22:42確かに、>>457-458で言ってたことは、
設計上のトレードオフで相反する要求を
同時に克服しようとしている感じで、
要求自体が矛盾してるという感じですね。
>>468
利用される異なる場面で、それぞれ異なるデフォルト値を与えることができ、
そのデフォルト値を用いて引数なしのコンストラクタが呼び出せる
ということで、利点はあると思いますが、
もう一段階メタなデフォルトの概念ができるというか、
結局 class ZENBU は共通ヘッダファイルと同じことのような気がします。
>>457-458
は、はじめはデフォルト値は変更しないものとして
利用されることを想定して設計したものが、
その後、変更したくなってしまったために面倒なことになった、ってことで、
設計がおかしい、って結論な気がします。
0470デフォルトの名無しさん
2006/01/29(日) 03:31:16同じなのは確か
>もう一段階メタな
それが狙い
唯、メソッドにしておくと、後々便利
プロパティファイルから取り込む変更とが楽
それから設計は、おかしくないと思う
実務っぽいAPLになってしまうけど
0471デフォルトの名無しさん
2006/01/29(日) 03:33:58class NANIKA : ZENBU{
static int createDefault_a(){//これ以外は標準のまま
return 2;
}
};
みたいに拡張したい部分だけかけることだな。
まぁ殆ど書き換えるときは大して変わらないけど。
0472デフォルトの名無しさん
2006/01/29(日) 06:06:29単純に引数デフォルト値の悪用じゃね?
デフォルト値を設定しなければ済む話じゃないの。
0473デフォルトの名無しさん
2006/01/29(日) 11:59:01俺ならconfig.h作って#includeだけどコンパイルが糞重くなるよなぁ
0474デフォルトの名無しさん
2006/01/29(日) 12:07:170475デフォルトの名無しさん
2006/01/29(日) 12:22:070476デフォルトの名無しさん
2006/01/30(月) 00:45:000477デフォルトの名無しさん
2006/01/30(月) 00:49:52一つのデータを表示する方法と、データを順に取り出す方法を組み合わせるといいよ。
0478デフォルトの名無しさん
2006/01/30(月) 00:54:47copy + ostream_iterator
# 正直このくらいなら直にループ書いたほうが楽な気もするけどなー
0479デフォルトの名無しさん
2006/01/30(月) 01:10:191. ループを書く
2. for_each()にファンクタを渡す
3. boost::lambdaを使う
4. C++/CLIでfor each構文を使う
C++では無名関数が使えないので、
どれもぱっとしないのだが
0481デフォルトの名無しさん
2006/01/30(月) 07:50:440482デフォルトの名無しさん
2006/01/30(月) 07:52:130483デフォルトの名無しさん
2006/01/30(月) 08:16:20欲しかったら自分で実装してね。
実行ファイルがいちいちインタプリタぶらさげる羽目になるけど。
そうでなくても共有ライブラリをうまく使えばましにはなるかもしれないね。
そうすると結局C++でなく他のインタプリタ言語を使っておけばよかったと後悔するわけだ。
0484デフォルトの名無しさん
2006/01/30(月) 08:39:57C++ は静的な型チェックを厳重にすることで、実行時の安全性を提供
することを大切なものだと考えているから、eval なんて動的な翻訳系は
提供できないのさ。たとえ実行時の自由度が低下したとしても、安全の
ほうが優先されるのさ。
0485デフォルトの名無しさん
2006/01/30(月) 12:41:26そんなこと言っておきながら、ホントはあったら嬉しいんでしょ?
まあ無名関数すらない現状じゃまだまだ先だろうけど。
>>484
evalと静的な型チェックって相反するものなの?
0486デフォルトの名無しさん
2006/01/30(月) 12:48:490487デフォルトの名無しさん
2006/01/30(月) 13:09:41コンパイラとインタプリタの違いから勉強しなさい。
0488デフォルトの名無しさん
2006/01/30(月) 13:20:14どんなインタプリタエンジンを組み込んだらいい?
Tcl系、Lisp/Scheme系、FORTH系とかいろいろあるけど、
サイズが小さくてよさげなものはなんだろ。
お勧めあったら教えて。
0489デフォルトの名無しさん
2006/01/30(月) 13:21:590490デフォルトの名無しさん
2006/01/30(月) 13:26:27全然
0491デフォルトの名無しさん
2006/01/30(月) 14:18:430492デフォルトの名無しさん
2006/01/30(月) 18:30:25普通STLのコンテナの解説にはforループのサンプルもついてくると思うが
0493デフォルトの名無しさん
2006/01/30(月) 18:33:280494デフォルトの名無しさん
2006/01/30(月) 18:55:440495デフォルトの名無しさん
2006/01/30(月) 19:33:360496デフォルトの名無しさん
2006/01/30(月) 19:34:190497デフォルトの名無しさん
2006/01/30(月) 21:46:02もし↑読んだ方いたら、他の初心者用のと比べてどうかなど指摘して欲しいのですが。
お願いします。
//不安な点の例) 「アドレス情報を保存しなさい」という問題→ちゃんと「住所」と訳してくれないと紛らわしい('A`)
0498デフォルトの名無しさん
2006/01/30(月) 21:51:280499デフォルトの名無しさん
2006/01/30(月) 22:00:45メッセンジャーソフト作れる?
0500デフォルトの名無しさん
2006/01/30(月) 22:03:58独習JAVAはウンコだった。
0501デフォルトの名無しさん
2006/01/30(月) 22:08:39そこは「アドレス」が通称なので気にしなくてよい。
0502デフォルトの名無しさん
2006/01/30(月) 22:27:41失礼、言葉足らずでスマソ
俺もポインタのだと思って、ちゃんと作ってから答え見たら
「street」とか「city」とかの情報を文字列で保存してあったのですよ・・・('A`)
訳書なので、独習CはよかたのにC++はイマイチなのかな、と
//問題原文一部→「名前とアドレス情報を保存するクラスを作成しなさい。クラスの非公開メンバ〜〜desplay()というなまえを付けます)。」
>>500
C&C++書いた人と、Java書いた人は違うみたいでした。
Javaもいつかやるかもだから、気をつけてみます
0503デフォルトの名無しさん
2006/01/30(月) 22:55:42>desplay()
それは酷いな
0504デフォルトの名無しさん
2006/01/30(月) 23:34:49ワラタ
0505デフォルトの名無しさん
2006/01/30(月) 23:53:54そこは、純粋に俺の誤植ですよ・・・('A`)
どうせもう買っちゃったわけだし、素直に全部読んでみます。
ありがとうございました
0506デフォルトの名無しさん
2006/01/31(火) 01:18:22どれでもいいと思う
0507デフォルトの名無しさん
2006/01/31(火) 04:04:380508デフォルトの名無しさん
2006/01/31(火) 04:12:100509デフォルトの名無しさん
2006/01/31(火) 04:21:240510デフォルトの名無しさん
2006/01/31(火) 04:23:45どれも定番のみ
0511デフォルトの名無しさん
2006/01/31(火) 04:37:27書き換えることは出来ますか?あるいは出来る場合と出来ない場合があるのでしょうか?
0512デフォルトの名無しさん
2006/01/31(火) 04:46:01独習C++は激しく読みづらかった
0513デフォルトの名無しさん
2006/01/31(火) 05:06:30あれ、結構内容浅いし。カバーしてる範囲は広いが。
0514デフォルトの名無しさん
2006/01/31(火) 05:16:080515デフォルトの名無しさん
2006/01/31(火) 05:30:55コピーコンストラクタの引数は決まってる。変更不可。
むしろ、変更したらコピーコンストラクタじゃなくなる、ってのが正しいかな。
0516デフォルトの名無しさん
2006/01/31(火) 06:42:190517デフォルトの名無しさん
2006/01/31(火) 06:55:19みんな以外と持ってない?
0518デフォルトの名無しさん
2006/01/31(火) 07:36:40More Effective C++
Effective STL
Modern C++ Design
D&E
この5冊があれば他にはいらない。
0519デフォルトの名無しさん
2006/01/31(火) 07:37:03今本棚見たら
・The C++ Programming Language
・Effective C++
・More Effective C++
・Effective STL
・Exceptional C++
・More Exceptional C++
・The C++ Standard Template Library
・Modern C++ Design
・Template Meta Programming
・The Annotated C++ Reference Manual
・Design and Evolution of C++
・Ruminations On C++
・Designing and Coding Reusable C++
が並んでた.一応10冊は超えてるけど,それでも10冊持ってるって相当のC++オタだと思うぞ.
(俺は研究上必要になったので揃えたんだが……)
0520デフォルトの名無しさん
2006/01/31(火) 07:55:54俺は英語読めないヘタレだから、
More Exceptional C++とか、
訳が糞らしいってだけで敬遠してる
More Effective C++は持ってない・・・
でもやっぱり買おうかどうか迷ってる。
でも持ってるだけで、難解すぎて読めてない本とか、
これから読む予定で予定は未定な本が半分くらいだったり
0521デフォルトの名無しさん
2006/01/31(火) 07:56:41D&E
Boost
偏ってるなぁ俺……
0522デフォルトの名無しさん
2006/01/31(火) 08:19:47More Exceptional C++の訳書って出てるの?
0523道化師
2006/01/31(火) 08:28:42JIS X 3014 や ISO/IEC 14882 の .pdf も数に含めていいですか?
...俺、初心者向けのも結構買ってたりするし数え方次第では20冊超えるかも。
>>519
`Д´)ノ ヲタ言うな!
あと、まだ上げられてないけど
国際規格<ISO> C++ライブラリ ハンドブック
...俺はこいつを地味に重宝してたりする。( ただし、オススメはしない。 )
0524デフォルトの名無しさん
2006/01/31(火) 10:13:59ピアソンエデュケーションが出しているC++本は鉄板。
持ってるのは、
Effective C++
Exceptional C++
Efficent C++
Modern C++ Design
Effective STL
STL 標準テンプレートライブラリによるC++プログラミング 第2版
C++ ネットワークプログラミング
初心者は Accelerated C++ 読んでおけ
0525デフォルトの名無しさん
2006/01/31(火) 11:00:18ネットと人に本を借りることでしのいでいる俺。
あと、一番役に立つのが自分が昔書いたコードだな。
しかしコードの全文検索って、ふつうの文書と同じように
全文検索してもうまく検索できないんだよな。
あとで検索することを考えたコメント書いておかないと。
0526デフォルトの名無しさん
2006/01/31(火) 12:03:000527デフォルトの名無しさん
2006/01/31(火) 15:54:11いや、出てないから持ってないって意味
0528デフォルトの名無しさん
2006/01/31(火) 17:16:420529デフォルトの名無しさん
2006/01/31(火) 17:19:30↑
規格票のくせにけっこう読みやすい
0530デフォルトの名無しさん
2006/01/31(火) 18:47:13hoge = (CHoge)hoge2;
と
hoge = CHoge(hoge2);
は
同じものだと解釈しているのですが、この認識は正しいでしょうか。
可能であれば上の場合と、下の場合で呼ばれるコンストラクタを変えたいのですが…可能でしょうか?
0531デフォルトの名無しさん
2006/01/31(火) 19:01:00その2つには違いがあると思います
前者はhoge2をCHoge型にキャストするので
((CHoge)hoge2)();と同様だと思う。コンストラクタではCHoge()が呼ばれる
後者はCHogeの引数を1つ取るコンストラクタが呼ばれる
0532デフォルトの名無しさん
2006/01/31(火) 19:09:58> ((CHoge)hoge2)();と同様だと思う。
・・・いや、それは違うだろう。
0533デフォルトの名無しさん
2006/01/31(火) 19:13:21お返事ありがとうございます。
ただ、引数をとるコンストラクタが呼ばれるようです。
今のところ両方とも
CHoge(const CHoge2& hoge);
が呼ばれます。
0534デフォルトの名無しさん
2006/01/31(火) 19:15:56CHoge が hoge2 の型を取るコンストラクタを持ったクラス型なら、
どっちでも同じになりそう。
CHoge と hoge2 の意味に前提が無ければ、ちょっとだけ違うような気がする。
後者は static_cast<CHoge>(hoge2) と同じ。
前者は static_csat がダメでも const_cast, reinterpret_cast になるかもしれない。
0535デフォルトの名無しさん
2006/01/31(火) 19:18:35試してみた結果、
hoge2 も CHoge 型だとすると
・(CHoge)hoge2 は何もしない。
・CHoge(hoge2) はコピーコンストラクタが呼ばれる。
hoge2 が CHoge 型ではないとすると
・(CHoge)hoge2 も CHoge(hoge2) も hoge2 の型を引数にとるコンストラクタが呼ばれる。
あとはどの場合も代入演算子のオーバーロード関数が呼ばれる。
0536デフォルトの名無しさん
2006/01/31(火) 19:22:34JAVAの記述法をC++で再現という(意味の無い、C++の理解を深めるための)アソビをしておりまして。
DataInputStream型 と InputStream型を作ったのですが困っていたのです。
dis = (DataInputStream)is;
とやれるように作った(ダウンキャストを再現)はいいのですが、DataInputStreamのコンストラクタには普通にInputStreamを引数にするものがあるのです。
(DataInputStream)で変換された場合は「そのまま内部ポインタをコピー」すればいいのですが、
InputStreamを普通に引数にとるコンストラクタなら「InputStreamに無くてDataInputStreamにあるデータの初期化」も必要となります。
これは手詰まりかな…。
0537デフォルトの名無しさん
2006/01/31(火) 19:26:500538デフォルトの名無しさん
2006/01/31(火) 20:53:10# コンストラクタに explicit の指定がないと曖昧だって言われてエラーになるような気もするけど。
0539デフォルトの名無しさん
2006/01/31(火) 21:52:52何もライブラリが利用できない環境でC++を利用したい場合(組み込みとかOS等)
C++の言語の機能(ライブラリは除く)をフルに使うには何を実装すればよいかの
情報ってどこかにありませんか?
例えばnewやdeleteの中身は実装しないとC++は利用できないですよね。
0540デフォルトの名無しさん
2006/01/31(火) 21:56:230541デフォルトの名無しさん
2006/01/31(火) 22:01:49規格書を読めば逆に何を実装しなければならないかと言うことは書いてある。
組み込みのような環境は自立処理系などと言う呼称で一部のライブラリだけ用意されていればよいことになっている。
0542デフォルトの名無しさん
2006/01/31(火) 23:16:11組み込みで例外処理を独自に実装するのは、
よほどのチャレンジャーじゃない限り現実的じゃないぞ
0543デフォルトの名無しさん
2006/02/01(水) 01:22:57using namespace std; していなくても、
getchar() とか普通に使えるんですが・・・
もちろん std::getchar() でも使えるんですけど、
これじゃグローバルにあるのと変わらない気がします。
std 名前空間だけ特別扱い??
0544デフォルトの名無しさん
2006/02/01(水) 01:24:400545デフォルトの名無しさん
2006/02/01(水) 01:31:14(つд⊂)ゴシゴシゴシ
_, ._
(;゚ Д゚) …!?
0546デフォルトの名無しさん
2006/02/01(水) 01:39:03#include <stdlib.h>
と
#include <cstdlib>
の区別はついてる?
0547デフォルトの名無しさん
2006/02/01(水) 01:41:31getchar() や ::getchar() が使えるんですが、
これは使用なんでしょうか?
0548デフォルトの名無しさん
2006/02/01(水) 01:44:43コンパイラは?まずはそこからだ
0549デフォルトの名無しさん
2006/02/01(水) 01:47:25#include <iostream>
int main(const int argc, const char* const argv[]){
std::cout << "えんたぁおして";
::getchar();
return EXIT_SUCCESS;
}
このコードが通るので、何でだろうと思いました。
Visual C++ 2005 を使っています。
0550デフォルトの名無しさん
2006/02/01(水) 02:00:17それはね、C++の規格書のmissなんだよ。現在では修正されていたはずだけど。
0551デフォルトの名無しさん
2006/02/01(水) 02:07:43#ifdef _STD_USING
#undef _STD_USING
#include <stdio.h>
#define _STD_USING
#else /* _STD_USING */
#include <stdio.h>
#endif /* _STD_USING */
"stdio.h"の内部に_STD_USINGに関する#ifディレクティヴなし。
意味あんのかこれ……。
0552デフォルトの名無しさん
2006/02/01(水) 02:13:01int main(const int argc, const char* const argv[]){
::getchar();
return EXIT_SUCCESS;
}
これだと getchar はグローバルな名前空間にないと怒られる。
Visual C++ 2005
0553デフォルトの名無しさん
2006/02/01(水) 02:21:55分かっているとは思うけど
cstdlibには標準入出力は定義されていない。
cstdioならグローバルな空間を汚染する。
>>549の場合iostreamが暗黙的にcstdioをincludeしてるから可能だった。
0554デフォルトの名無しさん
2006/02/01(水) 02:33:04cstdioはglobalに放り込むかなぁ
0555553
2006/02/01(水) 03:01:25グローバル空間を汚染しない実装も可能だけど現実の問題として
C/C++両方のヘッダを弄るのが面倒なので
stdio.hはCのままで
cstdlibで
#include<stdio.h>
namespace{
using ::getchar;
using ::putchar;
......
}
こんな感じの実装をしてるのが原因だな。
ちなみにVC以外の他の多くのコンパイラでも同じような状況。
だからC言語の名前とだけは、
ぶつからないように定義しとかないと問題が発生しやすい。
0556デフォルトの名無しさん
2006/02/01(水) 03:07:080557デフォルトの名無しさん
2006/02/01(水) 03:11:56「STLを使うと〜」のテンプレにみたいうまいことまとめてくれw
0558デフォルトの名無しさん
2006/02/01(水) 15:59:52int a[] = {0, 0, 0, 0};
のような {x, y, z}という初期化パラメータ記述は、独自クラスででも使えるのでしょうか?
使えるなら記述法を知りたいのです。
0559デフォルトの名無しさん
2006/02/01(水) 17:33:47コンストラクタがなくて、メンバが全てパブリックなクラスなら使える。
0560デフォルトの名無しさん
2006/02/01(水) 17:44:210561デフォルトの名無しさん
2006/02/01(水) 19:26:35文字列は文字列としてVectorなどに格納したいと思っています.
現在はとりあえず全てstring型に変換してvector<string>へ格納し,
そのつど数値かどうか判定し数値ならばatofなどで変換をしています.
そのつど変換したり判定したりする部分がちょっとややこしいので
できればそのまま格納してやりたいのですが何か良い方法はないでしょうか?
0562561
2006/02/01(水) 19:28:51すいません,簡潔に言うと,同じ1つのvectorに
複数の異なる型を入れたいと思っています.
vector<???> v;
v.push_back(10);
v.push_back('*');
v.push_back(23.5);
0563デフォルトの名無しさん
2006/02/01(水) 19:30:15boost::variant
0564デフォルトの名無しさん
2006/02/01(水) 19:31:18boost::any
0565561
2006/02/01(水) 19:40:42おお,便利そうですね.これで解決できそうです.
ありがとうございました.
0566デフォルトの名無しさん
2006/02/01(水) 19:45:39(保守・教育双方の観点から)
細かい事情が分からないからあまり突っ込んだことは言えないが
0568デフォルトの名無しさん
2006/02/01(水) 20:34:100569デフォルトの名無しさん
2006/02/01(水) 20:35:520570デフォルトの名無しさん
2006/02/01(水) 21:10:410571デフォルトの名無しさん
2006/02/01(水) 21:39:420572デフォルトの名無しさん
2006/02/01(水) 22:49:130573デフォルトの名無しさん
2006/02/01(水) 23:33:11ここは自分の本棚を晒すスレですか?
・The C++ Programming Language
・Effective C++
・More Effective C++
・Effective STL
・Exceptional C++
・The C++ Standard Template Library
・Modern C++ Design
・Design and Evolution of C++
・C++ FAQ第2版
・C++ 再考
・C++ 標準的コーディング技法
・C++ Coding Standards
・Boost C++ Libraryプログラミング
・C++によるXML開発技法
・C++プログラミングの落とし穴
しかし、よくここまでよく揃えたものだ。
C++がお気に入りってのもあるけど。
でも、まだModern C++ Designは理解できない。orz
>>523
わーい、道化師さんだ〜!!
0574デフォルトの名無しさん
2006/02/02(木) 00:25:51便乗で質問しますが、
どういう風にクラスを作ればよいのか、とか、
継承や多重継承の有効な使い方を解説した本でお勧めはありませんか?
0575仕様書無しさん
2006/02/02(木) 00:30:33「オブジェクト指向のこころ」
0576デフォルトの名無しさん
2006/02/02(木) 00:35:54っていう初心者に一番最初に教えるべき事は
「まず、プログラムを新しく書かずに済む方法を考えろ」
0578デフォルトの名無しさん
2006/02/02(木) 00:41:09OOP的設計の仕方が分からんのか?
それなら憂鬱なryをお勧めする
わかりやすいし読んでて面白い
0580デフォルトの名無しさん
2006/02/02(木) 00:42:59やりたいことを明確にすれば、どういうクラスを書けばいいかわかるよ。
あとはある程度の量をこなさないと駄目だね。とにかく書く。
そのうち「あ、そういうことか」という瞬間が訪れるよ。
ま、やってみなはれ。
0581仕様書無しさん
2006/02/02(木) 00:44:280582デフォルトの名無しさん
2006/02/02(木) 00:47:53オブジェクト指向本って、Javaを念頭において書かれてるのが多くて
やたら継承を多用してたり、仮想関数や動的解決に依存した
スタイルだったりするよな。
でも、C++はそれとは逆にテンプレートと静的解決の
ジェネリックプログラミングに向かってるから、
C++の勉強でOOP本を薦めるのは痛し痒しってとこだな。
0583574
2006/02/02(木) 00:55:19今まで敬遠してきたboostが、ものすごく面白いライブラリに思えています。
ただ、boostの実装方法は、さっぱり理解できません。
ソースを読んでもさっぱり。
使う分には、簡単なのですが。
0585デフォルトの名無しさん
2006/02/02(木) 01:02:550586デフォルトの名無しさん
2006/02/02(木) 01:05:490587デフォルトの名無しさん
2006/02/02(木) 01:18:43ジェネリックプログラミングで静的にも解決させたほうがいい場面もある、って流れだろ?
基本文法→オブジェクト指向→ジェネリックって流れがいいと思うけどなぁ
0588デフォルトの名無しさん
2006/02/02(木) 01:35:05C++まで行くか知らないが
ttp://libc.blog47.fc2.com/
とか…?
0589デフォルトの名無しさん
2006/02/02(木) 09:56:21それ、読んでみたいけど、日本語版はまだないよね?
洋書でもいいんだけど、翻訳版が出そうな気がして手を出しづらい。
0590デフォルトの名無しさん
2006/02/02(木) 10:04:280591デフォルトの名無しさん
2006/02/02(木) 12:42:38:
const char* p = str.c_str();
strが変更や破棄されない限り、pが指す先が有効である事は保証されているのでしょうか?
localtimeの様にバッファを共有していて、別オブジェクトのc_str()呼び出しで
内容が変わったりする実装があったりするんでしょうか?
0592デフォルトの名無しさん
2006/02/02(木) 12:59:2921.3.5
ttp://www.kuzbass.ru/docs/isocpp/lib-strings.html#lib.basic.string
0593デフォルトの名無しさん
2006/02/02(木) 13:01:460594デフォルトの名無しさん
2006/02/02(木) 13:59:2321.3.5じゃなくて21.3.6ですよね?
>21.3.6 - basic_string string operations [lib.string.ops]
>-2- Requires:
>Nor shall the program treat the returned value as a valid pointer value
>after any subsequent call to a non-const member function of the class basic_string
>that designates the same object as this.
ここの部分の翻訳に自信が無いんですが
「同じオブジェクト」の非constメンバを呼ぶまでポインタは有効
ってことでいいんでしょうか?
0595デフォルトの名無しさん
2006/02/02(木) 15:24:2321.3.6 basic_string string operations [lib.string.ops]
プログラムは配列に格納された値のいずれも変更しないものとする。
また、プログラムは、(c_str()の呼び出し時の)thisと同じオブジェクトを指す
basic_stringクラスの非constメンバ関数に対して、
その後のどんな呼び出しの後にも有効なポインタ値として戻り値を扱わないものとする。
→ 非constメンバ関数が呼び出された後は有効でなくなる。constメンバ関数については未定義。
0596デフォルトの名無しさん
2006/02/02(木) 16:46:41マジっすか?
非constメンバ呼び出し→以前のc_str()で得たポインタは有効でなくなる
そうでないなら(constメンバ呼び出しなど)→以前のc_str()で得たポインタは有効のまま
と解釈できると思うんだけど。
0597デフォルトの名無しさん
2006/02/02(木) 20:05:54インスタンスをコピーしたインスタンスが書き換えられただけで無効になってしまうとかで
こんなんじゃ使いモンなるかー、ゴルァ(゚Д゚)って話を見た気がする・・・
確か、エピたんがSTLのヘッダのどこそこのオプション弄ればこの問題を回避できるとかって
言ってたようなとこまでは覚えてるんだけど・・・
かなり曖昧な記憶なんで、俺の記憶違いかも知れん。
0598デフォルトの名無しさん
2006/02/02(木) 21:16:48おそらくでないから。翻訳したところでマニアックな人にしか売れないから。
だから買おうね。
0599デフォルトの名無しさん
2006/02/02(木) 21:17:26constメンバ呼び出しなら変わらないと期待できそうだけれど、
実装の仕方によっては変わることもあり得る(効率のために)。
毎回c_str()を呼び出すか、自分が使用するコンパイラの実装を確認するしかないんじゃないかな。
0600デフォルトの名無しさん
2006/02/02(木) 23:53:480601デフォルトの名無しさん
2006/02/03(金) 00:30:040602591
2006/02/03(金) 00:45:12suffix arrayに登録するのに、文字列中の各文字へのポインタが必要なんですよ。
std::vector<char>にコピーして使えばいいんですけど
文字列を重複して持つ事になるのは嫌だったので。
0603デフォルトの名無しさん
2006/02/03(金) 08:39:51取り出せたら便利だなぁ、と思ったことがある。
結局 c_str() で取り出して(一時的に文字列を重複して持つ)、
すぐ std::string を破棄することにした。
っていうか、>>591 は c_str() で取り出した後も
ずっと std::string を保持し続ける必要があるの?
0604デフォルトの名無しさん
2006/02/03(金) 08:41:42std::string を受け取って c_str() 毎回呼び出すように
改造するとか、どうよ。
って、今度は std::string 自体が重複するようになるだけか。
そうすると boost::shared_ptr<std::string> とかか。
0605デフォルトの名無しさん
2006/02/03(金) 09:19:310606デフォルトの名無しさん
2006/02/03(金) 12:48:17std::basic_stringの、refcountを前提とした設計は、時代遅れ。
素直に毎回バイト列をコピーして、スレッド内でのconst性を
確保したほうがマシ。
0607デフォルトの名無しさん
2006/02/03(金) 18:10:55deep copy + fast allocation + 短文字列最適化 で
スレッド安全な参照カウント実装での速度に十分到達できるか,
場合によっては outperform できるらしいですしね.
ここら辺の議論は GotW あるいは"More Exceptional C++" で
具体的な数字出して比較されています.
http://www.gotw.ca/publications/optimizations.htm
suffix array のような使い方だと,空間的な効率も似たりよったりか,
場合によっては deep copy の方が高効率かも知れませんし.
ただ,スレッド安全性を前提にしなくて良い場合もあるでしょうし,その場合の
参照カウントは有意な高速化が望める可能性があるとは思いますけれど.
0608デフォルトの名無しさん
2006/02/03(金) 18:15:50参照だったら「delete thisはしていんんですか?」「this=&rhsはしていんんですか?」問題なぞ発生しなかったろうに・・・
0609デフォルトの名無しさん
2006/02/03(金) 18:23:05C++ではthisという仕組みが先に出来て、
参照という仕様が出たのはそれよりもずっと後だから。
0610デフォルトの名無しさん
2006/02/03(金) 18:23:410611デフォルトの名無しさん
2006/02/03(金) 18:24:53結婚しようか
0612デフォルトの名無しさん
2006/02/03(金) 18:25:23だが断る!
0613デフォルトの名無しさん
2006/02/03(金) 18:29:260614デフォルトの名無しさん
2006/02/03(金) 18:55:55std:istreambuf_iterator<char> it1(ss); it1++;
std::istreambuf_iterator<char> it2(it1); it1++;
std::cout << *it1;
std::cout << *it2 << std::endl;
実行結果:
cc
cbを期待していたのですが、私は何か間違っているでしょうか??
0615デフォルトの名無しさん
2006/02/03(金) 19:09:56istreambuf_iteratorはInputIteratorであってForwardIteratorではないから、
イテレータのコピーを取ってそれらを同時に操作しようとしても
期待した結果にはならない。
0616デフォルトの名無しさん
2006/02/03(金) 19:39:28InputIterator は、一度 dereference すると、その状態は保障されない。
InputIterator it = ...
InputIterator itDash = it;
bool a = ( *it == *itDash );
としたとき、a == true は保障されない。
0617デフォルトの名無しさん
2006/02/03(金) 20:06:19InputIterator は複数回の dereference が保証されていないのではなく
traverse 後のコピーの状態が保証されていないです.
>InputIterator it = ...
>InputIterator itDash = it;
>bool a = ( *it == *itDash );
での a == true は保証されていると思いますが,
value_type v = *it;
itDash = it;
++it;
bool b = ( *itDash == v );
での b == true が保証されていないというか,このときに itDash に
operator* を 適用できること自体がそもそも保証されていないです.
0618デフォルトの名無しさん
2006/02/03(金) 21:19:42プログラミング言語 C++ 第3版を見ながら学習しているんですが,
等号演算子のオーバーライドで,
class X
{
// ...
const operator ==( X&, X& );
とするとコンパイルエラーになるんです.
「エラー E2080 cmem.cpp 74: 'CMem::operator ==(CMem &,CMem &)' は引数 1 つで宣言し
なければならない」
なぜなんでしょうか…
0619デフォルトの名無しさん
2006/02/03(金) 21:21:010620618
2006/02/03(金) 21:24:06class X
{
// ...
const operator ==( X&, X& );
正)
class X
{
// ...
const bool operator ==( X&, X& );
}
0621618
2006/02/03(金) 21:26:30すみません, もう少し詳しくお願いします.
0622デフォルトの名無しさん
2006/02/03(金) 21:27:420623デフォルトの名無しさん
2006/02/03(金) 21:31:30ヒント:==は3項演算子ではない。
そういうことがやりたければ、クラスの外に出せばいい。
0624618
2006/02/03(金) 21:39:00クラスの外に出せばいいのか...
了解です.
0625618
2006/02/03(金) 21:57:32の T1 は,
a @ b
の a に当たるのではなくて,
演算子 @ が返す型だったということで解決.
0626デフォルトの名無しさん
2006/02/04(土) 01:17:190627デフォルトの名無しさん
2006/02/04(土) 01:26:070628デフォルトの名無しさん
2006/02/04(土) 04:14:030629デフォルトの名無しさん
2006/02/04(土) 05:07:060630デフォルトの名無しさん
2006/02/04(土) 12:47:40むしろMore Effective C++が勉強になった
0631592
2006/02/05(日) 16:26:13おそくなって申し訳ないけども、リンク先の 21.3 -5- のことを指したかったんだ。
お詫びにこんなのも拾ってきたよ。
ttp://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#263
0632デフォルトの名無しさん
2006/02/05(日) 21:54:29関数の定義の仕様(8.4 Function definitions)を読んでいたのですが、
function_definition:
decl_specifier_seq( opt ) declarator ctor_initializer(opt) function_body
こんな感じで書かれています。
ここの、decl_specifier_seq が関数の戻り値の型に相当するようです。(8.4.2のExample参照)
で、これは7.1(Specifiers)で、以下のように定義されています。
decl_specifier_seq:
decl_specifier_seq(opt)
declspecifier
つまり、複数の declspecifier を含むことができるようになっています。
でも、それを額面どおりに受け取ると、戻り値型を複数指定できる、と
読めるのですが、もちろんそんなことはありませんよね?
int char Foo( ... )
とかはコンパイル通りませんし。なぜ仕様書ではこんな書き方になっているの
でしょうか?なにかを見落としているなら、教えてください。
それとも、ひょっとして複数型の戻り値が仕様的には正しいwのでしょうか?
ちなみに、decl_specifierにint とか charが含まれます。
よろしくお願いします。
0633632
2006/02/05(日) 22:00:33Example: a simple example of a complete function definition is
int max(int a, int b, int c)
{
int m = (a > b) ? a : b;
return (m > c) ? m : c;
}
Here int is the decl_specifier_seq;
max(int a, int b, int c) is the declarator; { /* ... */ } is
the function_body.
0634デフォルトの名無しさん
2006/02/05(日) 22:03:247.1.5(Type specifiers) -1- より
"As a general rule, at most one type-specifier is allowed in the complete decl-specifier-seq of a declaration."
ttp://www.kuzbass.ru/docs/isocpp/dcl.html#dcl.type
0636デフォルトの名無しさん
2006/02/06(月) 02:37:00具体的には item.h が次のようになっていて
class Item
{
// いろいろ
};
typedef std::list<Item> List;
別のヘッダファイル内でこの item.h をincludeせずに List を前方宣言したいのですが、
class List;
とか
typedef struct List;
とかすると型が一致しないと怒られてしまいます。
item.hをインクルードするしかないのでしょうか。
解決法があれば教えてください。
0637デフォルトの名無しさん
2006/02/06(月) 02:55:34面倒なのを厭わなければ、
class Item;
typedef std::list<Item> List;
という内容のitem_fwd.hを作って、item.hとItemの前方宣言が必要なファイルの両方からインクルードするという方法がある。
0638デフォルトの名無しさん
2006/02/06(月) 03:18:400640デフォルトの名無しさん
2006/02/06(月) 11:26:34不完全方を引数にした標準テンプレートのインスタンス化による効果は未定義。
というわけで、標準コンテナを使ってる限り、その形で前方宣言は無理。
class Item;
typedef std::list<Item*> List;
これなら大丈夫。
0641デフォルトの名無しさん
2006/02/06(月) 16:42:13>不完全方を引数にした標準テンプレートのインスタンス化による効果は未定義。
未定義っつうかインスタンス化しようとしたところでコンパイルエラーになるのでは?
ちなみに637の内容はインスタンス化じゃないよね
0642640
2006/02/07(火) 01:57:55ふむ。 typedef では完全な定義は要らないのでインスタンス化は起こらなさそうだな。
ただ、規格中にはっきりとした記述が見当たらない。
未定義じゃなくてコンパイルエラーになってくれればいいんだけど、例えば
class T
{
public:
... // public interface
private:
class Impl;
std::auto_ptr<Impl> pimpl;
};
なんて pimpl の雛型を書くと、ほとんどの実装でコンパイルは通るが
厳密に規格と照らし合わせると未定義動作になる。
0643デフォルトの名無しさん
2006/02/07(火) 03:06:40>ただ、規格中にはっきりとした記述が見当たらない。
これが正しいかどうかは検証が大変なので置いといて
>なんて pimpl の雛型を書くと、ほとんどの実装でコンパイルは通るが
>厳密に規格と照らし合わせると未定義動作になる。
Tのインスタンスを作ろうとするとT::Implの定義が必要でコンパイルエラーになる
インスタンスがないものは動作しようがないので(たぶん)未定義動作は起こらない
のでは?
0644デフォルトの名無しさん
2006/02/07(火) 03:11:03コンパイルエラーにならないのは、pimplがポインタ変数(ポインタのサイズ
はポインタが指すオブジェクトのサイズに無関係)だからだろ?
std::auto_ptr<Impl> pimpl;
が
Impl impl;
だったらコンパイルエラーになる。Implの宣言が読み込まれていない
(sizeof(Impl)が不明な)状態で、sizeof(T)はいくつ?
0645デフォルトの名無しさん
2006/02/07(火) 03:24:13> Tのインスタンスを作ろうとするとT::Implの定義が必要でコンパイルエラーになる
それ、やってみて言ってる?エラーメッセージは?
手元のコンパイラ2つでは、両方とも警告しか出ない。
0646デフォルトの名無しさん
2006/02/07(火) 03:24:47それはわかってる。
auto_ptr<Impl> がコンパイル通るのに、実際には
規格で許されていないのが今の問題。
0647デフォルトの名無しさん
2006/02/07(火) 03:29:11Cの実装に依存する。(インスタンス化した文脈と処理系にも依存したかもしれない)
だから、標準ライブラリのテンプレートに不完全な型を渡すと、
標準ライブラリの実装によってコンパイルの可否が左右される。
そこで、規格は、そういう実装依存のコードを避けるため、
標準ライブラリのテンプレートに不完全な型を渡すこと自体を禁止したのではないかと。
>>643
>Tのインスタンスを作ろうとするとT::Implの定義が必要でコンパイルエラーになる
g++3.4.2では警告だけ。
>>644
コンパイルエラーにならない原因はその通りだけど、
>>642はエラーにならないこと自体を問題視してるんだと思われ。
0648デフォルトの名無しさん
2006/02/07(火) 03:29:56訂正
>Tのインスタンスを作ろうとするとT::Implの定義が必要でコンパイルエラーになる
T::Implのインスタンスを作ろうとするとT::Implの定義が必要でコンパイルエラーになる
0649647
2006/02/07(火) 03:30:130650デフォルトの名無しさん
2006/02/07(火) 03:32:03>標準ライブラリのテンプレートに不完全な型を渡すこと自体を禁止したのではないかと。
禁止したの?
ソースを
0651デフォルトの名無しさん
2006/02/07(火) 03:33:34それは当たり前。今回の問題とは関係ない。
0652デフォルトの名無しさん
2006/02/07(火) 03:33:38表現がおかしかった。正確には>>640の
>不完全方を引数にした標準テンプレートのインスタンス化による効果は未定義。
のこと。
0653デフォルトの名無しさん
2006/02/07(火) 03:42:20それ未定義動作を起こす可能性のあるソースって書ける?
642の例はインスタンス作ってないから動作しないよね
0654デフォルトの名無しさん
2006/02/07(火) 03:46:17それなら "public interface" を空にしてインスタンスの生成を追加すれば十分。
0655デフォルトの名無しさん
2006/02/07(火) 03:52:46class T
{
private:
class Impl;
std::auto_ptr<Impl> pimpl;
};
int main
{
T t;
}
これ未定義動作なの?
0656デフォルトの名無しさん
2006/02/07(火) 04:02:57そういうこと。(コンパイル通るように微調整すれば)
0657デフォルトの名無しさん
2006/02/07(火) 04:04:570658デフォルトの名無しさん
2006/02/07(火) 04:07:36違う。>>641参照。
0659デフォルトの名無しさん
2006/02/07(火) 04:45:05Tのデストラクタ内でauto_ptrが delete p する必要があるでしょ。
で、この時に、Impl::~Impl()が実装されているのかどうか(呼び出すべきかどうか)が
コンパイラには判断できない。
(Implが実はPODのデータオンリー場合は、delete演算子はoperator delete()を呼ぶだけ)
で、多分(警告だけで済むってことは)、~Impl()を呼ばないコードを生成する。
・・・と思うんだけど、違うかな。
0660デフォルトの名無しさん
2006/02/07(火) 05:05:29以下の(1),(2),(3)がそれぞれ未定義動作を起こすかどうかに帰結すると思う
(2)は確認してないけど多分問題ないよね.
659の指摘で(3)が通るのはいままで気づかなかった.
class A;
template <typename T> struct Hoge{};
int main ()
{
Hoge <A> h; // (1)
A *p; // (2)
delete p; // (3)
return 0;
}
0661デフォルトの名無しさん
2006/02/07(火) 05:14:43>以下の(1),(2),(3)がそれぞれ未定義動作を起こすかどうかに帰結すると思う
>>665の問題は「標準ライブラリの」テンプレート限定だから、それは違うんじゃないか?
0662デフォルトの名無しさん
2006/02/07(火) 05:26:51665は655の誤植として
それって「標準ライブラリの」テンプレートとその他のテンプレートで
振る舞いを変えるように規格で決められてるってこと?
それは不自然だと思うなぁ.
ソースがあるならよろしく
0663デフォルトの名無しさん
2006/02/07(火) 05:32:49いや、だから、item.h をインクルードして、
Item の定義をちゃんとしておけば大丈夫なんじゃないの?
0664デフォルトの名無しさん
2006/02/07(火) 05:43:25636の問いが
>item.hをインクルードするしかないのでしょうか。
だから663で問題が起こらなくとも636の答えにはなってない
0665デフォルトの名無しさん
2006/02/07(火) 06:29:08そうじゃない。 >640,652 が正解。
ほれ、ソースだ。17.4.3.6/2
http://www.kuzbass.ru/docs/isocpp/lib-intro.html#lib.res.on.functions
0666デフォルトの名無しさん
2006/02/07(火) 06:55:24std::list<不完全型>自体を不完全型的に扱う限り、合法なんじゃないの。
0667デフォルトの名無しさん
2006/02/07(火) 07:41:45というわけで、#defineでよくね?
0668デフォルトの名無しさん
2006/02/07(火) 14:55:42だから、「item.h をインクルードするしかない」という答えになるんじゃね?
>>667
#define しても、結局それを使う所で問題が起こると思われ。
ヘッダ内で使うと思うし。
0669デフォルトの名無しさん
2006/02/07(火) 15:11:35664の時点では637と640が提案されていて
637が合法かどうかは議論中であるが
640の提案に異存のあるレスはない
従って「item.h をインクルードするしかない」という答えにはならないヨ
>>667
>typedefした時点でインスタンス化が行われるとか云う話を、昔に聞いたことがあった。
これも規格中にソースを欲しいですね(私も探してますけど)
637といい642といい結構私は常用してるのですが
あんまりみなさん議論に乗ってこないとこ見るとやらないのかな?
pimplが非合法なんて影響でかいと思うのですが...
0670デフォルトの名無しさん
2006/02/07(火) 15:22:43これは不完全型でも大丈夫だから
0671デフォルトの名無しさん
2006/02/07(火) 15:44:58ソースみたらboostのsmart_ptrは対策をしてあるようですね
pimplだったらscoped_ptrの方がいいのかな
0672デフォルトの名無しさん
2006/02/07(火) 15:46:0217.4.3.6/2 は標準ライブラリの話だよね。
おれは大体 pimpl に scoped_ptr 使うからどーでもいい。
0673デフォルトの名無しさん
2006/02/07(火) 15:49:42標準ライブラリだから不完全型を使うと非合法になるのだろうか。
0674デフォルトの名無しさん
2006/02/07(火) 16:14:190675デフォルトの名無しさん
2006/02/07(火) 19:34:39>640の提案が>636の欲しかったものだとは思わないな。完全に違う実装だろこれ
でも正直、厳密な規格だのライブラリの実装だのを気にするくらいなら
不完全型を使うの控えて>640にするか素直に全部インクルードするな俺は
0676デフォルトの名無しさん
2006/02/07(火) 20:21:51std::cin >> s;
って具合に次々に文字列を読み込んでいくと、
確かに空白で区切られて読み込まれるんだけど、
改行した、ってのは認識できないですよね?
std::cin.peek() == '\n' とかで判定するんですか?
0677デフォルトの名無しさん
2006/02/07(火) 20:27:11std::getlineはだめ?
0678デフォルトの名無しさん
2006/02/07(火) 20:34:430679デフォルトの名無しさん
2006/02/07(火) 20:37:50getline 使ってみますね。
0680これがエラーになるのはなぜでしょうか?
2006/02/07(火) 20:51:22class C {
public:
C(){}
friend std::istream operator>>(std::istream&, C&);
friend std::ostream operator<<(std::ostream&, const C&);
}; // class C
}//namespace N
0681すみません、整形し直しました
2006/02/07(火) 20:51:53class C {
public:
C(){}
friend std::istream operator>>(std::istream&, C&);
friend std::ostream operator<<(std::ostream&, const C&);
}; // class C
}//namespace N
0682デフォルトの名無しさん
2006/02/07(火) 20:57:120683デフォルトの名無しさん
2006/02/07(火) 21:40:51a_type ob[10];
a_type *p = ob;
これは問題ないのに、
a_type ob[2][5];
a_type *p = ob;
これはエラーが出るのは何故?
0684デフォルトの名無しさん
2006/02/07(火) 21:45:500685デフォルトの名無しさん
2006/02/07(火) 21:47:130686デフォルトの名無しさん
2006/02/07(火) 22:07:500687デフォルトの名無しさん
2006/02/07(火) 22:23:25ほんとだ。すまんな、どうも気が触れていたようだ。
これで勘弁してくれ。つvoid*
0688デフォルトの名無しさん
2006/02/07(火) 23:06:40class X
{
}
ここ int n の所を自分のオブジェクトにしたらコンパイルエラーが出るんだけどなんで?
template<class T, Point n>
みたいな感じで書くと
error: 'class Point' is not a vlid type for a template constant parameter
ってでちゃう。
0689デフォルトの名無しさん
2006/02/07(火) 23:09:26それは型じゃなくて値
0691デフォルトの名無しさん
2006/02/07(火) 23:15:31タダで閲覧できるところまである
0692デフォルトの名無しさん
2006/02/07(火) 23:24:34そういう規格としか。
intとかboolとかの整数系はOKだけど、floatとか構造体とかアウト。
ポインタはどうだっけ?
0693デフォルトの名無しさん
2006/02/07(火) 23:26:23リンカに Point 型の値を処理させるのは、とても大変で、
任意のユーザー定義型まで考えるとほとんど不可能だから。
0694デフォルトの名無しさん
2006/02/07(火) 23:32:07そもそも 688 の意図が単にコンパイラを困らせるだけのように見える
# 後付け設定の権化が規格だったりもするが
0695デフォルトの名無しさん
2006/02/07(火) 23:33:12http://www.google.co.jp/search?q=%22open%2Dstd%22+shared%5Fptr+%2217%2E4%2E3%2E6%22
0696688
2006/02/07(火) 23:38:41ありがとう。駄目なんだね。
組み込みの整数型だけは渡せるようなナゾ仕様になってしまったのかはわからんが。
便利じゃね?
Point p1, p2;
length = getLength<float, p1,p2>();
とか書けたら。
それにしてもtemplateを勉強するのに良い本はない。
0697デフォルトの名無しさん
2006/02/07(火) 23:47:41それは
template <typename T> float getLength(T t1, T t2) {
return t2 - t1;
}
こうする事で int t = getLength<int>(5,8); などと書けるので
Point型に対した処理がしたいなら特殊化したテンプレートを書けば良いと思います
0698デフォルトの名無しさん
2006/02/07(火) 23:54:20それだと実行時の関数になる。
0699デフォルトの名無しさん
2006/02/07(火) 23:55:04可読性0の埋め込み型スクリプト言語になっちまうぞ。
0700デフォルトの名無しさん
2006/02/07(火) 23:55:04template<class T, Point* n>
これならいける。
0701デフォルトの名無しさん
2006/02/08(水) 00:01:38最適化されるでしょう
0702デフォルトの名無しさん
2006/02/08(水) 00:08:21サンクス
0703デフォルトの名無しさん
2006/02/08(水) 00:48:14最適化されたとしても引数が定数でないことに変わりはないから、他のテンプレートに渡したりはできないわな。
>>696が何をやろうとしているのか分からんが。
0704デフォルトの名無しさん
2006/02/08(水) 01:07:16void foo( map<Key, Value>& in )
{
map<Key , Value>::iterator it;
}
これをコンパイルするとエラーになるんですが、
正しくはどう書けばいいんでしょうか?
0705デフォルトの名無しさん
2006/02/08(水) 01:11:43typename map<Key, Value>::iterator it;
とする必要がある。
でも、コンパイラによっては typename を入れた方がエラーになる。
#if defined(__GNUC__)
#define TYPENAME typename
#else
#define TYPENAME
#endif
とかやっといて、
TYPENAME map<Key, Value>::iterator it;
とするが吉。
0706デフォルトの名無しさん
2006/02/08(水) 01:20:34まさにgccでした。ありがとうございます。
0707デフォルトの名無しさん
2006/02/08(水) 01:36:31これって、規格的には typename 入れるのと入れないのと、
どっちの方が正しいのかな?
何か時代によって変わってそうな気もするけど。
0708デフォルトの名無しさん
2006/02/08(水) 02:18:09文句なく入れるのが正しい。
0709デフォルトの名無しさん
2006/02/08(水) 02:18:380710デフォルトの名無しさん
2006/02/08(水) 02:53:48「typename はテンプレート仮引数にしか使えません」
とかエラー出るコンパイラは、まだ準拠できてないってことか。
0711デフォルトの名無しさん
2006/02/08(水) 03:17:52持ってるんじゃなかった?
(classの先行宣言と一緒=以前はclassで代用してたのかも)
とすれば、>>704の例だと
typename map<Key , Value>::iterator; // 先行宣言
map<Key , Value>::iterator it;
なら、どんなコンパイラでも(typenameというキーワードをサポートしていれば)
通りそうな気がするんだけど。
試してないけどね。
0712デフォルトの名無しさん
2006/02/08(水) 03:20:110713デフォルトの名無しさん
2006/02/08(水) 04:07:37それはまったくのガセネタだな。どこで仕入れてきたんだ?
0714デフォルトの名無しさん
2006/02/08(水) 04:09:59ぐぐったら
http://ja.wikipedia.org/wiki/%E4%BA%88%E7%B4%84%E8%AA%9E_(C++)
のtypenameのところにあった
0715デフォルトの名無しさん
2006/02/08(水) 04:21:20は?そこの解説には >711 のような内容は書いてないぞ。
typename が宣言を作るわけじゃない。
0716デフォルトの名無しさん
2006/02/08(水) 05:57:53typenameが
1.テンプレート引数で型を引数にとることを示すことに使う。(classで代用可能)
2.続く識別子が型名であることを示す。
だから型名であることを言うだけで宣言じゃないのは確かだな
0717デフォルトの名無しさん
2006/02/08(水) 08:37:34new hoge[n] で獲得した領域は delete[] で解放しなくてはいけないそうですが、new hoge で獲得した領域を delete[] しても大丈夫でしょうか?
それとも delete[] したいなら、new hoge[1] とかするべきでしょうか(これだとコンストラクタに引数を渡したい場合に困りそうですが)。
あと、都合により
void *p = (void*)new hoge;
と獲得した領域を delete する場合、delete (hoge*)p とやらないと hoge のデストラクタが走らないのは仕様なんですよね?
つまり、delete に渡すポインタは、new したときの型で渡さないといけないということですよね?
# できればキャストせずにうまく動いて欲しいのですが
0718デフォルトの名無しさん
2006/02/08(水) 08:59:06あとvoid*ではdeleteできません。 どのデストラクタ呼んでいいのか判らんでしょう。
// 技術的な可能不可能の話で言えば、vtbl持ってるクラスのインスタンスならvoid*でもdeleteできそうだけど、
// void*ポインタからvtbl持ってるか判別はできないのでやっぱり無理。
0719デフォルトの名無しさん
2006/02/08(水) 09:07:01ってそれを言語使用として禁止してしまわないのがC++のいいところ何だが。
なんでそんなことをしたいのか分からないけど、
もしいろんな型のオブジェクトを一手に扱いたい、なんてことであれば
一つの基底クラスから全部派生させるようにして
仮想デストラクタを使うようにするのがオブジェクト指向的だと思われ。
まぁ Java でいうところの Object クラスみたいなもん。
(C# だとどうなんだったっけ?)
0720717
2006/02/08(水) 09:24:48わかった。ありがとう。
でも、void* の delete の話を技術的に解決する話なら、new したときに獲得メモリブロックのヘッダにデストラクタのポインタか
vtblのオフセットかを記録しておけば、delete に渡されたときの型によらず適切なデストラクタを呼び出すことができそうじゃない?
いや、そういう仕様になってないんだから文句も無いけど。
>>719
char[] を獲得して void* に代入して、そのまま delete してるソースがあったから、気になって聞いてみた。
規定クラスの話は、自分で新規に作るなら多分そうします。
ありがとう。
0721仕様書無しさん
2006/02/08(水) 11:25:41virtual void Suicide() { delete this; }
ってな仮想関数を用意して、
pObj->Suicide();
とでもすれば?
0722デフォルトの名無しさん
2006/02/08(水) 11:29:12それ、 virtual デストラクタ+普通の delete に比べて、何がメリットなの?
0723デフォルトの名無しさん
2006/02/08(水) 11:39:48って書こうと思ったらすでに書かれてた。
0724デフォルトの名無しさん
2006/02/08(水) 13:42:30本日からC++をはじめた。初心者PGです。
さっそくお伺いしたいのですが。
javaで書く
data.java
----------------------
1|class data {
2|
3| public string data;
4| public string data2;
5|}
===================================
test.java
----------------------
1|import data;
2|
3|class test {
4|
5| MethodTest(data pData) {
6|
7| string strPara;
8| strPara = pData.data2;
9| }
10|}
はどのようにC++でどのように表現すればいいのでしょうか?
現在、C++でDLLを生成し VBで生成したDLLを使用する処理を作っているのですが。
DLLの呼び出し関数の引数と戻り値に 構造体を使用したいのです。
よろしくお願いします。
0725デフォルトの名無しさん
2006/02/08(水) 13:51:11ネットを何だと思ってるのかな
0726デフォルトの名無しさん
2006/02/08(水) 17:05:040727デフォルトの名無しさん
2006/02/08(水) 17:21:54std::cin >> i ;
として数値を読み込んでいます。
もし入力されたモノが数値としてふさわしくない文字列だった場合、
そのことを知るにはどういう方法があるのでしょうか?
0728デフォルトの名無しさん
2006/02/08(水) 17:22:58ふさわしくない時
}
0729デフォルトの名無しさん
2006/02/08(水) 17:27:53http://pc8.2ch.net/test/read.cgi/tech/1135828083/610
0730デフォルトの名無しさん
2006/02/08(水) 17:41:12つまり、istream::fail() ということですね。
0731デフォルトの名無しさん
2006/02/08(水) 19:26:34メモリ空間を圧迫するから採用されなかったんじゃないかな。
たとえば、メンバがポインタ変数一つしかないようなクラスを考えると
デストラクタのポインタが増えることで実質倍のメモリを消費する。
0732デフォルトの名無しさん
2006/02/08(水) 19:44:25そういう場合に void* を使った時点で設計ミス扱いされても文句は言えない。
0733デフォルトの名無しさん
2006/02/08(水) 20:39:42でもnewで割当てられたメモリブロックには元々メモリ管理情報が付加されてるから、ポインタ一つくらい増えても問題はないんじゃないかと思わなくも無い。
この辺は処理系依存と呼ばれる部分だろうけど。
0734デフォルトの名無しさん
2006/02/08(水) 21:51:15やろうと思えば、その通りのことがユーザコーディングでできてしまうのが C++ 。
0735デフォルトの名無しさん
2006/02/08(水) 21:52:52newして得たポインタを保持するのにboost::shared_ptr<void>を使えばよい。
boost::shared_ptrは自身のコンストラクタへの引数に与えられた型を保存しておいて、
その型でdeleteを呼んでくれるから、元の型のデストラクタが呼ばれる。
0736デフォルトの名無しさん
2006/02/08(水) 22:02:47構造体をファイルで管理するのはどうすればいいのですか?
構造体のメンバも一つずつファイルに書きこまにと駄目なですか??
構造体名だけを保存してたんですが、いざメンバを使おうとしたら
読み込んでも使えない・・・・・・なにかヒントくださいTT
0737デフォルトの名無しさん
2006/02/08(水) 22:04:340738デフォルトの名無しさん
2006/02/08(水) 22:15:26なにベースでコード書いてる?
Win32API? Cの標準関数? C++のストリーム系?
0739デフォルトの名無しさん
2006/02/08(水) 22:22:430740デフォルトの名無しさん
2006/02/08(水) 22:29:43構造体を new するとき、ファイルを open
構造体からメンバを get するとき、ファイルから read
構造体にメンバを set するとき、ファイルから write
構造体を delete するとき、ファイルを close
する関数を作れば ok
0741デフォルトの名無しさん
2006/02/08(水) 23:19:50class foo {
T hoge_;
public:
const T& hoge1; // <--(a)
T const& hoge2; // <--(b)
foo(): hoge1(hoge_),hoge2(hoge_) {}
};
上の(a)と(b)の書き方で何か意味の違いがあるのでしょうか?
0742デフォルトの名無しさん
2006/02/08(水) 23:22:14ない。
0743デフォルトの名無しさん
2006/02/08(水) 23:23:21ありがとうございます。
0744デフォルトの名無しさん
2006/02/08(水) 23:35:00の意味が聞きたかったんちゃうのか?
0745デフォルトの名無しさん
2006/02/08(水) 23:36:400746デフォルトの名無しさん
2006/02/09(木) 00:05:57java では引数とメンバ変数がかぶっていても、メンバ変数の方を
"this.foo"とするようにしておけば特に問題ない。
1.C++ でも this ポインタを使えば同じことができるでしょうか?
(g++ では問題なかった)
2.(上がOKの場合のみ) C++ で this->hoge = foo; って書くと変?
0747746
2006/02/09(木) 00:09:552.(上がOKの場合のみ) C++ で this->foo = foo; って書くと変?
の間違いでした…
0748デフォルトの名無しさん
2006/02/09(木) 00:15:12普通に出来るし変でもない。
0749デフォルトの名無しさん
2006/02/09(木) 01:18:441.できるお
2.変じゃないお
0750デフォルトの名無しさん
2006/02/09(木) 01:20:230751746
2006/02/09(木) 01:55:41メンバ変数の方の頭や後ろに _ をつけたり m_ をつけて
this をはずせば馬鹿じゃないんでしょうか >>750
0752デフォルトの名無しさん
2006/02/09(木) 02:09:26名前が被ること自体が問題。
あえてリスクを負うようなコーディングスタイルは避けるのが
普通以上のレベルのプログラマの常識。
ただ、例外として問題が少々あろうが後腐れの無いプログラムで
そーゆー類のことをするのは全然構わんと思う。・・・逆にそーゆー
融通が利かすことができないのは一流気取りの三流プログラマ。
0753デフォルトの名無しさん
2006/02/09(木) 02:34:30名前が本質的に同じであるのが自然である場合、
あなたは、どういう醜い名前の付け方をするんですか?
class date{
int year;
........
public:
........
void set_year(int year){
this->year = year;
}
};
0754デフォルトの名無しさん
2006/02/09(木) 02:38:54setterでは普通に使ってるけど、やめた方がいいんだろうか…
void setHoge(type hoge) {this->hoge = hoge;}
0755デフォルトの名無しさん
2006/02/09(木) 02:41:06g_ だの m_ だのといったプレフィックスを見たこともない人ですか?
自分のスタイルを押し付けるような気は毛頭ないがなんらかの方法で
名前が完全に被るようなことは極力避けるのが普通だぞ。
0756デフォルトの名無しさん
2006/02/09(木) 02:43:28俺はそのケースでも引数にプリフィックスを付けて
名前の重複を避けるようにしてるけど
このケースは許容範囲なんじゃない?
0757デフォルトの名無しさん
2006/02/09(木) 02:58:01使わなくても済むから結果的に表記もすっきりするね。
void setHoge(type hoge) {this->hoge = hoge;}
↓
void setHoge(type a_hoge) {hoge = a_hoge;}
0758753
2006/02/09(木) 03:07:56えーと、変数に無駄な接頭語付ける文化ってまだ存在してたんですね。
自分の場合ハンガリアンが駄目絶対と言われてたのを、
目にしてたので死滅したものかと思っていました。
個人的には、グローバル変数はg_hoge,メンバ変数はm_hogeとかするくらいなら
::hoge,this->hogeと書けば、
言語レベルでそのスコープにアクセスしていると保障が得られるので
素直に言語の機能を使ってました。
なのでスコープを明示的に指定できるC++で、
変数名にスコープ情報を入れたり無駄な接頭語を付けるのは、
気持ち悪いし美しくないなぁ、と思っています。
0759デフォルトの名無しさん
2006/02/09(木) 03:32:42this-> 忘れるバグを埋め込む可能性を恐れるよりは、
m_ つけた方がよっぽどいい。
明らかに異なる名前なら、間違える可能性がグンと減る。
毎回 this-> つけるなら別だが、長ったらしい。
0760デフォルトの名無しさん
2006/02/09(木) 03:48:41「プリフィックス」と「ハンガリアン」を混同してる人ってまだ存在してたんですね。
MSもハンガリアンを推奨しなくなったんで死滅したものかと思っていました。
個人的には、所謂 getter に名詞を使うので、メンバ変数に m_ つけないと
被ってどうしようもなくなります。この衝突は this-> とかじゃ逃げれませんし。
0761754
2006/02/09(木) 04:00:12引数にプリフィクスを付ける手もあるのか、なるほど。
自分はメンバ変数をhoge_としています。
>>759
個人的には
void setHoge(type hoge) {this->hoge = hoge;}
は見やすくて好きなんだが、
バグのとこを考えると避けた方がいいように思えてきた。
0762753
2006/02/09(木) 04:03:31変な接頭語付ける文化は興味が無くて、
その手の文化はハンガリアンしか聞いたことが無いので勘違いしておりました。
確かにメソッドと変数名の衝突は頭が痛くなる問題ですね。
自分の場合getterにはget_hogeのような2単語で構成するのが殆どなので、
変数とメソッドの衝突は未経験ですが、
それを考慮すると奇妙な名前を付けるのも仕方がないのでしょうね。
今まで奇妙な接頭語を付ける人の気持ちを理解できなかったのですが、
理解はできました。
ありがとうございます。
0763デフォルトの名無しさん
2006/02/09(木) 04:13:56C++ でも欲しくなってくるなぁ。
0764デフォルトの名無しさん
2006/02/09(木) 04:31:07無理か
0765デフォルトの名無しさん
2006/02/09(木) 04:41:36operator[]とかポインタじゃ呼び出しにくい
0766デフォルトの名無しさん
2006/02/09(木) 04:45:580767デフォルトの名無しさん
2006/02/09(木) 05:28:06個人的に、そういう仕様はあまり好きになれない。
0768デフォルトの名無しさん
2006/02/09(木) 06:22:22コンパイラが新しければね
0769 ◆Uy3UpqU1oc
2006/02/09(木) 07:11:41書き込みや読み込み先のファイルの、場所の指定はできないんですかね?
0770デフォルトの名無しさん
2006/02/09(木) 07:32:370771デフォルトの名無しさん
2006/02/09(木) 07:40:47C++にthisが入ったのが、参照が入ったのより前だからごめん、
って禿がゆってた。
0772 ◆Uy3UpqU1oc
2006/02/09(木) 07:50:180773デフォルトの名無しさん
2006/02/09(木) 08:22:280774デフォルトの名無しさん
2006/02/09(木) 09:20:311,234,567 という形式で出力させる事はできますか?
0775デフォルトの名無しさん
2006/02/09(木) 09:45:48locale loc("jpn");
cout.imbue(loc);
cout << 1234567 << endl;
0776 ◆Uy3UpqU1oc
2006/02/09(木) 10:23:30自分であっちこっち移動させました…
0777デフォルトの名無しさん
2006/02/09(木) 12:52:30就職したら迫害されるんだろうか
0778デフォルトの名無しさん
2006/02/09(木) 16:25:15コーディング既約で一応変数名についてはそれなりの基準を示すから
現場では適宜それにしたがってくれればいいよ.
0779デフォルトの名無しさん
2006/02/09(木) 16:30:19Windowsユーザと邪推すると、ディレクトリ記号「\」はエスケープシーケンスで使われるので
ifstream fin("C:\\Documents and Settings\\Gates\\testament.txt");
というように「\\」と重ねなければならない。
もしこれで正答なら漏れエスパー。
0780デフォルトの名無しさん
2006/02/09(木) 16:44:19メンバ変数 : 下線を最初につける
引数 : 下線を最後につける、主となる引数を下線だけにする
getter : 素の名前
setter : set_を最初につける
↓こんな感じ
class X {
int _width;
public:
X(const int& width_) : _width(width_) {}
int width() const { return _width; }
int set_width(const int& _) { return _width = _; }
};
0781デフォルトの名無しさん
2006/02/09(木) 16:51:27先頭の文字がアンダーバーなのは、
C++の処理系に大域名として予約されているから余り好きじゃないなぁ。
大域名にマクロ使われるかもしれんし。
0782デフォルトの名無しさん
2006/02/09(木) 16:52:19template <typename T>
inline std::string number_format(const T& target_, std::size_t w_=3, const std::string& s_=",") {
std::string n = xtos(target_);
std::size_t p = n.find('.');
if (p == std::string::npos) p = n.size();
while ((p -= w_) > 0) n.insert(p, s_);
return n;
}
xtos()は次の通りだけれど、Boostのlexical_castを使った方がいいと思う。
template <typename T>
inline std::string xtos(const T& _) {
std::string s;
std::stringstream ss;
ss << _; ss >> s;
return s;
}
0783デフォルトの名無しさん
2006/02/09(木) 17:20:04ルールを覚えるのが面倒だから面罵も下駄も雪駄も同じ名前でいいよ。
class X {
int width;
public:
X(const int& width) : width(width) {}
int width() const { return width; }
void width(const int& _) {width = _;}
};
0784デフォルトの名無しさん
2006/02/09(木) 17:39:58あとgetterが素の名前()ってのはSTLでも使われてるけど
パブリック変数なのかゲッター関数なのか紛らわしくないか?
STLとか自分で書いたライブラリならまず間違えないし
間違えたとしてもコンパイルエラーで済むって言われたらそれまでだが
0785デフォルトの名無しさん
2006/02/09(木) 18:01:28パブリック変数を使わず、必ずgetterを書くようにすることで統一を。
コンパイラが最適化のチャンスを見逃したら悲惨なことになるけどw
型名を接頭子にするのはどうしても慣れないなあ。
std::map<std::string, std::vector<std::pair<std::string, std::string> > >** p;
とかってハンガリアン記法で書くとどう書くの?
0786デフォルトの名無しさん
2006/02/09(木) 18:36:260787デフォルトの名無しさん
2006/02/09(木) 18:43:09クラスメンバには、Prefix、Suffix などはつけない方向で。
メンバ変数が埋もれそうな状況になったら、
ヘルパクラスや関数にする。
それ以外は、C++ Coding Standards を参考にする。
template< typename TypeName >
class class_name
{
public:
typedef TypeName type;
enum enum_name { item_name };
// 下駄。標準 stream などに見られる形式
type value() const { return val; }
// 雪駄。標準 stream などに見られる形式
type value( type const & newval ) { val = newval; }
private:
// 略名. prefix, suffix なし
type val;
};
0788デフォルトの名無しさん
2006/02/09(木) 18:49:32みたいな長くて堅苦しいのが好きだから
STLのコードが読みにくくてしょうがない
0789デフォルトの名無しさん
2006/02/09(木) 18:50:160790デフォルトの名無しさん
2006/02/09(木) 21:48:38@"c:\Documents and Settings\Gates\testament.txt");
みたいなC#モドキにしてくれぇ。
0791デフォルトの名無しさん
2006/02/09(木) 22:03:15Windowsは意外と大抵/を受け付けてくれるよ。
たまに\しか受け付けないものもあるけど。
0792デフォルトの名無しさん
2006/02/09(木) 22:19:30�dクス。UNIXがセパレータに'/'を使っていたので、ビル・ゲイツがひねくれて
わざとバック・スラッシュ文字を使ったような事は聞いた事があるけど、'/'も
使える場合があるのか。試してみる。
0793デフォルトの名無しさん
2006/02/09(木) 22:33:46いや、単にCP/Mが/をコマンドラインスイッチに使用してたんで互換性の都合上/が使えなかっただけらしいが。
0794デフォルトの名無しさん
2006/02/10(金) 14:22:51そうだね
MS-DOS = (CP/M + UNIX) / 3
だから
0795デフォルトの名無しさん
2006/02/10(金) 20:25:170796デフォルトの名無しさん
2006/02/10(金) 20:41:16MS-DOS = CP/M + UNIX / 10
くらいだな
0797デフォルトの名無しさん
2006/02/10(金) 21:33:52インタフェースを変更していない場合、参照している
呼び出し元プログラムはリビルドする必要があるので
しょうか?
皆さんはリビルドしていますか?
0798デフォルトの名無しさん
2006/02/10(金) 22:03:140799デフォルトの名無しさん
2006/02/10(金) 23:06:50処理系によるかと
昔のHPだと、たま〜〜に再リンクが必要だった
0800デフォルトの名無しさん
2006/02/10(金) 23:10:13美しくない・汚い・見るに耐えない
(慣れの問題だとは思うが・・)
抽象化が進むと、変数名命・メソッド名命
に、なって来るから余計そう思う
0801デフォルトの名無しさん
2006/02/10(金) 23:23:35引数に対する a_ もダメか?
argument の頭文字で a なわけだけど
そのまま前置詞の a と見なすことできるから
全然汚くないと思うんだが。
あと、お前が後半で言ってることの意味が不明。
0802デフォルトの名無しさん
2006/02/10(金) 23:35:39while(true) {
何でそんなに気にするのかよくわからん
private メンバは関数で言うなら auto 変数のようなもので
外から名指しされることのない、いわば自己責任の範疇だし
ちょっと込み入った処理をする場合はいちいち this-> ではアクセスせず
auto にキャッシュして最後に代入するだけだ
}
0803デフォルトの名無しさん
2006/02/10(金) 23:42:17引数・ローカル変数に「a」を付けるのは綺麗&今、マイブーム
(勝手な感覚だけど)
val=aVal;
何となく良い
引数とローカル変数の区別を、どう付けるべきか思案中
(区別するまでも無いとの説アリ)
後半はoo限定の話でした
0804デフォルトの名無しさん
2006/02/11(土) 00:24:26>何でそんなに気にするのかよくわからん
単なる(?)感覚的な問題
>private メンバは関数で言うなら auto 変数のようなもので
これは、全然違う希ガス
0805デフォルトの名無しさん
2006/02/11(土) 00:43:47クラスのどこからでもアクセスできて、
メンバ関数を抜けても値が保存される。
0806デフォルトの名無しさん
2006/02/11(土) 00:50:34>>802はprivateメンバ「関数」の話をしてるんだと思う。
0807デフォルトの名無しさん
2006/02/11(土) 00:55:000808デフォルトの名無しさん
2006/02/11(土) 01:22:23privateとpublicは、今の話には関係無い
>>807
長い変数名に、m_付ける方が汚く見える気がする
それ自体で意味成しているのに
それに余分な、m_付けるのはかなり気になる
0809デフォルトの名無しさん
2006/02/11(土) 01:52:50int member();
void member( int value );
int member_;
しかしスレ違いな気が……
0810デフォルトの名無しさん
2006/02/11(土) 02:06:33>privateとpublicは、今の話には関係無い
privateメンバ変数の名前はインターフェースに含まれないから、
適当に名前を割り当てても良い、というのが>>802の意見だろ。
0811デフォルトの名無しさん
2006/02/11(土) 02:31:35メンバ変数の最後に「_」付けるのは、目立たなくて控えめで個人的には好き
>>810
なるほど・・・そう言う意味ならば、>>802は、余計拙いと思う
メンバ変数は、>>805も言っている通り、グローバル変数的意味合いが強くなりやすい
(「1クラス=1責務」の原則を知らない人が多い現状では尚更)
ので・・・
ってか、public変数使う機会って、ほとんど無い・・と思う
少なくとも自分は1年以上使ったこと無い
0812デフォルトの名無しさん
2006/02/11(土) 02:43:40どうせ最終的にはどちらも譲らなくて宗教戦争になるだけなんだから
出来れば他のスレでやって欲しいんだけどな。
http://pc8.2ch.net/test/read.cgi/tech/1068752664/
とか。
0813デフォルトの名無しさん
2006/02/11(土) 02:56:28変数名・関数名の選定って、一番重要って説もあるくらいだし。
0814デフォルトの名無しさん
2006/02/11(土) 03:08:410815デフォルトの名無しさん
2006/02/11(土) 06:35:14おいおい、1クラス=1責務とか言ってる尻から何を血迷ったことを?
メンバ変数にするか関数内ローカル変数にするかは、
それぞれ合理的な理由でスコープを選択するわけで
グローバル変数にさえそれは当てはまるだろうがよ
昔の BASIC や COBOL のグローバル変数と一緒にしとるんちゃうか?
0816デフォルトの名無しさん
2006/02/11(土) 08:57:48具体的には、コンストラクタでメソッドの飛び先を変更して、
クラスの実行先ではそれを意識しないですむというものです
class hoge {
public:
void print();
void print_a();
void print_b();
hoge(int num) {
// ここでprintメソッドの実行先をprint_aまたはprint_bに変更
}
};
hoge h(1), hh(2);
h.print(); // print_aが実行される
hh.print(); // print_bが実行される
0817デフォルトの名無しさん
2006/02/11(土) 09:00:232. メンバ関数ポインタ(void (hoge::*)())を使う
どっちにするかは状況次第。
0818デフォルトの名無しさん
2006/02/11(土) 09:25:530819デフォルトの名無しさん
2006/02/11(土) 10:16:17普通にオーバーロードで解決できるんじゃ・・・。
0820デフォルトの名無しさん
2006/02/11(土) 11:11:57hとhhが同じ型でなくてよいならtemplateで解決(MC++D参照)
同じ型ならば>>817の案をセレクト。
0821デフォルトの名無しさん
2006/02/11(土) 11:19:050822デフォルトの名無しさん
2006/02/11(土) 11:27:23/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
| switch-caseで分岐って聞こえたような気がする!!
\_______ ____________
∨
|
|
/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
/ ____
/ | 19:00 |
 ̄ ̄ ̄
_______
/ _ / ,__
∧∧ガバッ! () / iii■
( ;゚Д゚)ミ  ̄/
/\∪ ∪ ̄\/ ∫∫
/ ※⌒⌒⌒⌒/ ∫∫
/ ※※※※ / ⊂⊃
/ ※※※※ / ┗━┛
(______,,ノ
0823デフォルトの名無しさん
2006/02/11(土) 11:32:370824デフォルトの名無しさん
2006/02/11(土) 11:38:190825デフォルトの名無しさん
2006/02/11(土) 12:13:240826デフォルトの名無しさん
2006/02/11(土) 13:16:29何らかの理由で出来ないのでしょう。
hogeのコンストラクタで関数をチョイスしていることから推測
0827デフォルトの名無しさん
2006/02/11(土) 14:40:23{
private:
public:
};
と書いています。しかし先輩から、お前のは見にくいから止めろと言われました。
class A
{
public:
private:
}
どっちが普通なんですか?
0828デフォルトの名無しさん
2006/02/11(土) 14:49:30プログラムに限らずテキストを書くときには
人に見てもらいたいところを先に書いたほうがいい、
というのはわかる?
「これは基本的にあなたは知らなくてもいいんですが
・・・
・・・
おっとここまで書いたところは気にしないで下さいね。
いつ内容が変更されるかわかりませんよ。
さて、結局のところは
・・・
・・・。」
こんな文章読まされたら嫌だと思わない?
0829デフォルトの名無しさん
2006/02/11(土) 14:49:35単なる糞くだらない宗教問題だから気にするな。
ただ、もしコーディング規約とかで、
定められているのならそちらを使えばいい。
規約が無いのなら自分で良いと思うほうを使えばいい
0830デフォルトの名無しさん
2006/02/11(土) 14:53:17ok。すべて書き直すぜ☆
0831デフォルトの名無しさん
2006/02/11(土) 15:24:07まぁそれでもpublicが先のコードが多いけどな
0832デフォルトの名無しさん
2006/02/11(土) 15:25:34本当にメンバ変数を隠蔽したいならPimplを使うべき。
classには「何も指定されてないものはprivateである」という
明確な仕様があるから、それに従って
class A
{
ここにprivateなものを定義
public:
ここのpublicなものを定義
};
こう書いてるよ。
一番悪いのは、メンバ関数の定義とメンバ変数の定義が
ごっちゃになってたり、staticなメンバとそうでないのが
混ぜこぜになってたりすること。
0833デフォルトの名無しさん
2006/02/11(土) 16:00:27先輩がなんで見にくいのか俺にはわからん。
メンバ変数の宣言が上下どちらかに統一されて
メンバ変数の初期化の順序が守られていればどっちだっていいよ。
それよりもクラスに対しての適切なコメントがないのが嫌。
0834デフォルトの名無しさん
2006/02/11(土) 16:26:34pimpl にはオーバーヘッドとコードの増加が伴うので、
それが許容できる場面でなければ使えない。
class の暗黙の private を省略するのは、
演算子の優先順位に依存してカッコを省略するのと
同じぐらいウザイと思う。
明確な仕様というが、デフォルトで private になっている理由は
そんなに明らかではないだろう?
0835デフォルトの名無しさん
2006/02/11(土) 16:27:230836デフォルトの名無しさん
2006/02/11(土) 16:32:32「デフォルトではprivateである」という事実は十分一般的なんだから問題ないと思うが…
0837816
2006/02/11(土) 16:33:16メンバ関数ポインタを使用します
0838デフォルトの名無しさん
2006/02/11(土) 16:33:16>pimpl にはオーバーヘッドとコードの増加が伴うので、
>それが許容できる場面でなければ使えない。
許容できる場面の方が多いのでオイラはディフォルトはpimplにしてるな
最適化する段階でプロファイルしてクリティカルなものをメンバ変数にするようにしてる
0839デフォルトの名無しさん
2006/02/11(土) 16:38:57public:が先頭に来るスタイルも多いんだから
見間違える可能性は小さくないだろ
0840デフォルトの名無しさん
2006/02/11(土) 16:39:36演算子の優先順位に依存してカッコを省略する人ですか?
0841デフォルトの名無しさん
2006/02/11(土) 16:44:160842デフォルトの名無しさん
2006/02/11(土) 16:44:24依存せずに括弧を書く人ですか?
((((A+B)+C)+D)+E)
0843デフォルトの名無しさん
2006/02/11(土) 16:45:171つたりとも無駄な括弧などないのに。
(- (+ 1 (* 2 (+ 4 6)) (/ 4 2)) 2)
21
0844デフォルトの名無しさん
2006/02/11(土) 16:46:010845デフォルトの名無しさん
2006/02/11(土) 16:46:16# いや俺はlisp大好きよ
0846デフォルトの名無しさん
2006/02/11(土) 16:49:530847デフォルトの名無しさん
2006/02/11(土) 16:50:17その式は演算子の優先順位に依存していないから、
省略しても問題ないと言えるんじゃね?
0848デフォルトの名無しさん
2006/02/11(土) 16:53:32当然ながらstructの暗黙のpulicにも期待しないんだろうな?
struct Point
{
public:
int x, y;
};
当然、わざわざpublicを書いてると。
限りなくウザス
まさか「structの暗黙のpublicだけは信じる」とか言わんよな?
0849デフォルトの名無しさん
2006/02/11(土) 16:54:16private:を省略するスタイルも一般的ではあるから見れば分かるし、
直後に連続して「public:」が続いていたら、不自然に感じるから問題はない気がする。
そもそも、メンバ変数をpublicにする状況というのも頻繁にあるわけじゃないしね。
0850デフォルトの名無しさん
2006/02/11(土) 16:56:15明確に仕様で決まってるから、structとclassの違いに意味がある。
いちいち冗長なpublicやprivateを書く方がムダ。
0851デフォルトの名無しさん
2006/02/11(土) 17:04:24>そんなに明らかではないだろう?
ARMにははっきり書いてあるし、仕様書は見てないが書いてあるだろう。
D&Eにも、C with Classesの最初期から「デフォルトはprivate」と
はっきり意識していたと書いてある。
Javaみたいな言語と違って、C++の場合は「sizeof(class)」が重要な
意味を持つから、クラスのサイズを規定するものは一番最初に
書いた方がいい。その方が絶対にバグを減らせる。
0852デフォルトの名無しさん
2006/02/11(土) 17:06:38今やっと半分ぐらい書き直したところ。
0853デフォルトの名無しさん
2006/02/11(土) 17:13:160854デフォルトの名無しさん
2006/02/11(土) 17:16:18pimplを使わない限り、classのprivate部分の変化は
そのclassを使っている全てのコードのリコンパイルを要求する。
Javaじゃないんだから「private部分はクラスのユーザーには無関係」
と言い切ることはできないのさ。
本当にprivateを意識させたくなければpimplを使うのが筋。
実装がFixしていてprivate部分に変化が無くなったら、
publicインターフェイスドキュメントを充実させればいい。
その方がよっぽど役に立つ。
0855デフォルトの名無しさん
2006/02/11(土) 17:19:48この仕様によって C と互換性を保っていることが簡単に推測できる。
全部 private だったら friend つけない限り意味無いし。
class の暗黙の private は、この仕様に決めた理由を知らないし、
推測することができない。
俺が無知なだけ?
0857デフォルトの名無しさん
2006/02/11(土) 17:22:40お前が無知なだけ
classというキーワードを作ったそもそもの目的は、
「外部からのフィールドのアクセスが禁止されたstruct」
を作りたかったから。
0858デフォルトの名無しさん
2006/02/11(土) 17:24:510859デフォルトの名無しさん
2006/02/11(土) 17:25:26俺はこんな感じにしてるけど。
class Foo
{
// プライベートなメンバ変数の定義
public:
// コンストラクタに始まるパブリックインターフェイス
protected:
// 派生クラスへのインターフェイス
private:
// プライベートなメンバ関数
};
0861デフォルトの名無しさん
2006/02/11(土) 17:30:39そんなのは知ってるよ。
でも お前が無知なのに変わりは無いよ。
0862デフォルトの名無しさん
2006/02/11(土) 17:38:140863デフォルトの名無しさん
2006/02/11(土) 17:39:09真っ先に気にならない奴って、C++におけるコピーとか代入とか
STLコレクションの挙動とかを全く理解してないんだろうと推測できる。
privateメンバ変数が超巨大で、その下に書いてあるpublic部分が
画面外に追いやられるような状況なら、分割かpimplを真剣に検討すべき。
0864デフォルトの名無しさん
2006/02/11(土) 17:40:41>>857で十分だと思うが
0865デフォルトの名無しさん
2006/02/11(土) 17:43:230866デフォルトの名無しさん
2006/02/11(土) 18:30:15あんたはSTLコンテナのイテレータが保持しているメンバ変数の数とかサイズとかを気にしているの?
0867デフォルトの名無しさん
2006/02/11(土) 18:50:030868デフォルトの名無しさん
2006/02/11(土) 18:56:200869デフォルトの名無しさん
2006/02/11(土) 18:58:02コピーのコストは気にするよ。
0870デフォルトの名無しさん
2006/02/11(土) 18:58:38ルールを決める立場には問題が残る。
0871デフォルトの名無しさん
2006/02/11(土) 19:00:58だからって真っ先には気にならない。
クラス定義に現れる順番は public インターフェースの後ろでいい。
0872デフォルトの名無しさん
2006/02/11(土) 19:09:36知っとかないと問題のある事は仕様として公開するべきじゃないのか?
>>869の例なら内部に巨大なデータを保持していてコピーに時間がかかる事を
書いておくな俺だったら
0873デフォルトの名無しさん
2006/02/11(土) 19:09:46コンストラクタをprivateにしてSingletonや継承禁止にしたり、
コピーコンストラクタや代入演算子をprivateにしたりする事があるよな。
「明示的にprivateにしている」事もpublicインターフェイスを
構成している(コピーできない、構築できない、継承できない等)
場合があるが、お前はそれはどこに書くの?
0874デフォルトの名無しさん
2006/02/11(土) 19:16:04>内部の細かい仕様を覗き見させないで
それは要するにpimplで解決。
>知っとかないと問題のある事は仕様として公開するべきじゃないのか
C++の場合、例えprivateでも、メンバ変数のサイズは
「知っとかないと問題のある事」の1つだろ。
private関数は、ユーザーが知る必要は全くないけど。
0875デフォルトの名無しさん
2006/02/11(土) 19:20:09>>873はクラスを見たとき必ずprivateを真っ先に見るのか?
privateの中身が問題になる事があるって言っても
publicよりprivateのほうを良く見るって事にはならないだろ
>>874
ヘッダにクラス設計として実装されてることを公開って言ってるわけじゃない。
0876871
2006/02/11(土) 19:25:07コピー不可については自明なことも多いので
boost::noncopyable が使えればそれで。
使えなければ単純な private ブロックの直前に別で書く。
// noncopyable
private:
例の奴ら
private:
...
その他、構築できない、継承できないなどは
クラスについてのコメントとしてクラス定義の直前に理由を添えて書く。
0877デフォルトの名無しさん
2006/02/11(土) 19:31:14private なメンバ変数のサイズをクラス定義を見て知ったとしても、
それに依存したコードを書くのはダメだろ。
問題が起こってから解決のためにサイズに依存した
回避コードを書くことはあるかもしれないが。
0878デフォルトの名無しさん
2006/02/11(土) 19:40:19メンバ変数は先頭にアクセス指定無しで書かれてる。
structならpublic、classならprivateとなる。
Bjarneとしては、classとstructの違いを活かして
メンバ変数は先頭にまとめて書け、って方針みたいだ。
0879デフォルトの名無しさん
2006/02/11(土) 19:44:32sizeof(class)に依存したコードなんて書く池沼がどこにいるの?
0880デフォルトの名無しさん
2006/02/11(土) 19:48:24ふむ、ってことは、
先頭にメンバ変数を書かないのは基本的にはマイナーな俺ルールなのか。
自分の書き方は先頭派で禿と同じで少し安心。
0881デフォルトの名無しさん
2006/02/11(土) 19:50:590882デフォルトの名無しさん
2006/02/11(土) 20:39:48先にpublicを書けと言っていたはずだが
>>878
>>880
すごい自演を見た
0883デフォルトの名無しさん
2006/02/11(土) 20:50:15それはメンバ関数の話じゃないの?
禿げの本では、どれもメンバ変数は先頭に書いてるよ。
0884デフォルトの名無しさん
2006/02/11(土) 20:53:37public->privateの順で書くよりも
private->publicの順で書く方がprivateが短く書けるから
本ではそう書くようにしているとも言っている
0885デフォルトの名無しさん
2006/02/11(土) 20:54:26+ privateをを省略出来て短く書けるから
0886デフォルトの名無しさん
2006/02/11(土) 20:58:08ソースキボンヌ
0887デフォルトの名無しさん
2006/02/11(土) 20:59:11確か禿本の最初の方だったと思う
0888デフォルトの名無しさん
2006/02/11(土) 21:04:56遅レスだが・・
print()をインターフェースで分離する・・に1票
0889デフォルトの名無しさん
2006/02/11(土) 21:16:02いやちょっとその意見にはさすがに納得できない
0890デフォルトの名無しさん
2006/02/11(土) 21:18:46結局のところ、>>816をリファクタリングするのか、
>>816をそのまま実現するかで話は違ってくる。
>>816をそのまま実現するなら、print()の中でswitch〜caseするのが
一番素直な方法だと思うが。
typedef void (hoge::*hoge_print_t)();
static hoge_print_t hoge_print_table[] ={
&hoge::print_a, &hoge::print_b
};
void hoge::print(){
this->*(hoge_print_table[ m_num - 1 ])();
}
こんな方法もあるにはあるけど。
0891デフォルトの名無しさん
2006/02/11(土) 21:27:25書籍にコードを載せる際には、そういうのが結構あるんじゃないかと思う。
public:
とかだけで普通、一行食うし。
0892デフォルトの名無しさん
2006/02/11(土) 21:30:40>>816をそのまま実現すると巨大な一枚岩クラスの温床になりかねないので
そこから「改造」したいなあぁ・・って感じです
使い捨てAPLならば、switch〜caseに1票
0893デフォルトの名無しさん
2006/02/11(土) 21:37:44ヒント: 紙面の都合上
0894デフォルトの名無しさん
2006/02/11(土) 21:46:05って意味か
0895デフォルトの名無しさん
2006/02/11(土) 22:00:430896デフォルトの名無しさん
2006/02/11(土) 22:28:19一秒のtypingをケチるような奴は関数名や変数名もろくでも無いものにしているのだろうな。
0897デフォルトの名無しさん
2006/02/11(土) 22:28:34ってありですか?
0898デフォルトの名無しさん
2006/02/11(土) 22:35:26>>882
0899デフォルトの名無しさん
2006/02/11(土) 22:38:57できる。
もちろんそれ以降メンバ変数・関数を扱わないこと。
また、大抵の場合はnewで確保されたものでないとだめだろうから、それにも気を付けること。
0900デフォルトの名無しさん
2006/02/11(土) 22:42:38ありがとうございます。
できるんですね。
自己消滅できれば便利なのになーとか考えてたんですが、
delete thisについて書かれてるようなものが見つからなかったので,,,
0901デフォルトの名無しさん
2006/02/11(土) 23:03:31やめとけ、メンドクサイ。だいたい、ほんとで探したのか?すでに FAQ の一つだぞ。
ttp://www.tietew.jp/cppll/archive/11457
ttp://www.parashift.com/c++-faq-lite/freestore-mgmt.html#faq-16.15
0902デフォルトの名無しさん
2006/02/11(土) 23:13:45ありがとうございます。
その二つは見つけてませんでした。すいません。
ただ、それほど面倒なことにはならないなぁってのが第一感想です
#もちろんきーつけて使えばの話ですが。
0903デフォルトの名無しさん
2006/02/11(土) 23:13:51すれどのラッパークラスとかの場合は便利
>>901
> CWnd::GetSafeHwnd()
目から鱗が2枚落ちました
0904デフォルトの名無しさん
2006/02/12(日) 00:11:30間違っても仮想関数で真似するなよ。
0905デフォルトの名無しさん
2006/02/12(日) 00:52:09ヌルポインタに対するメンバ関数呼び出しの時点で未定義動作だ。
仮想関数関係無しに真似しちゃイカン。
0906デフォルトの名無しさん
2006/02/12(日) 00:55:24やべ、そうだったのか。
ってことは
struct tree{
int value;
tree*left,*right;
int size(){
return this?left->size()+right->size()+1:0;
}
};
こういうソースは駄目なのか......
んー面倒だなー
0907デフォルトの名無しさん
2006/02/12(日) 01:37:01そんなソース、貧乏人しか書かない時代なんだが。
0908906
2006/02/12(日) 01:44:25これ以外にも自己再帰的なデータ構造を扱うときに
this==NULLを終端条件とした再帰を書きたくならない?
俺は結構なるけどなー。まぁ未定義らしいしやめとくか
0909デフォルトの名無しさん
2006/02/12(日) 02:25:340910デフォルトの名無しさん
2006/02/12(日) 11:37:35あらま・・ヌルオブジェクトパターンを簡易に書けるかと思ったら
VC限定仕様だったみたいですね
>>906もそれは同じ・・かな
0911デフォルトの名無しさん
2006/02/13(月) 01:39:140912デフォルトの名無しさん
2006/02/14(火) 04:42:44なぜこんなにもSTLのエラーメッセージはわかりづらいのだろう?
0913デフォルトの名無しさん
2006/02/14(火) 05:14:32それはあなたが馬鹿だからです。
0914デフォルトの名無しさん
2006/02/14(火) 08:06:200915デフォルトの名無しさん
2006/02/14(火) 08:40:350916デフォルトの名無しさん
2006/02/14(火) 09:43:15std::istream& operator<<(std::istream& is, myclass& o);
('A`)…
0917デフォルトの名無しさん
2006/02/14(火) 09:49:52配列を初期化しながら確保できるようにはならんかね?
デフォルトコンストラクタ無いとだめか。
しかし、初期化漏れを防ぐために敢えて
デフォルトコンストラクタを作ってなかったのだが・・・
0918デフォルトの名無しさん
2006/02/14(火) 09:51:17g++ だろ?
エラーメッセージ翻訳フィルタでも作ればウケるかも
0919デフォルトの名無しさん
2006/02/14(火) 09:59:17std::vector じゃダメか?コピーコンストラクタ要るけど。
0920デフォルトの名無しさん
2006/02/14(火) 10:34:45struct Point
{
int x, y;
Point( int a, int b ) : x(a), y(b){}
};
Point points[] ={
Point( 0, 0 ), Point( 0, 1 ), Point( 1, 0 ), Point( 1, 1 )
};
普通にできるが…
0921デフォルトの名無しさん
2006/02/14(火) 10:46:16あれが通ってたのはコピーコンストラクタがあったからか。
しかし内部の実装みてないけどコピーコンストラクタがあったとしても
なんでそれで通るんだろう。ていうか、初期化されてるんだろうか。
>>920 そういう形式の初期化はできますね。
配列の要素一つごとにざくっとコンストラクタ
呼んでくれればべんりだなぁ、と。
0922デフォルトの名無しさん
2006/02/14(火) 10:51:07>>917
配列の要素一つごとに、異なる初期値を与えたいの?
0923デフォルトの名無しさん
2006/02/14(火) 10:56:22class ValuePair {
double v1;
double v2;
public:
ValuePair(double initial_v1, double initial_v2)
: v1(initial_v1), v2(initial_v2){}
};
というクラスを作っておいて、
ValuePair value_pairs[100](0.5, 0.6);
のようにして全部同じコンストラクタ連続的に呼んでくれたらな、って。
0924デフォルトの名無しさん
2006/02/14(火) 11:02:29{
OreClass value;
OreGenerator() : value( 10, 0 ){} // 適当な初期値
operator OreClass() const{ return value; }
};
std::vector<OreGenerator> v( 100 );
OreClass ore = v[0];
0925デフォルトの名無しさん
2006/02/14(火) 11:09:35テンプレート関数の実装は、必要になるまでコンパイルされない。
よって、std::vectorも、要素のデフォルトコンストラクタは
実際に必要になるまで呼ばれない。
その用途なら、以下のコードで十分。
ValuePair value( 0.5, 0.6 );
std::vector<ValuePair> value_pairs( 100, value );
0926デフォルトの名無しさん
2006/02/14(火) 11:09:580927デフォルトの名無しさん
2006/02/14(火) 11:12:43それが一番すっきりしそうですね。
幸い operator= は定義済みですし。
コンテナクラスライブラリってオーバーヘッドやだな、
なんて思ってたんですが、std::vector<T> って中身は
まんま配列っぽい。
0928デフォルトの名無しさん
2006/02/14(火) 11:20:260929デフォルトの名無しさん
2006/02/14(火) 11:35:00テンプレートクラスを定義しているヘッダファイルの
行番号が表示されるから、いったいどこの実体化で
エラーになったのか分かりづらいっすね。
0930デフォルトの名無しさん
2006/02/14(火) 12:13:57template <class T> f(int i, int j) {}
template <class T> operator()(int i, int j) {}
};
X x;
関数テンプレートで、引数からテンプレートパラメータが決まらない場合は
x.f<double>(1, 2);
のように明示することができます。
operator()の場合にはどのように呼び出せばよいですか。
x<double>(1, 2); // NG, undefined operator()
x.operator()<double>(1, 2); // OK, でもなんか見た目が変
0931デフォルトの名無しさん
2006/02/14(火) 12:17:58Borland なんかもうちっとマシなメッセージ吐くぞ
ときどき日本語おかしかったりするけど
0932デフォルトの名無しさん
2006/02/14(火) 12:22:38見た目変ですけれど,それが正しい構文ですしそれ以外にないと思います.
呼び出し側でキャストをかけるとか,
type2type な形で型の情報を引数として引き渡せるようにするとか,
いくつか改善策はあるとは思いますけれど,決定的なものはないかと.
0933デフォルトの名無しさん
2006/02/14(火) 14:02:46templateメソッドは引数の型で
一意に定まった方が使いやすい
0934デフォルトの名無しさん
2006/02/14(火) 14:27:09void *vp;
〜略〜
*ip++ = 10;
*(int*)vp++ = 10;
とすると、「error C2036: 'void *' : サイズが不明です。」というエラーがでます
結局のところ、
*(int*)vp = 10; vp = (int*)vp + 1;
をやりたい訳なんですが、
*ip++ = 10;
みたいな書き方、voidポインタでは出来ませんか?
0935デフォルトの名無しさん
2006/02/14(火) 14:31:58* より 前置++/後置++ の方が後回し
0936デフォルトの名無しさん
2006/02/14(火) 14:34:55と思ったけど何か違うみたい
スルー推奨
0937デフォルトの名無しさん
2006/02/14(火) 14:49:17*((int*)vp)++
だとうまくいくみたい。
キャストと++は同順位で右左だから、という説明でいいのかな。
0938デフォルトの名無しさん
2006/02/14(火) 14:52:58無名の共用体を使っては?
0939デフォルトの名無しさん
2006/02/14(火) 14:53:51非標準
0940デフォルトの名無しさん
2006/02/14(火) 15:36:40それVC++2003toolkitだとC2105だった。
0941937
2006/02/14(火) 16:41:41すまんかった>934
0942デフォルトの名無しさん
2006/02/14(火) 17:27:47よくない
規格票でも K&R でもいいが、
単項と後置の優先順位を確認してみては?
0943934
2006/02/14(火) 17:36:22そういう事は出来ない感じと、受け止めましたので
*(int*)vp = 10; vp = (int*)vp + 1;
で行きますです。m(_ _)m
0944デフォルトの名無しさん
2006/02/14(火) 17:42:02union {
int* ip;
void* vp;
};
cout << vp;
ip++;
cout << vp;
は試したか?
0945デフォルトの名無しさん
2006/02/14(火) 18:06:11組み込み型のインクリメント演算子などのオペランドには左辺値が必要。
だからこうして参照を使えばとりあえずできる。
typedef int* pint;
*reinterpret_cast<pint&>(vp)++ = 10;
ちなみにtypedefを使わないでやるとするとreinterpret_cast<int&*>(vp)になる。
0946934
2006/02/14(火) 18:10:29無名共用体を使う場合、どうやるのかイメージが湧きませんでした。
なるほど、そういう意味だったのですね!
vpが引数で与えられてるので、共用体でやるとしたら、無名じゃない共用体で、という事でしょうか。
それでも、共用体の方が可読性いいかもしれませんね。
ありがとうございました。
0947934
2006/02/14(火) 18:13:34reinterpret_cast<int&*>(vp)
すみません・・・これ、なんという手法ですか?
勉強不足でお恥ずかしいのですが、よく知らないのです。
ググってきますので、ヒント下さいますでしょうか?
0948デフォルトの名無しさん
2006/02/14(火) 18:15:320949デフォルトの名無しさん
2006/02/14(火) 18:18:28ワラタ
0950デフォルトの名無しさん
2006/02/14(火) 18:28:27int&* って何だ? ( int*& なら知ってるが)
0952デフォルトの名無しさん
2006/02/14(火) 22:39:54実装依存なのはわかって言ってるんだろうな?
0953デフォルトの名無しさん
2006/02/14(火) 23:10:53void* が必要な場面で実装非依存とは、例えば?
0954デフォルトの名無しさん
2006/02/14(火) 23:15:34>>952じゃないけど、たとえば
void somefunc(void (*fp)(void *, int), void *dat)
{
fp(dat, 4);
}
void f(void *pi, int n)
{
std::cout << n + static_cast<int *>(pi)[3];
}
void g()
{
int a[10];
somefunc(f, a);
}
0955デフォルトの名無しさん
2006/02/14(火) 23:26:150956デフォルトの名無しさん
2006/02/14(火) 23:26:45意図が見えない
もともと int* だったのが明らかでキャストし直していると言うならそもそも void* にする必要性はないし
例えばと言ったのはコード片じゃなく応用分野だ
int* pi = 0;
void* pv = pi;
↑
こんなのをわざわざ尋ねたりはしない
0957デフォルトの名無しさん
2006/02/14(火) 23:35:550958デフォルトの名無しさん
2006/02/14(火) 23:40:02somefuncはライブラリ関数で、コールバックと、それに渡す補助データとしてvoid *の値を取る、と考えてくれ。
somefuncのユーザは、コールバックにint *を渡したいが、型を合わせるためにいったんvoid *にキャストして渡し、
それをコールバックで受けてint *に戻して使う。
0959958
2006/02/14(火) 23:40:540960デフォルトの名無しさん
2006/02/14(火) 23:41:04エンディアンはどーすんべ?
0961デフォルトの名無しさん
2006/02/14(火) 23:42:010963デフォルトの名無しさん
2006/02/14(火) 23:43:43関係無い話を持ち出すな。
0964デフォルトの名無しさん
2006/02/14(火) 23:45:00<algorithm> ではなく extern "C" 関数を使う場面とその理由は?
0965デフォルトの名無しさん
2006/02/14(火) 23:45:08初歩的過ぎてなんて調べたら良いのか分からないのでここで。
a[1][1],a1][2],a[2][1]a[2][2] = 1;
ってやるとエラー吐くんですけど、括弧とかどこに付けたら良いですかね(´・ω・`)
0967デフォルトの名無しさん
2006/02/14(火) 23:45:18実装依存かどうかが論点のはず
0968デフォルトの名無しさん
2006/02/14(火) 23:46:07944,945 は void* と int* の表現形式に互換性があることに依存している。
例えば void* が 64bit で int* が 32bit だったら不味いことになる。
0969958
2006/02/14(火) 23:46:45説明のためだから。
>>965
何がしたい?四箇所に一を代入したいなら、
a[1][1] = a[1][2] = a[2][1] = a[2][2] = 1;
0971デフォルトの名無しさん
2006/02/14(火) 23:56:240972デフォルトの名無しさん
2006/02/14(火) 23:57:15そんなら qsort も実装依存ですな
>>969
じゃ、>>956 へのレスとして何の説明がしたかったんだ??
0973デフォルトの名無しさん
2006/02/15(水) 00:00:40「何が」の違いは今あなたが持ち出したことだ
0974958
2006/02/15(水) 00:03:31>そんなら qsort も実装依存ですな
int *とvoid *の表現形式が違ったとしても、
int *からvoid *に変換し、それをさらにint *に戻したとき、
これが最初の値と変わらないことは規格で保障されている。
だから、qsortは実装依存ではない。
>じゃ、>>956 へのレスとして何の説明がしたかったんだ??
実装に依存せずにvoid *を使うことができる、ということ。
0975デフォルトの名無しさん
2006/02/15(水) 00:07:25を渡すして動作するかどうかは処理系依存。
int compare(void* va, void* vb) {
int* a = (int*)va;
int* b = (int*)vb;
...
}
なら良い!
0976デフォルトの名無しさん
2006/02/15(水) 00:07:45だから、次スレよろ
0977デフォルトの名無しさん
2006/02/15(水) 00:10:12さっさと次スレに移るか。
0978デフォルトの名無しさん
2006/02/15(水) 00:16:31任意のデータ型のポインタをvoid*に代入し
再度元のデータ型に戻すと、元のポインタが確実に復元できることは規格で保証されている。
・・・Cでは。
C++でも、Cスタイル/static/reinterpretなキャストなら
(つーか、void*にdynamic_castとか出来ないし)
保証されていそうな気がするが。
0979v(^・^)v
2006/02/15(水) 00:17:120981デフォルトの名無しさん
2006/02/15(水) 00:18:35while($s =~ /^(.).*/g)
とか
$a =~ s/^(.)//;
とか
意味わからなす・・
perl
これをC++でよろしく。
0982デフォルトの名無しさん
2006/02/15(水) 00:20:31>>968
0983デフォルトの名無しさん
2006/02/15(水) 00:22:14状態遷移表くらい書けるようになっとけよ
0985デフォルトの名無しさん
2006/02/15(水) 00:23:19>>968はそんなこと分かってると思うんだが。
>>968が問題にしてるのは、正規の変換を経ずに
unionや参照のキャストを使ってvoid *をint *として扱った場合の話だろ。
0986デフォルトの名無しさん
2006/02/15(水) 00:23:54上は$sという変数に、^(.).*でパターンマッチした結果を条件式にしてる
このパターンマッチだと、行がある限りだな
2個目は行先頭の1文字を消してる
多分これであってると思うが、違ってたらシラネ
0987デフォルトの名無しさん
2006/02/15(水) 00:24:27特に
$s =~ /^(.).*/g
とか
$a =~ s/^(.)//;
とか
いったい~から始まる奴が何して代入してるんだって感じだどもさ
ってか相談してもいいだろさー
0988デフォルトの名無しさん
2006/02/15(水) 00:24:48reinterpret_cast を何だと思っているわけ?
0989デフォルトの名無しさん
2006/02/15(水) 00:25:29そのちょっと最初は興味あったけど
やっぱ興味ないわーーー
ってところに女はほれたんだな・・そうなんだろ?
0990デフォルトの名無しさん
2006/02/15(水) 00:27:01>>985
あなたが何を主張しているのかはわかった
0991デフォルトの名無しさん
2006/02/15(水) 00:27:09わけわからん。もうちょっとくわしく。
0992デフォルトの名無しさん
2006/02/15(水) 00:29:06あれってC形式のキャストと変わらなくね
0993デフォルトの名無しさん
2006/02/15(水) 00:29:28static_cast ではなく reinterpret_cast を使う場合の理由と
無名の共用体を使う場合の理由はどう違うんだ?
0994デフォルトの名無しさん
2006/02/15(水) 00:32:02さもなきゃdefineしろ
それもだめなら考えうる全ての型を実装しろ
ってこと?
次スレまだー?
0995デフォルトの名無しさん
2006/02/15(水) 00:33:27参考のサイトを参照しながら
$a =~ s/^(.)//;
はわかった。
Cでの書き方もおそらくわかると思うけど
$s =~ /^(.).*/g
もっと詳しく教えてくれ。
~ /^(.).これで一文字目と二文字目なのかな??
よくわからんからこれをCでどう書くのか
暇だったら世路。
0996デフォルトの名無しさん
2006/02/15(水) 00:34:09union {int *upi; void *upv} u;
int *pi;
void *pv;
pi = static_cast<int *>(pv); /* ok */
pi = reinterpret_cast<int *>(pv); /* ok; 上と同じ */
pi = reinterpret_cast<int *&>(pv); /* ng */
u.upv = pv;
pi = u.upi /* ng; 上と同じ */
0997996
2006/02/15(水) 00:35:38>pi = reinterpret_cast<int *>(pv); /* ok; 上と同じ */
これは無しで。
0998デフォルトの名無しさん
2006/02/15(水) 00:37:04解釈は間違ってはないけど微妙に違う
^(.)これが1文字目なのはいいけど、次のは
.じゃなく.*で二文字目以降(無くても可能)って意味
それと正規表現Cで書くってどういうことだ?
まさか自動羊肉実装するのか?
面倒だから鬼車使っとけ
0999デフォルトの名無しさん
2006/02/15(水) 00:39:34ふむなるほど。
いやなんかperlの奴を移植しようかと考えてるんだが
あわよくば
書いてくれるかなって思ったわけ。そこだけ
次スレナインか?
1000デフォルトの名無しさん
2006/02/15(水) 00:40:4510011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。