C++相談室 part56at TECH
C++相談室 part56 - 暇つぶし2ch116:名無しさん@そうだ選挙に行こう
07/07/29 20:20:38
>>103
Boost Consultingにインストーラあったと思ったが

117:名無しさん@そうだ選挙に行こう
07/07/29 20:21:47
ポインタが遅いってなんだ?
エイリアスが無いと判断しにくいから最適化しにくいとかそういう話?

118:デフォルトの名無しさん
07/07/29 20:26:48
>>113
コンストラクタがprivateなのにどうやってインスタンス化しろっての。


119:デフォルトの名無しさん
07/07/29 20:38:07
>109
一昔前ならLoki::Singletonをお勧めしていたところだけど……
boostにSingletonあったっけ?


120:デフォルトの名無しさん
07/07/29 20:40:12
つーかそもそもシングルトン、要るか?

121:デフォルトの名無しさん
07/07/29 20:41:02
いらねーよ。今でも要らないシングルトンが量産されてるってのに。

122:デフォルトの名無しさん
07/07/29 20:41:20
    __    .__
   /|   \ /   |\
 /  |   /     |  \ Nentansoft
|  /\/ ^o^  /\/| 
|/\/     /\/ | J i n s e i O w a t a o 2 0 0 5
 \  |     /   |  /
   \|__/ \__|/

123:デフォルトの名無しさん
07/07/29 20:42:09
>>118
それ static 関係ない。 friend が指定してある。

あれ? friend に内部リンケージの関数って不味くないか?

124:デフォルトの名無しさん
07/07/29 20:47:46
それ、翻訳単位毎にtest関数とその中の
CTestのinstが存在することにならね?

125:デフォルトの名無しさん
07/07/29 20:52:14
>>119
URLリンク(boost.cppll.jp)

126:デフォルトの名無しさん
07/07/29 21:27:24
>>109
テンプレートクラスなら普通にstaticなメンバ変数をヘッダ内に書ける(ODRに違反せずに「定義」できる)んじゃ無かったっけ?
それなら前にやったことがあるけど。
っていうかこれってどうやってるんだろう。やっぱリンカががんばってるんだろうか。

テンプレートじゃなきゃ、別にヘッダだけで収めようとしたことはないなぁ。


127:デフォルトの名無しさん
07/07/29 22:16:17
>>109 コピーコンストラクタを禁止しないのはまずいと思う

128:デフォルトの名無しさん
07/07/30 00:34:51
>>116
いや、便利ライブラリが嫌いなんじゃなくって
STL以外だと会社にもってって使えないいんよね。
便利なパーツは単体で、尚且つインクルード/コピペするだけで
リンカの設定弄らなくてもさくっとコンパイルできるのがいい。

ソース管理されてる環境だとプロジェクトファイルすら弄れないしね。。

129:デフォルトの名無しさん
07/07/30 00:39:49
>>128
同意

130:デフォルトの名無しさん
07/07/30 00:45:12
質問です

「あいうえお」と書いた外部ファイルを読み込んで1文字画面に出力するという操作を実装しようとしたら文字化けしてしまいました。

理由は文字コードが0x82A0なのに対し0x82までしか読み込んでなかったからみたいなのですが、

FILE* fp;
wint_t ch;
TCHAR s;
if( fopen_s(&fp, "word.dat", "r") )
{
MessageBox(NULL, TEXT("ファイルオープンに失敗"), NULL, MB_OK | MB_ICONSTOP);
exit(-1);
}
for(ch=fgetwc(fp); ch!=EOF; ch=fgetc(fp))
{
wsprintf(&s, TEXT("%d"), ch);
MessageBox(NULL, &s, NULL, MB_OK);
}
fclose(fp);

これだと1バイト分しか読み込まないのでしょうか?
また、2バイト読み込むにはどうしたらいいのでしょうか?

使ってる環境は、
WindowsXP Home Edition
VC++2005 Express Edition
です。

131:デフォルトの名無しさん
07/07/30 00:45:53
BSTRかwchar_t使えば?

132:デフォルトの名無しさん
07/07/30 00:50:28
>便利なパーツは単体で、尚且つインクルード/コピペするだけで
>リンカの設定弄らなくてもさくっとコンパイルできるのがいい。

Boostは大概インクルードだけで使えるけど……

133:デフォルトの名無しさん
07/07/30 00:53:04
インスコで環境を変えないなら使う

134:130
07/07/30 00:56:53
>>131

できませんでした。
wint_tも2バイト変数なのでfgetwcで2バイト読み込んでないということだと思うのですが、
fgetwcでは2バイト読み込むことは出来ないのでしょうか?

135:デフォルトの名無しさん
07/07/30 01:00:43
>>130
C言語の上にバグ持ちのVC++8.0か

環境依存スレ向きの話題じゃないのか

136:デフォルトの名無しさん
07/07/30 01:08:11
TCHAR s; //<--1バイト?2バイト?
wsprintf(&s, TEXT("%d"), ch);

TCHARってコンパイルの環境によって定義かわらない?

137:デフォルトの名無しさん
07/07/30 01:11:05
TCHARの定義はUNICODEが定義されているかどうかで変わるし
fgetwc()とfgetc()を混ぜこぜにしてるし
> TCHAR s;
> wsprintf(&s, ...
って何だそら
ムチャクチャだ

138:デフォルトの名無しさん
07/07/30 01:14:30
Cのwchar_tがらみの関数はsetlocale()を実行しておかないと
まともに動かん

VC++8.0の場合はバグのせいで、どっちみちw系のコンソール入出力が
腐るので諦めろ

139:デフォルトの名無しさん
07/07/30 01:17:31
VC++8ってそうなのかw
TCHAR WCHARとかじゃなく
明示的にchar wchar_tとか書いてもだめなん?

140:デフォルトの名無しさん
07/07/30 01:19:18
imbue

141:デフォルトの名無しさん
07/07/30 01:20:09
>>139
有名な話だよ。SP1でも直ってない。
URLリンク(forums.microsoft.com)
参照。

142:デフォルトの名無しさん
07/07/30 01:23:53
>>140
Cにはimbueも糞も無いんだが。
以下のコードがVC8.0では期待したように動かない。
#include <stdio.h>
#include <wchar.h>
#include <locale.h>
int main(void)
{
    wint_t c;
    setlocale(LC_CTYPE, "");
    while ((c = getwchar()) != WEOF)
        putwchar(c);
    return 0;
}

143:デフォルトの名無しさん
07/07/30 01:25:08
ほんまやw
MSだせーな
BCC32マンセーしててしらんかったわw

144:130
07/07/30 01:38:26
みなさんアドバイスありがとうございました。

VC++8.0にはバグがあったんですね…

bccでコンパイルしてみることにします。

145:デフォルトの名無しさん
07/07/30 01:39:52
>>130
ざっくり見直してみたけどこれでどうよ?

FILE* fp;
wint_t ch;
wchar_t s[32]; //10進数の文字表現を格納する?

if( fopen(&fp, "word.dat", "r") )
{
MessageBoxW(NULL, L"ファイルオープンに失敗", NULL, MB_OK | MB_ICONSTOP);
exit(-1);
}
for(ch=fgetwc(fp); ch!=EOF; ch=fgetwc(fp))
{
wsprintf(s, L"%d", ch);
MessageBoxW(NULL, s, NULL, MB_OK);
}
fclose(fp);


146:デフォルトの名無しさん
07/07/30 01:41:26
>>145
WEOFにしないと無限ループ

147:145
07/07/30 01:42:18
ああスマン

148:130
07/07/30 02:07:48
>>147

このソースでも文字コードが0x82と0xA0いうふうに分かれて表示されてしまいました

やはりBCCを使ったほうがいいということなのでしょうか…

149:デフォルトの名無しさん
07/07/30 02:09:19
ん?もしかして
fopen/fcloseじゃなくて、wfopen/wfcloseじゃないとだめとかある?

150:デフォルトの名無しさん
07/07/30 02:09:55
>>148
setlocale(LC_CTYPE, "");
をプログラムのドアタマで実行汁。

151:デフォルトの名無しさん
07/07/30 02:10:37
>>149
関係ねー
それらはUTF-16なパス名でストリームを開く、というだけだ

152:130
07/07/30 02:30:11
>>150

出来ました!
ロケールというものを設定しないといけなかったんですね!

ロケールについて調べてみたらよくわからなかったんですが、
ロケールとはパソコンの情報の表示形式みたいなものと考えていいのでしょうか?

153:デフォルトの名無しさん
07/07/30 02:37:35
>>152
ロケールは貨幣や数値、時刻の形式なども扱うが、この場合は
LC_CTYPEというカテゴリを指定してやることで、
文字エンコーディング(SJISだのEUC-JPだの)をCランタイムに
教えてやっている。「""」は、「実行環境に応じて良きにはからえ」という
意味だ。Cランタイムはそれに応じてワイド文字とマルチバイト文字の
変換を行う。

154:130
07/07/30 03:02:24
>>153

なるほど、だからロケールを設定してないときの読み込み方がおかしかったんですね

わかりやすく教えていただきありがとうございました!

155:デフォルトの名無しさん
07/07/30 08:17:11
型Tから型Uへの変換が存在するかどうかを調べるtemplateの手法ってありますか?
具体的には次のようなことをやりたいのですが…

template<typename T>
struct PtrWrapper { T* p; };

class A {...};
class B : public A {...};

PtrWrapper<A> a;
PtrWrapper<B> b;

a = b; // 可能
b = a; // 不可能


156:デフォルトの名無しさん
07/07/30 11:44:19
template <typename T, typename U>
class Conversion
{
typedef char Small;
class Big { char dummy[2]; };
static Small Test(U);
static Big Test(...);
static T MakeT();
public:
enum { exists = sizeof(Test(MakeT())) == sizeof(Small) };
};

int main() {
using namespace std;
cout
<< Conversion<double, int>::exists << endl
<< Conversion<char, char*>::exists << endl
<< Conversion<size_t, vector<int> >::exists << endl
<< Conversion<A*, B*>::exists << endl
<< Conversion<B*, A*>::exists << endl;
}

詳しくは Modern C++ Design 参照。

157:デフォルトの名無しさん
07/07/30 16:10:51
iGoogleで複数のコンテンツを追加してみると、
追加したコンテンツをドラッグ&ドロップで移動できるのですが、
そのUIを、WinXPSP2上のVS2005 C++ Windowsフォームにて実装してみたくて調査中なのですが、
技術的に停滞中です。

フォームにPanelを配置し、そのパネルをドラッグ&ドロップすればよいのかと思うのですが、
パネルのドラッグ&ドロップが出来ません。。

何かサンプルありませんか?

158:デフォルトの名無しさん
07/07/30 16:26:33
MFCのCOleDropTargetクラスあたりかなぁ?

159:デフォルトの名無しさん
07/07/30 17:46:58
ありがとうございます。
COleDropTargetですか。ちょっとみてみましたが、
楽チンポンとは行かないみたいですね。
ちょっと勉強にいそしみます。


160:デフォルトの名無しさん
07/07/31 00:30:10
>>156
ありがとう!
ていうか解説読んで感動しました…

161:デフォルトの名無しさん
07/07/31 09:22:22
>160
どうせ中では同じようなことをやってるはずだけど、使えるなら Boost TypeTraits を使うのが楽。この場合は is_convertible

162:デフォルトの名無しさん
07/08/01 05:03:00
placement delete は
対応する placement new の実行中に例外が発生した場合に呼ばれるからという
ただそれだけのために存在する、という認識で問題ありませんか?

163:デフォルトの名無しさん
07/08/01 06:18:29


164:デフォルトの名無しさん
07/08/01 06:24:12
struct s{ s(){puts("s");} };
と定義して
struct s s_obj();
としてもコンストラクタが呼ばれないんですが、
俺何か間違ってるんでしょうか?

165:デフォルトの名無しさん
07/08/01 06:31:42
それは「struct sを返す関数」の宣言

166:デフォルトの名無しさん
07/08/01 11:23:21
struct s s_obj; としないといけない。
もっとも、s s_obj; で十分だが。

167:デフォルトの名無しさん
07/08/01 12:24:54
>>162
どうせ君は使わないだろうから問題ないよ。
人と話すときにはその話題避けてればいいんだし。

168:デフォルトの名無しさん
07/08/01 12:32:58
>>162
違う。正しくは
対応する placement new が成功した後のコンストラクタで例外が発生した場合に以下同文。

169:デフォルトの名無しさん
07/08/01 13:11:18
placement new というと、規格を見ると new の構文は

new-expression:
 ::(opt) new new-placement(opt) new-type-id new-initializer(opt)
new-placement:
 ( expression-list )

と書いてあって、new-placement ってのはあらゆる引数リストを指す要素のようだけど、
引数つきの new は何でも placement new と呼ぶのか?

170:デフォルトの名無しさん
07/08/01 13:13:10
そういうこと。
最初に想定されたのが配置に関する制御だったので、
placement newと名付けられたが、
使ってみたら色々使い道があったというわけ。

171:デフォルトの名無しさん
07/08/01 13:17:43
Ruby のイテレータみたいなもんか。繰り返さなくてもイテレータ。
っつーことは、「いつもの placement delete」 には特に呼ぶ価値ないけど、
それ以外の placement delete には十分価値があるかもしれんっつーことか。

172:デフォルトの名無しさん
07/08/01 21:46:24
RUBYYYYYYYYYYYYYYYYYYYYYYYY

173:デフォルトの名無しさん
07/08/01 21:53:00
pythonでおk

174:デフォルトの名無しさん
07/08/01 22:31:34
AnsiString GetReg(AnsiString Key, AnsiString Name, HKEY RootKey)
{
AnsiString Value;
TRegistry *Reg = new TRegistry();
Reg->RootKey = RootKey;
if(Reg->OpenKey(Key,false)){
if(Reg->ValueExists(Name))
Value = Reg->ReadString(Name);
Reg->CloseKey();
}
Reg->Free();
return Value;
}

175:デフォルトの名無しさん
07/08/02 00:53:06
テラBCB

176:174
07/08/02 00:57:40
書き込みが途中までしか出来てませんでした。
↓続き
関連する項目をググって、上記ソースを見つけたのは良いのですが、
得た値"Value"をstrcpy(a,b)のbで使おうとすると、
AnsiString型からキャストできず、エラーとなります。
AnsiString型をキャストすること自体がよろしくないようなのですが、
キャストか、他に良い方法がありましたら教えてください。

長文すみません。よろしくお願いします


177:デフォルトの名無しさん
07/08/02 01:01:43
strcpy(dst, AnsiString("あひゃ").c_str());

178:デフォルトの名無しさん
07/08/02 01:13:55
>>177
Value.c_str()でやれということ

179:174
07/08/02 07:30:49
>>177>>178さん
どうもありがとうございます。
助かります。


180:デフォルトの名無しさん
07/08/02 22:26:11
プログラム中から現在のCPUのクロック数を測定したいのですが
どうすればいいでしょうか?


181:デフォルトの名無しさん
07/08/02 22:29:12
>>180
Win32APIのQueryPerformanceFrequencyは?

182:デフォルトの名無しさん
07/08/02 22:32:00
あれはかなりいい
しかしモバイル用CPUとか動的にクロックが変化するCPUだとちょっと困る

183:デフォルトの名無しさん
07/08/02 22:42:28
すいません>>182の理由により別の方法をおねがします
もしかして不可能?

184:デフォルトの名無しさん
07/08/02 22:45:00
条件があったのなら初めに言えよ

185:デフォルトの名無しさん
07/08/02 22:46:46
cpuid命令を呼ぶ
レジスタに信用なら無いモデルナンバーが返って来る
メーカーの資料と照らし合わせる
周波数を知る

186:デフォルトの名無しさん
07/08/02 22:51:17
CPUとは違う固定周波もってるハードに割り込みかけてもらうぐらいしか思いつかん……

187:デフォルトの名無しさん
07/08/02 22:56:08
>現在のCPUのクロック数を測定
だから>>181でFA

188:デフォルトの名無しさん
07/08/02 23:08:53
>>185
ああ、その方法もありますね。しんどいけど。
どこかに cpuid --> cpu clock 変換表みたいなのありませんか?

クロック自体はrdtscで読めるんですが、
最近のCPUは省電力モードとかで
クロック自体が落ちてることもあって
正確なクロックが取得できないんです


189:デフォルトの名無しさん
07/08/02 23:15:32
CPU毎の定格周波数が知りたかったのか?

190:デフォルトの名無しさん
07/08/02 23:24:10
CPU に意図的に負荷かけてから測定するとか。

191:デフォルトの名無しさん
07/08/02 23:40:09
asmでおk

192:デフォルトの名無しさん
07/08/03 16:33:06
可変長のメンバ配列変数は C99 で規格合致になったけど、
C++ だと 9.2p8 を見る限り対応されてなさそうな雰囲気を感じる。
これは、非静的メンバ配列変数のサイズは必ず指定する必要があるという記述だから
ここだけじゃ実際のところはっきりとは分からんけど。

でも、次期 C++ ドラフトを見るとこの記述が削られてる。
これは C99 と同様に可変長のメンバ配列変数に対応された現れだと見ているけど、
そのことが書いてある箇所が見つからない。

C++ での可変長のメンバ配列変数への対応具合の状況はどんな感じなんじゃろか。

193:デフォルトの名無しさん
07/08/03 20:55:47
可変長配列がないならvector使えばいいじゃない(マリー

194:デフォルトの名無しさん
07/08/03 21:23:30
それなら C でも malloc 使えるしー。
でも、本気でそれでも問題ないと思うんだよな。
正直可変長メンバってどのくらい意味があるのか分かんないな。
Windows API とか可変長メンバを要求するところがあるから
しゃーなしで使わんといかんこともあるんだが。

195:デフォルトの名無しさん
07/08/03 21:33:07
ポインタ使うかわりに可変長メンバ使うとメモリ上のレイアウトがフラットに
なるから、そのままファイルに読み書きしたりできて便利な場合もあるでそ

196:デフォルトの名無しさん
07/08/03 22:04:00
stlのアロケータってrealloc操作がないのな。
vectorやstringのサイズ増加時にコピーが走りまくって参った。

197:デフォルトの名無しさん
07/08/03 22:16:19
reserveとかあるだろ
そういうハナシじゃない?

198:デフォルトの名無しさん
07/08/03 22:19:34
ふつうdeque

199:デフォルトの名無しさん
07/08/03 22:25:23
>>195
書き込みは一発だけど、
読み込む時は一旦サイズを読み出さないといかんのだよな。
状況によってサイズが分かる場合もあるけどさ。
そこまでの利点には思えんのよなあ。
昔だとその僅かな差も重要だったんだろうか。

200:デフォルトの名無しさん
07/08/03 22:27:52
>>196
<cstdlib>のreallocも、その場で拡張できなければ、
新しい領域を確保して、そこへ元の記憶域の内容をコピーすることになっている。
クラスインスタンス相手にコピーコンストラクタを使わず複写なんて
やるわけには行かないから、アロケータにrealloc相当の操作がないのも妥当な判断。

仮にやるとしたら、その場で拡張できるときだけ成功するrealloc操作
なんてことになるんだろうな。



201:デフォルトの名無しさん
07/08/03 22:33:47
>>199
malloc()/free()一発で確保・解放できるのも「Cでは」便利
で、特にデメリットも無いわけで
まあ可変長に出来るのは最後のメンバだけ、という制限があるけどな

ま、基本的に言語サポートが貧弱なCで特に生きるテクニックという気がする

202:デフォルトの名無しさん
07/08/03 22:35:49
記憶域の内容がコピーされても、
その後にちゃんとコピーコンストラクタを placement new で呼べば一応正常に動作する。

問題は二度手間になることと、
realloc による管理は C++ っぽくないってところだな。

203:デフォルトの名無しさん
07/08/03 22:36:31
PODのときはrealloc or memcpyするぐらいの配慮が欲しかったなあ
パフォーマンスに関わるんで結局手書きしちゃったよ
無駄にT()でfillするし・・・

204:デフォルトの名無しさん
07/08/03 22:37:30
>>201
どっちゃにしろ動的に確保する場合は
確かに一発で済むから便利か。なるほど。

205:デフォルトの名無しさん
07/08/03 22:40:24
でもまあバッファを拡大するときも、必要な量ぎりぎりではなく、
例えば倍々に増やしていったりする実装の存在なんかを考えれば、
やっぱりコンテナがrealloc相当のことをやっているんだよなと思う。

206:デフォルトの名無しさん
07/08/03 22:42:15
なんでC++にnew/deleteがあってrealloc()相当物が無いのかってのは
Stroustrupが説明してた気がするが、忘れた

207:デフォルトの名無しさん
07/08/03 22:45:50
placement new でコピーコンストラクタ使ってオブジェクト作ってるよ。

208:デフォルトの名無しさん
07/08/03 22:49:31
Win32 APIのVirtual Allocみたいなの使ってアドレス空間だけ予約しとけ

209:デフォルトの名無しさん
07/08/05 02:02:59
シグナルって何に使えばいいの?
中で特別な関数以外の関数呼んだら未定義とか規格に書いてるんだけど。

210:デフォルトの名無しさん
07/08/05 02:04:27
ぶっちゃけsignalがCの標準に含まれているのはどうかと思う

211:デフォルトの名無しさん
07/08/05 02:04:59
マジ?あの欠陥品が?

212:デフォルトの名無しさん
07/08/05 02:05:32
>>209 Unixの規格を読むんだ

213:デフォルトの名無しさん
07/08/05 02:09:07
Posix的にはsignal()は推奨されないでしょ
sigaction()を使うべき

Windowsのコンパイラが提供するsignal()は、規格を満たすためだけの紛い物で
何の役にも立たない

つまりsignal()なんて要らない子

214:デフォルトの名無しさん
07/08/05 02:10:34
いやシグナルという仕組み自体が正直勘弁だ

215:デフォルトの名無しさん
07/08/05 02:11:28
まあスレッド登場前の化石だよな

216:デフォルトの名無しさん
07/08/05 02:14:57
signal handlerからlongjmpがunixの作法ですが何か?

217:デフォルトの名無しさん
07/08/05 02:15:53
おk。大体分かった。

218:デフォルトの名無しさん
07/08/05 02:17:24
それが今となっては最悪の作法だよねって話でしょ
スレッドと相性が非常に悪いし
それでなくとも
シグナルハンドラが再インストールされるかどうかとか
システムコールが再送されるかどうかとか
シグナルハンドラ内であれをやってよいこれはよくないとか
バッドノウハウのすくつやん

219:デフォルトの名無しさん
07/08/05 02:23:03
write一つとっても、linux/*bsd/solaris/hp(dec)でそれぞれ挙動が違うからねえ
posixもM$がサーバ戦略に本腰いれて慌てて始めたもんだしなあ

220:デフォルトの名無しさん
07/08/05 03:22:10
set_terminate ってどういう場合に使う?
main で全ての例外補足してから異常終了した方が
ローカル変数のデストラクタが呼ばれていいと思うんだけど。

221:デフォルトの名無しさん
07/08/05 03:24:59
そういうまともな例外処理が出来ないときのためにあるのでは

例外処理中に例外が出たとか

222:デフォルトの名無しさん
07/08/05 03:27:03
>>220
2行目以降の意味がわからん。 set_terminate() 関係ないだろ。

223:デフォルトの名無しさん
07/08/05 03:36:23
>>221
ああ、二重例外に対応する場合か。なるほど。

224:デフォルトの名無しさん
07/08/05 12:41:24
VS2005 MFCなんだけど、アクセスバイオレーションの例外処理を
捕らえたいんだけど、
try{}
catch( ... ){}
この構文では捕えられないんだけど、どうしたらいい?


225:デフォルトの名無しさん
07/08/05 12:44:09
アクセスバイオレーションて単純にソフトウェアのバグじゃないか?w

226:デフォルトの名無しさん
07/08/05 12:54:51
/EHaとか/EHcがらみじゃないの?

でもデフォルトから変更した場合、
ミドルウェアとか依存するライブラリ絡みの整合性が心配だな。

227:デフォルトの名無しさん
07/08/05 15:14:37
URLリンク(msdn.microsoft.com)
まあC++の範疇じゃないな。

228:デフォルトの名無しさん
07/08/06 06:55:48
構造化例外で捕まえた方が良いと思うヨ。

229:デフォルトの名無しさん
07/08/06 18:19:11
_set_se_translatorという手もある。
いずれにせよVC++くらいしか使えるものがないというのに変わりはないけどな。

230:デフォルトの名無しさん
07/08/06 21:25:46

スレ違いだったらすいません。

アプリ開発の依頼スレが見つからなかったのでこちらに書かせて頂きました。
当方所有のウェブアプリケーションソフト
(以前プログラマに依頼して作ってもらったものですが今は連絡が取れません)
がURL先の変更?で突然使えなくなってしまいました。

そこで、緊急で本日中に改変が出来そうな方是非お願いできないでしょうか?
当方、全くの知識不足で言語が C++ということ以外分かりません。
ソースファイルは持っております。料金は2万円でお願いします!

seishinkeiki@hotmail.co.jp

231:デフォルトの名無しさん
07/08/06 21:29:58
マルチはよくないな

232:デフォルトの名無しさん
07/08/06 21:47:57
やすっ

233:デフォルトの名無しさん
07/08/06 23:11:47
>>230
ソースがあるならソースを晒せよ。ロハでできるぞ。
ソースを晒せないから有料でということなら、2万円なんて人を見下したようなことをするもんじゃない。

234:デフォルトの名無しさん
07/08/07 06:33:04
void foo(char *p, size_t len)
{

}

235:デフォルトの名無しさん
07/08/07 06:34:28
すみません途中で送信してしまいました。

void foo(char *p, size_t len)
{
// ここでpとlenからistreamを作りたい
}

実際には、basic_istreamの派生クラスを作るしかないのでしょうか?

236:235
07/08/07 06:44:00
最初は、std::istringstreamを使って実装していたのですが、バイナリを扱う必要があるので、見送りました。

237:デフォルトの名無しさん
07/08/07 07:39:56
俺判定

↓エスパー1級

238:デフォルトの名無しさん
07/08/07 07:48:18
>>236
ファイルストリーム以外でバイナリとテキストの問題なんて起こらないだろ?
istringstream でいいと思うよ。

239:デフォルトの名無しさん
07/08/07 07:50:42
>>236
なんでバイナリを扱う必要があったら istringstream を見送るの?

240:デフォルトの名無しさん
07/08/07 09:01:36
stringという名前が付いてるからバイナリは扱えないと思っているんだろうな

241:デフォルトの名無しさん
07/08/08 20:13:23
義務教育もしっかり受けてるのに
x = x +1
が疑問でもなんでもない俺は負け組

242:デフォルトの名無しさん
07/08/08 20:15:25
柔軟な思考は大事
固定観念はよくない

243:デフォルトの名無しさん
07/08/08 21:16:13
もう疑問を持ったかどうかすら覚えてないわ

244:デフォルトの名無しさん
07/08/08 21:57:28
>>241
x = x * x + Cならマンデルブロ集合なんだけどね。

245:デフォルトの名無しさん
07/08/09 10:46:54
>>241
むしろそのへんの切り替えが高速にできない子は算数のできない子

246:デフォルトの名無しさん
07/08/09 19:51:16
リアル演算子オーバーロードだよな。

247:デフォルトの名無しさん
07/08/09 19:59:43
要は「今まで習った常識・ルール」に囚われてしまっていて、
新しいルール、新しい前提の上でのゲームには一歩も踏み出せないってことだからな

その程度の頭の柔軟性が無いのでは算数やプログラミングに限らず
何やってもだめ

248:デフォルトの名無しさん
07/08/10 09:40:31
何でも受け入れるのもあれだけどな。
そこに疑問を持ち、考察し、納得する、というプロセスをだな・・・

249:身の程知らず
07/08/10 12:01:33
C++の文法に疑問を持つのは、よほどの天才か身の程知らずのどちらかだろ。
もちろんもっと人間にもコンパイラにも分かりやすくて、すばらしい文法は作れただろうが、
今のような位置を占めているかどうかは疑問だ。


以下、俺様演算子を定義できる機能とか、
Cのプリプロセッサなんかより、もっとプログラマブルで、文法を考慮するマクロとか、
↓禿のお気に入りだったマルチメソッドなどについて語ろう↓

250:デフォルトの名無しさん
07/08/10 12:04:48
>以下、俺様演算子を定義できる機能とか、
演算子オーバロードではお気に召しませんか?

>Cのプリプロセッサなんかより、もっとプログラマブルで、文法を考慮するマクロとか、
C99のプリプロセッサではお気に召しませんか?

それならDをどうぞ。

251:デフォルトの名無しさん
07/08/10 12:06:05
Lispじゃねぇの

252:デフォルトの名無しさん
07/08/10 12:10:18
開発当時はのんびり言語仕様考えるヒマなかったんだろう。
シェア争いを制するために時間を惜しんだんだろ
結局当時は高級言語に負けたが。

253:デフォルトの名無しさん
07/08/10 12:11:29
俺様演算子っていうと、Prolog みたいなやつか。

254:デフォルトの名無しさん
07/08/10 14:42:56
俺様演算子っていうと、Haskell みたいなやつか。

255:デフォルトの名無しさん
07/08/10 14:58:06
Forth なら何でもありだな

256:デフォルトの名無しさん
07/08/10 15:05:03
禿は演算子オーバーロードは必要最小限に抑えたほうが良いと言ってなかったか

257:デフォルトの名無しさん
07/08/10 15:54:28
おまいは禿が死ねって言ったら死ぬのか?

258:デフォルトの名無しさん
07/08/10 16:32:06
詭弁のガイドライン

259:デフォルトの名無しさん
07/08/10 17:05:23
おまいは「おまいは禿が死ねって言ったら死ぬのか?」ってレスを見たら詭弁だと短絡的に思うのか?

260:デフォルトの名無しさん
07/08/10 17:07:20
次の相談者の方、どうぞ↓

261:デフォルトの名無しさん
07/08/10 17:10:30
禿はC++に関しての第一人者だけど、死に関しての第一人者じゃない。
詭弁じゃないと言うなら、何をもって
「禿は演算子オーバーロードは必要最小限に抑えたほうが良いと言ってなかったか」
「おまいは禿が死ねって言ったら死ぬのか?」
というのが同じ重みがあるとするのかを明確化しろ。


262:デフォルトの名無しさん
07/08/10 17:44:52
物事の良し悪しは他人任せにせずに自分で考えましょう、
と注意する場合の定型句だと思うが。

263:デフォルトの名無しさん
07/08/10 18:16:58
ならそう書けばいいんじゃないかなw

264:デフォルトの名無しさん
07/08/10 18:21:40
なんでも平たく書き下すんじゃなく、
慣用句等あれば使うのが文化って奴だろ
その点APLなんかすごいぞ

265:デフォルトの名無しさん
07/08/10 18:26:07
論点ずらしの天才

266:デフォルトの名無しさん
07/08/10 18:34:21
演算子と人の生死を結びつけるところが正直よく分からん

267:身の程知らず
07/08/10 18:45:10
禿があれほどD&Eで多くのページを割いて、規格に入らなかったことを悔しがっているのに、
一言も突っ込まれないマルチメソッド哀れ。

まあ、正直言ってまず使わないと思うけど。

268:デフォルトの名無しさん
07/08/10 19:05:50
(動的)マルチメソッドマジ欲しい。
Lokiにもマルチディスパッチの実装あるけど、さすがに面倒だ。
でも、コンパイラの実装大変そうだよね。

演算子オーバーロードはPEGとかEBNFを実装するためにあると思うんだ。

269:デフォルトの名無しさん
07/08/11 12:00:15
質問があります。
class A
class B
class C
があるとして、class Cをclass AとBのメンバに持たす時、
class AとBのインスタンスを複数作った場合、メンバであるclass Cも
複数作成されてしまうと思います。
そこで、classA、B共に一つずつしかclass Cを作らないようにしたいのですが、
こういう場合はstaticメンバ変数にするしかないのでしょうか?
ていうのも、static変数はクラス外に宣言を書かないといけないためclass A,Bみたいなクラスを
たくさん作ると大変なんですよね・・・。
class A,Bの基底クラスに持たすことはできませんし・・・

良い方法があればご教授ください。

270:デフォルトの名無しさん
07/08/11 12:27:32
つ 静的局所変数

271:デフォルトの名無しさん
07/08/11 12:45:41
>>269
CRTP が使える場面かもしれない。
でも、そんなに静的変数が要るのかどうかが疑わしい。
クラス外に定義が必要なのが嫌だというのも理解しかねる。

272:デフォルトの名無しさん
07/08/11 16:51:02
template<UINT nID>.
class Base
{
 static C s_c;
};
template<UINT nID>
C Base<nID>::s_c;

class A : public Base<0>
{};
class B : public Base<1>
{};


273:269
07/08/11 19:13:13
>>270-272
返事が遅れてしまい申し訳ありませんでした。
レスありがとうございます。

CRTPってデザインパターンの一種みたいですね。
>>272のソースがCRTPなのでしょうか?
面白そうなので試してしみようと思います。

274:デフォルトの名無しさん
07/08/11 19:43:47
それは全然違う。
CRTPはベースクラスが、継承クラスの型を知ること

275:269
07/08/11 19:55:41
>>274
なるほど。どもです。
ちょっとググって来ます。

276:デフォルトの名無しさん
07/08/11 23:40:11
CRTPてこんなの

   template<class derived_t>
   class TLogPolicy {
   public:
      void log() { log_ += (static_cast<derived_t*>(this))->data_ + "\n"; };
   protected:
      TLogPolicy() {};
   private:
      std::string log_;
   };
   class TManager : public TLogPolicy<TManager> {
   public:
      void test() { log(); };
   private:
      std::string data_;
      friend TLogPolicy<TManager>;
   };

けっこう有名なテクニックだとおもうけど?


277:269
07/08/12 02:50:34
>>276
ありがとうございます。
まだ、実装はしてませんが、>>276さんのソースを弄った感じ私が求めてたモノかもしれませんw
ただ、1行目のtemplate<class derived_t>って言うのがよく分からないのですがなんなのでしょうか??

278:デフォルトの名無しさん
07/08/12 03:00:57
>>277
ごく普通のテンプレート宣言だよ。これぐらいは調べてくれ。

279:デフォルトの名無しさん
07/08/12 03:03:18
>>278
あ、なるほど、template<class T>みたいなもんですかw
てっきり、特殊なことやってるのかと思いましたw
すいません。

280:269
07/08/12 15:09:02
また、質問させていただきたいのですが、>>276さんのソースを簡易化して、
template<class derived_t>
class TLogPolicy {}
class TManager : public TLogPolicy<TManager> {};
class UManager : public TLogPolicy<UManager> {};
class Cont {
std::list<TLogPolicy *> cont;
template <class derived_t>
void add(TLogPolicy<derived_t> *hoge) {
cont.push_back(hoge);
}
};
として、TManager,UManagerのインスタンスを複数作り、
Contクラスのcontに格納したいのですがどうすればいいのでしょうか?
とりあえず、1つのコンテナで管理したいのです。
実際、追加しようとすると、変換できないなどとエラーがでます。
TManagerの適当なメンバ関数から、Cont::add<TManager>(this);
よろしくお願いします。

281:デフォルトの名無しさん
07/08/12 15:15:38
>>280
コンテナに入れたいだけならもういっこ基底クラスを置くだけでいいだろう。
コンテナの要素に対して何をしたいのかによっては、それじゃ不満だろうが。

ソース貼るなら、ちゃんと問題(エラー)が再現できるコード作れよ。

282:デフォルトの名無しさん
07/08/12 15:50:20
どうもtemplateとclassの関係を判っていないようだな。
テンプレートのポインタ(TLogPolicy *)なんてのは無いよ。

TLogPolicy<TManager>とTLogPolicy<UManager> は別の型だから、
同じ基底クラスとして扱うことは出来無いし。

面倒だから簡単にboost::anyのコンテナ使う手もあるかね。

283:269
07/08/12 19:54:07
>>281-282
レスありがとうございます。

>ソース貼るなら、ちゃんと問題(エラー)が再現できるコード作れよ。
申し訳ありません。以後気を付けます。

templateとclassの関係などもうちょっと勉強し、
レスを参考に少し考えてみることにします。

284:デフォルトの名無しさん
07/08/12 23:02:30
>>283
多分コンパイル通そうと尋常じゃない時間を割くと思われるので一つ教えてあげる。

テンプレート関数はこう書く。
template <class T> void foo( T param ) { ... }
テンプレートクラスはこう書く。
template <class T> class bar { T member; };

しかし、クラスにテンプレートの関数(これをメンバテンプレートという)
を書くことはできない。

class hoge {
  template <class T> void f( T param ) { ... } // ←コンパイルエラー
}

つまり 280 のコードでやろうとしていることは、そもそも不可能なんだよ。

285:デフォルトの名無しさん
07/08/12 23:16:39
>>284
メンバテンプレートって呼び名が付いてるのに書くことはできないんだ。ふーん。
コンパイラ何使ってるの?

286:デフォルトの名無しさん
07/08/12 23:19:40
たしかVC5か6かなんかでは出来なかっただけ。

287:デフォルトの名無しさん
07/08/12 23:45:41
vc6 では出来る。
が、一部文法が通らないな。

hoge h;
h.f(1); // OK
h.f<float>(1); // NG

vc5 は知らん。

288:284
07/08/12 23:46:09
あ゛ぅ、手元のコンパイラでやってみたらできた・・・
>>283 すまん、284 は全くのマチガイ。忘れてくれ m(_ _)m

>>285 VC2005。
>>286 今試したら VC6 ではできた。VC 5 以前はわからんけど。

いぢめないで。。。

289:デフォルトの名無しさん
07/08/12 23:59:00
ちょっと興味が湧いたので実装してみた。

   template<class derived_t>
   class TClassData {
   private:
      template<typename T>
      string& data(T* t) {
         static string data;
         return data;
      }
      friend derived_t;
   };

   class TManager : TClassData<TManager> {
   public:
      void set(string const& s) { data(this) = s; };
      string& get() { return data(this); };
   };

…………しかし、継承使われたりすると危なっかしくてしょうがないな。
TManagerはクラス内クラスにしてファイナル化しといた方が安全そうだ。

290:289
07/08/13 00:01:46
というよりもVC5,6はステだろ。
未だに保守でVC5,6使わされているプログラマは可哀想でしょうがない。

291:デフォルトの名無しさん
07/08/13 00:03:03
class TLogPolicy { public: void foo() { ::std::cout << "Hello"; } };
class AbstractTLogPolicyHolder { public:
TLogPolicy& policy;
AbstractTLogPolicyHolder( TLogPolicy& policy ) : policy( policy ) {}
};
template < class T >
class TLogPolicyHolder : public AbstractTLogPolicyHolder {
static TLogPolicy policy;
public: TLogPolicyHolder() : AbstractTLogPolicyHolder( policy ) {}
};
template <class T> TLogPolicy TLogPolicyHolder<T>::policy;
class Cont { ::std::list< AbstractTLogPolicyHolder* > cont;
public: void add( AbstractTLogPolicyHolder* holder ) { this->cont.push_back( holder ); }
void callAllFoo();
};
void Cont::callAllFoo() {
::std::list< AbstractTLogPolicyHolder* >::iterator i = this->cont.begin();
for( ; i != this->cont.end(); ++i ) { ( *i )->policy.foo(); }
}
class TManager : public TLogPolicyHolder< TManager > {};
class UManager : public TLogPolicyHolder< UManager > {};

void main() {
Cont cont;
TManager t1, t2, t3; // TManager::policy は 1 個だけ存在
UManager u1, u2, u3; // UManager::policy も 1 個だけ存在

cont.add( &t1 );
}

292:デフォルトの名無しさん
07/08/13 00:05:41
>>290
この前、VC3の案件が回ってきて笑った。

293:289
07/08/13 00:15:30
うわ……ありゃc++とは言えないだろう……


良く良く考えたらテンプレートメンバ関数要らんな。
ただ危険にしているだけだった。
   template<class derived_t>
   class TClassData {
   protected:
      TClassData() {};
      string& data() {
         static string data;
         return data;
      }
   };
   class TManager : public TClassData<TManager> {
   public:
      void set(string const& s) { data() = s; };
      string& get() { return data(); };
   };

294:デフォルトの名無しさん
07/08/13 08:35:29
>>293
TLogPolicyとContはどこいった?

295:デフォルトの名無しさん
07/08/13 11:17:36
規格読んでたらよく分かんなくなってきた。

std::complex<double> c = std::complex<double>(1, 2);

とした時、コピーコンストラクタが呼ばれるかどうかに関する規定がよく分からない。

これは「コピー初期化」であって「std::complex<double>(1, 2)がcにコピーされる」らしいんだが、
実際やってみると、どうもコピーコンストラクタは呼ばれない。
この「コピー」というのがコピーコンストラクタを呼ぶことを意味していないのか、
それともコピーコンストラクタを呼ばない最適化が規格で許されてるのか、
どうもよく分からない。

このあたりどうなってるのか詳しく知ってる人はいる?

296:デフォルトの名無しさん
07/08/13 11:22:35
>>295
URLリンク(www.kmonos.net)

297:デフォルトの名無しさん
07/08/13 11:27:38
1)T a = T(...)
2)T a(...)
は同じじゃなかったっけ


298:デフォルトの名無しさん
07/08/13 11:45:31
>>295
つまり、これも戻り値最適化に含まれる、というわけ?

299:デフォルトの名無しさん
07/08/13 12:05:27
>>297
いいえ。前者はコピーコンストラクタが呼ばれる可能性があります。
# >296参照。

300:デフォルトの名無しさん
07/08/13 12:06:17
>>298
正しく、RVOですね。

301:デフォルトの名無しさん
07/08/13 12:07:59
規格には何箇所かコピーコンストラクタの省略を許す箇所が挙げられている。
戻り値最適化もコピー初期化時の省略もそのひとつ。

って、他にあったっけ?

302:デフォルトの名無しさん
07/08/13 12:09:56
>>300-301
これで安心して眠れます。
まだ寝ないけど。

303:デフォルトの名無しさん
07/08/13 12:10:44
>>295
これかしらん?

URLリンク(web.archive.org)
ここの最後の方

> -15- Whenever a temporary class object is copied using a copy constructor, and this object and the copy have the same cv-unqualified type,
an implementation is permitted to treat the original and the copy as two different ways of referring to the same object and not perform a copy at all,
even if the class copy constructor or destructor have side effects.

304:デフォルトの名無しさん
07/08/13 12:22:55
>>303
おおー。それですね。完璧ですね。

305:デフォルトの名無しさん
07/08/13 12:31:03
規格 8.5.14 内のここは?

if the function is a constructor, the call initializes a temporary of the
destination type. The result of the call (which is the temporary for the
constructor case) is then used to direct-initialize, according to the rules above,
the object that is the destination of the copy-initialization. In certain cases,
an implementation is permitted to eliminate the copying inherent in this
direct-initialization by constructing the intermediate result directly into the
object being initialized;


306:デフォルトの名無しさん
07/08/13 13:07:44
>299
ええ? >297の通りじゃ……と思ってC++STDを確認しました。
8.5 Initializers
(snip)
initializer:
  = initializer-clause
  ( expression-list )
initializer-clause:
  assignment-expression
  { initializer-list ,opt }
  { }
initializer-list:
  initializer-clause
  initializer-list , initializer-clause
ということで、>297の通りじゃね?良くわからないけど。

307:デフォルトの名無しさん
07/08/13 13:12:39
>>306
「ということで」じゃねーよ。何を確認したんだよ。

= に続けて置かれた初期値の型が同じなら、動作上は direct-initialization と
同じに最適化されるが、意味上は依然として copy-initialization なので、
たとえばコピーコンストラクタが private になってたりすると >>297 の 1 は
コンパイルエラーになる。

308:306
07/08/13 14:06:53
あれ?そうだっけ? ということでもうちょっと調べてみました。
過去ログにあった。
URLリンク(ir9.jp)
条件付きで同じになるっつうのが正解かしらん?

copy-initializationとdirect-initializationについて纏まっている資料は無いのかね?
More Exceptional C++に載っているみたいだけど……


309:デフォルトの名無しさん
07/08/13 14:56:26
ためになるなあ

310:デフォルトの名無しさん
07/08/14 01:11:10
おもしろいな、copy constructorへのaccess checkがかかるけど、
実際にはdirect-initializationが行われる(よばれる)のか

class Nurupo
{
private:
//public:
 Nurupo(const Nurupo&) {
  *(int*)0 = 0;
 }
public:
 Nurupo(int nurupo1, int nurupo2, int nurupo3) {
  ;
}
};

void foo() {
 Nurupo nurupo = Nurupo(1,2,3);
}

private:だとコンパイルエラーになるが、
public:にして実行しても落ちるわけではない

でさ、これもRVOって呼ぶの?returnしてないのに?

311:デフォルトの名無しさん
07/08/14 01:53:47
>>310
これは RVO とは呼ばない。

312:デフォルトの名無しさん
07/08/14 01:55:03
>>308
規格のドラフトでいいんじゃないの? >>2

313:デフォルトの名無しさん
07/08/14 02:39:08
JIS に行けばドラフトじゃなくてちゃんとしたのを一応読める。色々と不便ではあるけど。

314:デフォルトの名無しさん
07/08/14 02:45:47
日本の未来に絶望する配布形式


315:デフォルトの名無しさん
07/08/14 08:29:54
不要なものは使いにくくなっている
C++的には正しい配布形式

316:デフォルトの名無しさん
07/08/14 10:19:47
const int i[10];
という配列をメンバーに持っていた場合、どうやって初期化すればよいのでしょうか? 


317:デフォルトの名無しさん
07/08/14 10:21:52
>>316
できません。 const 外すか、パフォーマンスに問題なければ std::vector を使うか。

318:デフォルトの名無しさん
07/08/14 10:23:08
int i[10]; という配列をメンバーに持つクラス X を作って、
const X x; として、その x のコンストラクタで初期化する。

319:デフォルトの名無しさん
07/08/14 10:40:09
残念ながらコンストラクタ内で代入することになるね。

320:デフォルトの名無しさん
07/08/14 23:11:20
ご意見伺いたいです。

C++にてシングルトンを実装するに当たって、インスタンスの解放を明示的に実装しますか?

私は、実装します。
プログラムの終了まで存在するものとしても解放するべきだと思っています。

実装しないという人の理由が、解放される順番が難しい、
というのですがそれは理由にはならないのではと。

解放しない派で、もっとこう積極的な理由があるなら教えてください。

321:デフォルトの名無しさん
07/08/14 23:19:43
明示的な解放が必要ってことは
static HogeClass *s = new HogeClass;
return s;
とかするのか?

322:デフォルトの名無しさん
07/08/14 23:25:57
Modern C++ Design読め。

言語に頼れるのならば任せるのがベターだろうと思うよ。
それができない(例外的な)ケースのときだろうね。明示的に実装することを考えるのは


323:デフォルトの名無しさん
07/08/15 02:20:59
mallocしたメモリは確実に解放しますか?

私は、解放します。
プログラムの終了まで存在するものとしても解放するべきだと思っています。

324:デフォルトの名無しさん
07/08/15 03:29:48
だからModern C++ Design読めって。そもそもmallocなんか使わないよ。
ローカル関数内のstaticオブジェクトを使うのが簡単じゃない?

325:デフォルトの名無しさん
07/08/15 04:20:38
「リソースは解放する」「順序は守る」「両方」やらなくちゃならないのがのC++のつらいところだな。

326:デフォルトの名無しさん
07/08/15 05:39:13
シングルトンの解放に関する話は結構ややこしいからな。
Modern C++ Design 読め、で済ますしかない。

327:デフォルトの名無しさん
07/08/15 07:29:15
機械翻訳のような妙な日本語。

328:デフォルトの名無しさん
07/08/15 08:00:51
>>323
C++でmalloc()使う方がどうかしている。

329:デフォルトの名無しさん
07/08/15 08:43:20
>>324>>328
有名な「malloc/free論争」と同じ
不毛な議論だということを述べているのだと思うが

330:デフォルトの名無しさん
07/08/15 08:46:56
不毛も何も、C++ならnew/deleteがあるのだからmalloc()なんて使わないだろって話だが。
そんなに毛が欲しければCを使っていればいいだけのことだ。

331:デフォルトの名無しさん
07/08/15 09:25:19
論点はmallocかnewか、ではなく
newしたものは必ずdeleteする必要があるか、という点なのだけど。

「mallocではなくnew」などというのは、本質を外れた揚げ足取りに過ぎないと
気が付いているんだろうけど、引っ込みがつかないんだろうね。

332:デフォルトの名無しさん
07/08/15 09:33:22
相手が呆れて去っていきさえすれば勝ちだから、そりゃあ頑張るさ。

「勝者とは強い者のことを言うのではない、戦場に最後まで立っていた者のことを言う」
と、妖魔司教ザボエラ様も仰ってる。

333:デフォルトの名無しさん
07/08/15 09:48:46
deleteするか否かは時と場合による。

334:デフォルトの名無しさん
07/08/15 10:04:49
placement new なら delete しない代わりにデストラクタ呼ぶ、という話か?

335:デフォルトの名無しさん
07/08/15 10:34:09
時と場合で移り気なの

336:デフォルトの名無しさん
07/08/15 10:34:36
スマートポインタ使えよ
RAIIの原則に従っておけば何も考えなくていいんだから

337:デフォルトの名無しさん
07/08/15 10:41:01
newしたらdeleteするのは当たり前だが、mallocしたものはfreeしないと言うこともあるかも知らん。

338:デフォルトの名無しさん
07/08/15 11:10:57
あーあ、mallocやっちゃった。スレタイ読めない馬鹿発見。

339:デフォルトの名無しさん
07/08/15 11:13:18
というのは、レスが読めてない馬鹿の言うことなんだけどね、この場合。

340:デフォルトの名無しさん
07/08/15 11:20:33
delete はデストラクタ呼ぶから、free とは問題が別だよという話だろう。

341:デフォルトの名無しさん
07/08/15 12:09:46
newしたメモリは確実に解放しますか?

私は、解放します。
プログラムの終了まで存在するものとしても解放するべきだと思っています。

342:デフォルトの名無しさん
07/08/15 12:15:10
あーあ、newやっちゃった。スレタイ読めない馬鹿発見。

343:デフォルトの名無しさん
07/08/15 12:31:17
ティンコティンコティンコ

344:デフォルトの名無しさん
07/08/15 12:38:33
デストラクタでOSが自動でやる以上に何か意味のある仕事をするんなら
勿論deleteすべきだろうな

345:デフォルトの名無しさん
07/08/15 12:48:37
RAIIとかリソース所有の概念を知らないやつが混ってるな。
C++必須の概念のはずなのに、知らないやつってホント多いよな。


346:デフォルトの名無しさん
07/08/15 12:52:51
>>345
決め付けは良くないですyo

347:デフォルトの名無しさん
07/08/15 12:53:03
解放しないとデバッガがメモリリークを報告しまくってうっとうしい

348:デフォルトの名無しさん
07/08/15 12:53:52
>>347
それはデバッガがクソ

349:デフォルトの名無しさん
07/08/15 13:01:34
いずれにせよnewしたメモリは全部スマートポインタに突っ込むのが常識だろ。
今時手動deleteとかありえねえ

350:デフォルトの名無しさん
07/08/15 13:04:15
今時ガベコレも無い言語なんて時代遅れもはなはだしい

351:デフォルトの名無しさん
07/08/15 13:25:50
ライブラリでいくらでも実装できるLispとC++は最高、ということですね?

352:デフォルトの名無しさん
07/08/15 13:40:39
スマートポインタが万能だとでも思ってるんだろうか

353:デフォルトの名無しさん
07/08/15 13:42:58
RAIIあれば大抵は処理できるよ。 >350
ガベコレも結局無限リソース(メモリ)しか上手く処理できないしな……


354:デフォルトの名無しさん
07/08/15 13:44:47
循環参照があっただけでおしまいじゃん

355:デフォルトの名無しさん
07/08/15 14:01:29
シングルトンどうしが循環参照してても解放すべきです。
私はそう考えます。

356:デフォルトの名無しさん
07/08/15 14:29:38
おまえいいこと言うな

357:デフォルトの名無しさん
07/08/15 14:48:33
>354
ちゃんとリソース所有権を考えれば循環参照はめったにおこらない。
まあ、考えるのが面倒だからガベコレに頼りたくなるんだけどね。

>355
どういう状況だよ。シングルトンわかってないだろ。


358:デフォルトの名無しさん
07/08/15 14:49:34
>>355
そんなシングルトンが存在すること自体、設計が変だと思わないか

359:デフォルトの名無しさん
07/08/15 14:51:45
寝具る㌧㌧㌧

360:デフォルトの名無しさん
07/08/15 14:57:57
>>357-358
可哀相なくらい行間が読めないコンビだな。

361:デフォルトの名無しさん
07/08/15 15:35:05
読む気ねぇ。ここはマ板じゃねぇし。なんで技術的な部分以外を気にしなきゃいかんのかね?
いい加減夏厨相手にするのも飽きたなぁ

362:デフォルトの名無しさん
07/08/15 15:51:47
馬鹿を晒すぐらいなら書かなきゃいいのに

363:デフォルトの名無しさん
07/08/15 15:54:14
行間なんてものは要するに書き漏らしただけ
ちゃんと伝えたきゃ書け

364:デフォルトの名無しさん
07/08/15 15:56:26
行間っつーか、ギャグだろ。

365:デフォルトの名無しさん
07/08/16 06:38:10
>>361
日本語でコミュニケーションする能力が
技術的な部分と両輪で機能してない間抜けなぞ問題外。

366:デフォルトの名無しさん
07/08/16 14:56:08
(゚ー゚*)ダッコ♪

367:デフォルトの名無しさん
07/08/16 15:29:53
reddit 経由「透過的プログラマ指向ガベコレ for C++」
URLリンク(www.open-std.org)

Boehm らによる言語機能としてのガベコレ提案。ちょっと期待。

368:デフォルトの名無しさん
07/08/16 18:15:46
class SUBCLASS {
public:
   LPSTR& operator[](LPCSTR);
};

class SUPERCLASS{
public:
   SUBCLASS *subclass;
};


SUPERCLASS aaa;

int main()
{
   aaa.subclass = new SUBCLASS(hogehoge);
   return aaa.subclass["bbb"];
}

わけあってmapが使えないので上のようにしているのですが
「error C2107: ポインタでない式に、添字が使われました。」
というエラーが出てしまいます

どのようにすれば解決できますでしょうか?
開発環境はVS2005です
よろしくお願いします

369:デフォルトの名無しさん
07/08/16 18:30:39
あんまり真面目に読んでないけど、とりあえずこうじゃね?
 return (*aaa.subclass)["bbb"]; 

370:368
07/08/16 18:44:26
>>369
どうもー
やってみましたがだめでした

371:デフォルトの名無しさん
07/08/16 18:53:11
>>370
エラーメッセージが変わっただろ。ちゃんとその辺を書けよ。
で、戻り値の型がLPSTRなんだから、らreturn文で呼ばずに単独で呼んでみな。

372:368
07/08/16 19:00:40
>>371
うーんエラーメッセージは変化なしです

373:デフォルトの名無しさん
07/08/16 19:06:17
aaa.subclass->operator[]("bbb")

374:368
07/08/16 19:08:45
>>373
コンパイル通りました
ありがとうございました

375:デフォルトの名無しさん
07/08/16 19:11:26
意味があるかは知らんが、(*aaa.subclass)["bbb"] でコンパイルは通るぞ。

376:デフォルトの名無しさん
07/08/16 19:11:34
>>373
俺もそうだと思ったけど、関数形式で呼ぶのがなんか嫌だから書かなかった
なんか解決策ないかね

377:371
07/08/16 19:13:21
>>372
そうか? 前者は引き数が合わなくて関数が見つからないが、後者は戻り値の型が合わなくてエラーになると思うのだが。
つーか、なんでまたmain()のreturnなんかで試すんだ? >371の後半は読んでないのか?

378:376
07/08/16 19:13:31
ああそうか、違和感の理由が分かった。
連想配列にしたくて添え字をオーバーロードしているはずなのに
opreator[]で呼んだら意味を成さなくなっちゃうからだ。

379:376
07/08/16 19:15:59
つうことで解決案

subclassをカプセル化して、参照越しにoperator[]を呼ぶ

380:デフォルトの名無しさん
07/08/16 19:23:44
(*aaa.subclass)["bbb"] でコンパイル通らず、
aaa.subclass->operator[]("bbb") でコンパイル通るってあり得ないと思うんだが。

381:368
07/08/16 19:28:22
>>375
あわわ間違って(*aaa.subclass["bbb"])としちゃってたようです

>>377
エラー部分だけ抜き出そうとして型違いのreturnになってました、ごめんなさい…

>>379
単語の意味がわかってないので検索してやってみます、ありがとうございました

382:デフォルトの名無しさん
07/08/16 19:35:38
でもなんでchar *じゃなくて、char * &なんだろう。
constでないということは、こういうことがやりたいんだろうか。


(*aaa.subclass)[''bbb"] = new char[10] ;

いや、ひょっとしたらこういうことがしたいのか

char * & ptr = (*aaa.subclass)[''bbb"] ;
ptr = static_cast<char *>( realloc(ptr) ) ;

383:デフォルトの名無しさん
07/08/16 20:59:50
class Base
{
public:
Base(int n) {}
};
class Derived : Base
{
public:
Derived(int n) {}
};
これがどうしてダメで、Base::Base()が必要なのか教えてください。

384:デフォルトの名無しさん
07/08/16 21:06:38
親クラスに n を渡すなら、それをちゃんと書かなきゃいけない。

public:
Derived(int n) :Base(n) {}

385:デフォルトの名無しさん
07/08/16 21:06:53
はい?

386:デフォルトの名無しさん
07/08/16 21:07:27
>>383
その例のDerived のコンストラクタは結局 Derived(int n) : Base() {} の省略形だから

387:デフォルトの名無しさん
07/08/16 21:21:45
そのnは親に渡さずに別に使うnかもしれないし。

388:デフォルトの名無しさん
07/08/16 23:12:17
>>383
Derived クラスのインスタンスを生成するときに
Base クラスのコンストラクタを呼び出すからなんだと思います。
コンストラクタを定義していないときはデフォルトコンストラクタが呼び出されるけど
定義してると定義されたものを呼び出すから
この場合は引数のいらないコンストラクタを定義するか
Derived クラスのコンストラクタで
Derived(int n) : base(100) {}
みたいに Base(int n) を呼び出して
引数を渡さないとだめだと思うんです。

初心者なんで間違ってるかもしれません。


っていうか STL 難しすぎでうっ!

389:デフォルトの名無しさん
07/08/16 23:20:25
Baseのコンストラクタにデフォルト値を書いておくのもいいかも

っていうか STL 関係ねー

390:デフォルトの名無しさん
07/08/17 00:01:01
>>388
>っていうか STL 難しすぎでうっ!
でうっ?

391:デフォルトの名無しさん
07/08/17 00:20:57
唐突にこれを思い出した
URLリンク(www.karakuri-box.com)

392:デフォルトの名無しさん
07/08/17 00:41:05
すいません。釣りではありません。
C++ってどんな局面で使うんですか?
WinアプリならC#使ったほうが圧倒的に楽


393:デフォルトの名無しさん
07/08/17 01:00:07
脳みそ沸かしたいとき

394:デフォルトの名無しさん
07/08/17 01:24:19
Cで先頭アドレスと要素数がわかってるのですが
ForループじゃなくてC++のiteratorに変換してくれるtemplateとかないんですか?

ない場合どのiterator継承すればいいんでしょうか

395:デフォルトの名無しさん
07/08/17 01:40:46
T*head; size_t element;が既知なんでそ?
なら、&head[0]~&head[element]がiteratorの要件を満たしてくれるでそ?

396:デフォルトの名無しさん
07/08/17 01:48:01
>>392
楽かどうかなら C# が楽だろうが、
C# は Windows にしか優しくないし、
速度も C++ に劣るし、
そういうのが必要な時には C++ が圧倒的有利。

397:デフォルトの名無しさん
07/08/17 02:19:58
速度が必要になるようなミッションクリティカルな場面に出会ったことがない
最近は全部C#。

398:デフォルトの名無しさん
07/08/17 02:21:20
サーバーアプリだとC#?ハァ?

399:デフォルトの名無しさん
07/08/17 02:38:29


400:デフォルトの名無しさん
07/08/17 03:59:53
つかここ#かんけーねーし

401:デフォルトの名無しさん
07/08/17 05:58:45
>>392
C#を実装するのに使います

402:デフォルトの名無しさん
07/08/17 12:37:18
>>401が良い事言った

403:デフォルトの名無しさん
07/08/17 21:16:42
なぜ想像力がデスクトップとサーバー位にしか働かないんだ
プログラムが必要な場面はいろいろあるぞ

404:デフォルトの名無しさん
07/08/17 21:39:47
class CFUNC a;
の2次元配列を動的に確保する場面があって、
CFUNC ***pppa;
として使いたいですが、
pppa = new CFUNC**[y_len];
でまずy要素を確保して
pppa[0] = new CFUNC*[x_len];
各y要素のx要素を確保して
pppa[y][x] = new CFUNC();
で、各要素をインスタンス化して
(*(pppa[y][x])).hoge();
みたいに使おうと思うのですが、このpppaを破棄する場合に
deleteはどう書いたらいいのかわからなくなってしまいました。。。どなかたpppaをdeketeしてもらえませんか?
ちなみによくしらないのですが、delete[]ってなんで配列の要素数がわかるんですか?


405:デフォルトの名無しさん
07/08/17 22:15:50
typedef CFUNC*** PPPCFUNC
typedef CFUNC** PPCFUNC
typedef CFUNC* PCFUNC
と整理してやると

PPPCFUNC pppa = new PPCFUNC[y_len]
pppa[0] = new PCFUNC[x_len]
pppa[y][x] = new CFUNC
になるんで
deleteとdelete[]で困る局面はなくなると思ってみたり

要素数は実装によるけどもコンパイル時には決められないからどっかで一元管理してんでないすか多分
俺はそうする

406:デフォルトの名無しさん
07/08/17 22:53:53
VC++では先頭の手前に要素数が格納されてた希ガス

407:404
07/08/17 22:59:04
なるほど、typedefを忘れてました。
ではこれで確保したpppaはdelete[] pppaで破棄できるんですねっ!
要素数は、
int pppa_len_y;
int *pppa_len_x = new int[ pppa_len_y ];
でnew時に一緒に初期化しています。
もっと手軽な方法ありますか?


408:404
07/08/17 23:02:44
>406
それじゃぁmallocするときに、必要size+1とってfreeのときにそれ利用してるんですねぇ。
ってことは要素数を保持しなくても、ポインタの手前の要素数使えってこと?
ちなみにc++の規定ですか?処理系依存ですか?

409:デフォルトの名無しさん
07/08/17 23:17:52
処理系依存。

410:404
07/08/18 00:17:58
>>405
PPPCFUNC pppa = new PPCFUNC[y_len];
でnewしようとすると、PPFUNC*からPPPFUNCに変換できません
と怒られてしまいました。
PPPCFUNC pppa = (PPPFUNC)( new PPCFUNC[y_len] );
でキャストして大丈夫なのでしょうか?

411:404
07/08/18 00:36:14
すいません、勘違いです。typedefミスってました。OTL

412:383
07/08/18 11:08:57
>>384-389
ありがとうございました。よくわかりました。

最近C++を勉強しているのですが、Java育ちのゆとり世代なものでスパルタさにガクブルものです。
class Foo
{
private:
char* s_;
public:
Foo(char* str) : s_(new char[strlen(str)+1]) { strcpy(s_, str); }
~Foo() { delete[] s; }
};
int main()
{
Foo a("foobar");
Foo b = a;
}
この程度で落ちるってのがすごすぎです(なぜ落ちるのかはちゃんとわかりますが・・・)。

413:デフォルトの名無しさん
07/08/18 11:24:18
>>412
生でnewを使うからそういう羽目になる。
std::stringを使うなり、std::vectorを使えばいい。
せめて、スマートポインタを使え。

414:デフォルトの名無しさん
07/08/18 11:34:02
コピーコンストラクタや代入演算子をちゃんと書かないから・・

415:デフォルトの名無しさん
07/08/18 12:19:01
C++を使う時は、リソースの所有権を常に意識する必要がありますな。
RAIIはちゃんと勉強しといたほうが良いよ

416:デフォルトの名無しさん
07/08/18 12:37:37
そうだな、コピーコンストラクタと代入演算子は常に書くべき。

417:デフォルトの名無しさん
07/08/18 12:40:35
Java→C++とか死亡ルートじゃね?
Java→C→C++って回るべきだと思うんだが

418:デフォルトの名無しさん
07/08/18 13:32:09
GC付きC++って選択肢もあるんでないの(w

419:デフォルトの名無しさん
07/08/18 14:17:34
Javaなんか使うから頭が馬鹿になるんだよ。
GC付きの言語を使うと変な癖が付く。

420:デフォルトの名無しさん
07/08/18 15:08:22
時代に逆行している人

421:デフォルトの名無しさん
07/08/18 16:59:23
>>417
自分はC#→C→Java→C++ってやってきたけどおk?

422:デフォルトの名無しさん
07/08/18 17:03:18
コンストラクタで例外を投げるクラスがあり、
そのクラスをstaticに使ってるんですが、
この場合、どのように例外をキャッチすればいいのでしょうか?

class Throw{ public: Throw(){ throw 1; } };
class TestClass{
static Throw throw;
};

こんな感じです。

423:デフォルトの名無しさん
07/08/18 17:12:19
>>422
コンストラクタの中でキャッチするか、プログラムが死ぬか。

424:デフォルトの名無しさん
07/08/18 17:36:05
>422
staticをやめる

425:デフォルトの名無しさん
07/08/19 13:25:57
教えてください。

たとえば
int i = 100, *ip;
double d = 123.456, *dp;
ip = &i;
dp = &d;
char *s = "abcdefg";

cout << ip << " " << dp << " " << s << endl;

このようなコードで int型やダブル型のポインタを cout で出力すると
アドレスが表示されるのに char型のポインタだと
文字列が表示されるのがいまいちよくわからなかったんですが
ずっと勉強してきてふと思ったんです。
cout で演算子オーバーロードでそうなるようにされてるのかなと。
で定義されているコードを探そうと思ったんですけど
なんかごちゃごちゃしててよくわかりません。
もし予想が当たってるならどのファイル見ればいいかでしょうか?

426:デフォルトの名無しさん
07/08/19 13:54:49
>>425
basic_ostream っていうクラステンプレートに対して定義されている。
char もテンプレート引数になってるからちょっと探しにくいだろうね。
ヘッダ ostream に対応するファイルで定義されているはず。

ごちゃごちゃしたヘッダを読むのがいやなら >>2 から規格のドラフトでも見るといい。

427:デフォルトの名無しさん
07/08/19 17:00:46
教えてください。

428:デフォルトの名無しさん
07/08/19 17:31:07
何をだ

429:デフォルトの名無しさん
07/08/19 18:41:48
>>428
事故解決すますた

430:デフォルトの名無しさん
07/08/19 21:20:33
>>426
ありがとうございます。
ファイル見てみたんですけど
今の僕にはまだ難しくてよくわかんないんで規格もみたんですけど
いまいちわからなくて
検索してたら説明されてるページをみつけました。
URLリンク(www.io.nara-su.ac.jp)

これですっきりしました。

431:デフォルトの名無しさん
07/08/20 15:44:57
質問です。
下のクラス図のようなクラスを実装したいのですが、DataClassのように、二つ(以上)で共有しているクラスは、コード上でどのように書いたらいいのでしょう?
DataClassのインスタンスをグローバルな領域で作るしかないのでしょうか?

クラス図
URLリンク(enjoi.blogdns.net)

とりあえず書いてみたコード
class DataClass{
private:
  int data;
public:
  void setData(int newData);
  int getData();
};
class ClassB
{
public:
  bool DoSomething();
};
class ClassA
{
private:
  ClassB classb;
};


432:デフォルトの名無しさん
07/08/20 16:18:28
状況次第じゃね。

どっちかに持たせて、もう片方にも渡せるようにすることもあるし、
動的に確保して、A, B の両方のスマートポインタに入れとくこともあるし、
A を所有するクラスに持たせて、そっから渡すようにすることもあるし、
シングルトンにしてグローバルな領域に置くこともあるし、

433:デフォルトの名無しさん
07/08/20 16:18:28
そんなに文句あるんならnamespace使うなりClassAとClassBを統合するなりすれば?

434:デフォルトの名無しさん
07/08/20 16:20:59
初心者だからよくわかんないんですけど
DataClass をメンバとして持つんですか?
ClassA と DataClass の関係って必要なんですか?
ClassB経由で十分なんじゃないでしょうか?

435:デフォルトの名無しさん
07/08/20 16:23:07
関連のあるABのオブジェクトが同じDataClassオブジェクトと関連を持つかどうかは示されていない。
むしろ同じオブジェクトではないと考えるほうが自然。

436:デフォルトの名無しさん
07/08/20 16:28:10
A, B, DataClassを保持する親クラスParentを作っておいて、A, Bのインスタンス生成時にParentへのポインタを渡し、
各インスタンスはParentへのポインタを通してDataClassへとアクセスする。

437:デフォルトの名無しさん
07/08/20 16:30:25
B に入れといて、B を通して操作する。

438:デフォルトの名無しさん
07/08/20 16:35:13
多重継承はやめとけ。実世界でも親の種が違う生き物は短命だ。

439:デフォルトの名無しさん
07/08/20 16:36:43
どこに多重継承が出てくるんだ?

440:デフォルトの名無しさん
07/08/20 16:59:47
あの矢印は関連。サブクラスは白抜き三角矢印。

441:デフォルトの名無しさん
07/08/20 17:56:47
たくさんのご回答ありがとうございました。

複数の方法論に、そもそも設計の段階でご意見まで、たくさんいただきまして、ありがとうございます。

少し数があるので、それぞれについて吟味して、決めた際にまた改めてのお礼がてらご報告にきたいと思います。
ありがとうございました。

442:デフォルトの名無しさん
07/08/21 09:33:29
>改めてのお礼がてらご報告にきたいと思います。
しなくていいよ。

443:デフォルトの名無しさん
07/08/23 00:48:57
stringstring を途中で空にすることはできるでしょうか?

444:デフォルトの名無しさん
07/08/23 00:56:17
std::stringstream?

445:デフォルトの名無しさん
07/08/23 01:27:07
なんだこのバグは
URLリンク(support.microsoft.com)
>>443
stringstream.str("");

446:デフォルトの名無しさん
07/08/23 02:00:38
>>445
鬱になった
やはりSTLportを入れて使(ry

447:デフォルトの名無しさん
07/08/23 02:10:08
std::coutで、時々アドレスのような文字列("0xABCDEF12"みたいな)が出力されたり、
std::wcoutで何も出力されなかったりして困ってたんだけど、445が原因?
でもVS2005 Proだから違うか

448:デフォルトの名無しさん
07/08/23 02:34:28
>>447
coutにwchar_t*食らわしたり、localeを適切に設定せずに日本語文字列食わしてるならお前が悪いだけ。

449:印字ケータ
07/08/23 14:31:20
バイナリエディタでファイルを開くと

保存してある漢字の"日"という文字は16進数で93 FAと表示されてますが、

コレを読込んで、配列に入れると-109と-6となります。

16進数で表示させたいので、変換する方法を教えてください。

お願いします。

450:デフォルトの名無しさん
07/08/23 14:35:18
unsignedにキャストすればいいんじゃね。

451:デフォルトの名無しさん
07/08/23 14:40:35
93 FA を2進数であらわすと
1001 0011 1111 1010
10010011 を符号付き10進数であらわすと
-109
11111010 を符号付き10進数であらわすと
00000110
-6

そのまま16進にすれば同じ
気にしないで突き進め

char を intにするなら符号拡張がおきるので>>450のとおりunsigned にしとけばいい

452:印字ケータ
07/08/23 14:42:15
>>450

返答ありがとうございます。

早速やってみましたが、変換後に4294967187というデカイ数値になりました。

ちなみに、unsignedの変数にキャストして代入してみました。

もしかして私のやり方が間違ってますか。



453:デフォルトの名無しさん
07/08/23 14:54:41
4294967187 ってのは16進に直すと ffffff93
93 はマイナスだから、そのままint にもってくと 符号拡張するんだよ
unsigned にキャストってどこでどうやったの?
unsigned な変数に入れてやってみ。

454:デフォルトの名無しさん
07/08/23 14:56:17
符号拡張されてるんだろう
10010011→11111111111111111111111110010011

455:デフォルトの名無しさん
07/08/23 15:04:05
char ch = 93;
int n = (unsigned char)ch;

456:デフォルトの名無しさん
07/08/23 18:34:31
>>445
Dinkum版stringの短文字列最適化がアダになったな。
実装としては面白くて好きなんだがな。

457:デフォルトの名無しさん
07/08/23 22:36:57
2005SP1で直ってるっぽいが

458:デフォルトの名無しさん
07/08/30 08:15:51
vector< struct X > Func_A();
vectorとかコレクションを返す関数って効率悪い?

459:デフォルトの名無しさん
07/08/30 08:30:10
>>458
コンテナを参照で受け取ったほうがいいんじゃないか?

460:デフォルトの名無しさん
07/08/30 08:44:11
そこでRVOに期待、右辺値参照にもっと期待。

461:sage
07/08/30 10:25:41
>>459
参照で受け取るっていうのは
void Func_A( vector< struct X >& );
か、
vector< struct X >& Func_A();
ってことですか?
とりあえず上の参照を引数にする方でやってみます

462:デフォルトの名無しさん
07/08/30 11:47:47
vector< struct X >& Func_A();
はどっかに所有者用意しなきゃいけないから色々と面倒じゃね?

基本はauto_ptr戻しだと思うけど。


463:デフォルトの名無しさん
07/08/30 23:55:27
いや、たぶん void Func_A(std::vector<struct X>& arg) のことだろう。

仕様と実装を混同するのはよくないが、実際には多くのコンパイラにおいて
「構造体(class)を返す関数」は、暗黙の引数(返り値へのポインタ)を受け取って、
そこに書き込んで返しているわけだから。

で、return直前にインスタンスを生成する以外の場合、つまり
ローカル変数としてvectorを宣言していろいろ操作しそれを返す場合
おそらくRVOされる可能性も低いんじゃないね。知らないけど。

464:デフォルトの名無しさん
07/08/31 00:49:22
>>463
よくある戻り値用のポインタが指しているのは確保されただけで
まだコンストラクタが走ってない領域ね。引数で受け取る場合は
必ず構築済みのインスタンスを指すんで、仕様的にも違いがある。

最後の場合は「可能性が低い」じゃなくて RVO は不可能。

465:デフォルトの名無しさん
07/08/31 00:52:15
>>464
Named RVOはVC8がやってるらしいですぜ

URLリンク(msdn2.microsoft.com)(vs.80).aspx

466:デフォルトの名無しさん
07/08/31 00:55:03
ずっと前の gcc に付いてたのに削除されたな。あれは仕様的に
何か問題があったんだろうか?

467:デフォルトの名無しさん
07/08/31 01:09:49
URLリンク(gcc.gnu.org)
コンパイラが勝手にやるようになったから文法からは削除されただけみたい。

468:464
07/08/31 01:23:50
いろんな変数返されたとき困るじゃん、とか思ってたけど、そうじゃないときには
働くのね。ふーん。

469:デフォルトの名無しさん
07/08/31 01:35:07
引数が同じで戻り値が違う型の関数を定義する方法って知らないですか?
できればクラスのメンバ関数でやりたいです
まえにWebで見かけたんだけど見つからなかったorz


470:デフォルトの名無しさん
07/08/31 01:48:21
>>469
引数の型が同じなら関数を呼び分けることができないから、基本的に無理だろう。
戻り値の型を基底クラスのポインタにして、異なる型の派生クラスのオブジェクトの
ポインタを返すとかじゃダメ?

471:デフォルトの名無しさん
07/08/31 03:13:32
>>469
こんな感じ?

struct A {
 template <typename T> T foo(int);
};

void bar() {
 A a;
 char c = a.foo<char>(0);
 short s = a.foo<short>(1);
 // ...
}


472:デフォルトの名無しさん
07/08/31 14:55:28
浮動小数点の小数点以下を簡単に取る方法ってないですか?

473:デフォルトの名無しさん
07/08/31 15:13:39
f - floor(f)

474:デフォルトの名無しさん
07/08/31 16:14:22
>>472
modf
>>473は負数のとき正しくない

475:デフォルトの名無しさん
07/08/31 17:35:42
f = f - (float)((int)f);
とかじゃ駄目?

476:デフォルトの名無しさん
07/08/31 18:59:33
f > -1 ? f - floor(f) : aaaaaaaaa

477:デフォルトの名無しさん
07/08/31 19:19:41
>>475
もともと整数部分がint範囲を超えてる場合があるので、
intにキャストするのはまずいと思われ。

478:デフォルトの名無しさん
07/08/31 23:01:01
まさにそのための trunc (truncf) という関数があるんだが、
調べてみたらこれは C99 で定義されてるらしいから C++ では普通使えないな

とはいえ持ってる処理系に存在するかどうかは調べてみたらどうよ

479:デフォルトの名無しさん
07/08/31 23:31:14
unsigned longにキャストは駄目なのか

480:デフォルトの名無しさん
07/09/01 00:05:17
fmod(f, 1.0)

481:469
07/09/01 00:26:15
>>470,471
レス㌧クスです、
自分が見てたのは、こんなのでした
素直に名前を変えます...

struct testFunc {
int n, m;
testFunc(int _n, int _m = 1) { n = _n; m = _m; }
testFunc(int _n, double _m) { n = _n; m = 10; }
operator int() { return n * m * 2; };
operator double() { return n * m * 3.0; };
};

void main() {
int a = testFunc(5);
double b = testFunc(5);
int c = testFunc(5, 5);
double d = testFunc(5, 5);
int e = testFunc(5, 5.0);
double f = testFunc(5, 5.0);
}

もう少し探したらそれらしいのが見つかりました
URLリンク(homepage2.nifty.com)
やりたかったことはこんな感じ↓
URLリンク(anond.hatelabo.jp)


482:デフォルトの名無しさん
07/09/02 00:02:07
vector<char> v;

for (int i=0; i<v.size(); i++)
{
  .....
}

というコードの i<v.size() で
> warning C4018: '<' : signed と unsigned の数値を比較しようとしました。
という警告が出るんですが、
こういうときは unsigned i=0 にして
きっちり警告を消してしまうもんなんでしょうか?


483:デフォルトの名無しさん
07/09/02 00:07:42
うん
警告も消すのが良い作法

484:デフォルトの名無しさん
07/09/02 00:11:18
>>482
unsigned でも警告は消えるけど、v.size()のリターン値と同じ型を使うのが普通。

485:デフォルトの名無しさん
07/09/02 00:12:08
これが規格厨を黙らせる、完璧に正しい方法。

for ( vector<char>::size_type i = 0 ; i < v.size() ; ++i )

486:デフォルトの名無しさん
07/09/02 00:16:44
そこでautoとか未来を先走るわけですよ。カモンC++0x

487:デフォルトの名無しさん
07/09/02 00:23:34
>>486
でもこの場合どうやるんだろう。
そもそも>>482はstd名前空間のvectorではないから、自前実装の俺様vectorである可能性もあるんだよね。
ひょっとしたら、size_typeなど定義されていないかもしれない。

こういうことできるの?

decltype( v.size() ) i ;

sizeofに関数を渡すと、戻り値の型のサイズになるから、
decltypeだと戻り値の型になってくれるんだろうか。

なんてことをふと考えてしまった。
どうなるの? 教えてハゲな人。

488:デフォルトの名無しさん
07/09/02 00:27:02
さすがにバカ過ぎるだろ

489:486
07/09/02 00:30:15
すまん、脳内フィルターで485のループがイテレータに見えていた。
for (auto i = v.begin(); i != v.end(); ++i)

490:デフォルトの名無しさん
07/09/02 00:40:25
>>483-489
なるほど。さんくすです。

>> 484
やっぱりそうですよね。
安易に型決めるんじゃなくてちゃんと考えるべき何ですよね。

>> 485
感動しました。



491:デフォルトの名無しさん
07/09/02 01:34:22
何でイテレータ使わないの? >482
i++使う意味も判らん……

492:デフォルトの名無しさん
07/09/02 01:50:17
482じゃないが、iの値自体が処理に絡む場合はイテレータ使えんだろ

for (int i = 0; i < v.size(); i++) v[i] = i;

みたいな。

493:デフォルトの名無しさん
07/09/02 01:59:53
>>491
初心者だからだろ。
そのくらいわかれよ。

494:デフォルトの名無しさん
07/09/02 08:40:18
>>487
できるよ。

495:デフォルトの名無しさん
07/09/02 12:06:53
>>491
そうですね。イテレータでもいけそうですね。
今はサンプルプログラム打ちながら勉強してるんで
そこまでは思いつきませんでした。

>>492
ブロック内部でローカル変数作れば解決できそうですね。

またひとつ勉強になりました。
ありがとうございます。


496:デフォルトの名無しさん
07/09/02 13:35:18
>>495
そうそう、ループはイテレータで書くのが癖になると、内部でint idx = it - vec.begin()みたいなのを書くのも癖になる。

497:デフォルトの名無しさん
07/09/02 13:47:29
C++に限ったことではないですけど、Map型とList型って似て非なる物だといいますけど、いざって時にList→MapにしたりMap→Listにしたりする時は
どうすればよいのでしょう。効率的に考えて

498:デフォルトの名無しさん
07/09/02 13:50:09
どういう変換をしたいのかサパーリ
似て非なるっていうか、ListとMapは別物じゃ?

499:デフォルトの名無しさん
07/09/02 13:55:44
>>498
変換というか、Map型を継承しているクラスがList型で取り出せたりその逆も・・・出来る感じの事。
説明下手ですまそ。

500:デフォルトの名無しさん
07/09/02 13:57:46
std::map<a,b> を std::list< std::pair<a,b> >にコピーする話なら、
std::copy(map.begin(), map.end(), std::back_inserter( list ) )
でいけるんじゃね?効率なら知らん。

501:デフォルトの名無しさん
07/09/02 14:26:23
list.assign(map.begin(), map.end()) だろ。

502:デフォルトの名無しさん
07/09/02 14:42:28
>>499
っ アダプタパターン

503:デフォルトの名無しさん
07/09/03 01:48:49
クラステンプレートに関して質問させてください、
template <class T>
class hoger {
  public:
    typedef T hogeT;

    struct fuga {
    } m_fuga;
}

main()
{
  hoger<int> Hoge;
  hoger<型>::fuga &Fuga = Hoge.m_fuga;
}

みたいなことをやろうとしたんですが、hoger内の構造体とかを
(長くなってしまうので)ローカル変数で参照作って使いたいとき
hoger::fuga &ではなくhoger<型>::fuga &とする必要があると思うのですが
hoger<Hoge.hogeT>::fuga みたいに、Hogerオブジェクトからその型の情報は
得られないのでしょうか?
こういう情報(Hogeはintを指定して作成したということ)は外で持っておくしかないのでしょうか。
よろしくお願いします。

504:デフォルトの名無しさん
07/09/03 01:53:00
>>503
うん。
何回も書くようなら typedef しとく。

505:デフォルトの名無しさん
07/09/03 02:01:24
>>500-502
ありがとうございます。もう少し勉強してみます。

506:デフォルトの名無しさん
07/09/03 02:03:57
現状だとtemplateに逃げるしかないな。

507:503
07/09/03 13:52:09
遅レスですみません、回答ありがとうございました。
>>506
なるほど、やっぱそうするしかないのですね・・
とりあえずはHoge.m_fuga.foo
みたいに全部書いて指定することにしました。

こういうのってテンプレートの仕様上仕方の無いことなんですかねぇ。
ヘッダにしか書けないのもそうだけど、非テンプレートコードと比べて
可読性が下がるのは、テンプレートの勉強を始めた自分にとっては
しょんぼり来てしまう(´・ω・`)
ともあれどうもありがとうございました。

508:デフォルトの名無しさん
07/09/03 14:09:43
ここも将来的には auto で解決するところかな。

509:デフォルトの名無しさん
07/09/03 20:01:18
どうでもいいけどC++0x::autoって従来のCのautoと被らね?><<>

510:デフォルトの名無しさん
07/09/03 20:10:05
C++ソースとCソースが混在していてCソース側にautoがあった場合ってこと?
オブジェクト単位でコンパイル分ければいい
終わり

511:デフォルトの名無しさん
07/09/03 20:26:45
いまさら誰がautoなんて使ってるんだ?

512:デフォルトの名無しさん
07/09/03 20:33:24
俺だよワリオだよ

513:デフォルトの名無しさん
07/09/03 22:17:40
>>509
暗黙のintは廃止されたから、
現在のC++での「auto x;」はコンパイルエラー。
「auto int x;」と書かないといけない。

514:デフォルトの名無しさん
07/09/03 22:20:45
>509
C++ 的には(C99もそうなったけど)宣言時の int の省略が認められないから一意に解釈可能なはず。
C89 での auto i; と同じ意味を持たせるなら auto int i; と書く必要がある。

515:デフォルトの名無しさん
07/09/03 22:21:25
思いっきりかぶりましたとさ。

516:デフォルトの名無しさん
07/09/03 23:35:13
一つのキーワードに複数の意味なんてstaticで経験済みさ

517:デフォルトの名無しさん
07/09/04 04:09:37
今、VisualC++使ってます。
たとえば、123214332っていう数字があった場合、3桁区切りで123,214,332って表示しようと思ってる。
いい関数ない?やっぱ自作?,

518:デフォルトの名無しさん
07/09/04 04:13:24
>>517
マルチしないでさっさとイネ


519:デフォルトの名無しさん
07/09/04 04:26:42
>>517
setlocale

520:デフォルトの名無しさん
07/09/04 05:33:02
>>519
ありがとう。
調べてみる。

521:デフォルトの名無しさん
07/09/04 07:51:20
>>520
死ねカス

522:デフォルトの名無しさん
07/09/05 00:48:40
リリースモードでは問題なく動いてるようなんだけど
デバッグモードでアサーション?がでる。
別の似たコードでは問題ないんだけどなぁ・・・。
原因がわからん
眠い。
寝る

523:デフォルトの名無しさん
07/09/05 01:04:21
>>522
リリース時も同様に値がおかしいけど、エラーとして表示されてないだけってことはないよね。

524:デフォルトの名無しさん
07/09/05 02:36:54
>>522
失敗してるアサートの条件を満たさないことがあるってことだな。
デバッガで現場を押さえればおおかた原因がわかるだろ。

525:デフォルトの名無しさん
07/09/05 10:39:58
わっかたああああああああああああああああああああああ

526:デフォルトの名無しさん
07/09/05 11:00:35
vectorコンテナの要素を削除した後に
イテレータを取得し直さないで使おうとしたのがまずかったようだ。
うっかりやっちゃった。
リリースビルドではたまたま問題なかっただけってことかな。

527:デフォルトの名無しさん
07/09/05 15:00:58
コンパイルはできるのですが、実行時にvectorの部分で止まってしまいます。
ソースは以下になります。

istream_iterator<string> start(cin);
istream_iterator<string> end;
vector<string> v(start , end);

C++を勉強始めたばかりで初歩的な質問だと思いますが、お願いします。

528:デフォルトの名無しさん
07/09/05 15:19:45
標準入力から、ちゃんとEOFが出るまで読み込んでるのに止まるということ?

529:デフォルトの名無しさん
07/09/05 15:25:51
>>528
デバッガで動きを確認したところ、標準入力から、
ちゃんとEOFが出るまで読み込んでいます。
しかし、vectorを作成する部分で止まってしまって
いる状況です。

530:デフォルトの名無しさん
07/09/05 15:51:51
止まるってアプリが強制終了するって事か?

531:デフォルトの名無しさん
07/09/05 16:20:55
入力待ちなんだと思うけどな

532:デフォルトの名無しさん
07/09/05 20:33:36
>>530
vectorの実行するところでループしている感じです

>>531
入力のcinの部分は実行されていました

533:デフォルトの名無しさん
07/09/05 20:48:31
>>527
私の環境では動きましたよ。


534:デフォルトの名無しさん
07/09/05 22:48:50
たまにはexportを思い出してあげて下さい……。

535:デフォルトの名無しさん
07/09/05 22:57:19
C++0xスレにお越し下さい

536:デフォルトの名無しさん
07/09/06 12:02:54
>>533
#include<iostream>
#include<istream>
#include<string>
#include<vector>
#include<algorithm>
#include<iterator>
using namespace std;

int main(){
cout << "Enter the seres of string::";
istream_iterator<string> start(cin);
istream_iterator<string> end;
vector<string> v(start,end);





こんなプログラムですが、やはり途中vectorの後にプログラムが進みません
コンパイラはg++-4.1を使っています。

わかる方宜しくお願いします

537:デフォルトの名無しさん
07/09/06 12:12:44
>>536
>>531

538:デフォルトの名無しさん
07/09/06 12:19:41
WindowsならCtrl+Z、UnixならCtrl+Dだっけ。
C++と全く関係ない話だ。

539:デフォルトの名無しさん
07/09/06 12:47:03
進まないとか止まるってのはどういう状態のことを言ってるんだ?
こっちで再現できるだけのソースを貼るんじゃなかったら
その辺キッチリ書けよ

540:デフォルトの名無しさん
07/09/06 18:03:38
>>537-539
ありがとうございました。
何とか解決しました

541:デフォルトの名無しさん
07/09/06 18:14:10
何がどう解決したのかも書かない。
これでは何の肥やしにもならない。
糞以下だね。

542:デフォルトの名無しさん
07/09/06 18:22:47
>>541
すみません。
しかし色々いじっているうちに解決してしまったので、何がどうと言われても答えようがないのです。

543:デフォルトの名無しさん
07/09/06 18:35:01
>>541
まぁまぁ、こういう奴はプログラミング向いてないから
いずれ挫折するなり淘汰されるなりしてこの分野から消えてくれるさ。

544:デフォルトの名無しさん
07/09/06 18:47:54
と自分へメッセージ

545:デフォルトの名無しさん
07/09/06 19:32:13
>>542=544
プログラマとしても人間としても糞以下だね

546:デフォルトの名無しさん
07/09/06 20:11:09
と糞未満のものが申しております

547:デフォルトの名無しさん
07/09/06 20:37:28
真性だな可哀想に

548:デフォルトの名無しさん
07/09/06 20:58:04
ビクンビクン・・・!!

549:デフォルトの名無しさん
07/09/09 23:45:03
>>540>>542
>色々いじっているうちに解決
いじる前後の違いを説明できないと言うのは理解できていないということ。
解決できていない可能性が高い。たまたま動いているだけのソースを直すのが...

550:デフォルトの名無しさん
07/09/09 23:47:30
>>545
あと、自演乙

551:デフォルトの名無しさん
07/09/10 00:19:22
「vectorの部分で止まってしまいます」
これがダウトだったんだろうな

552:デフォルトの名無しさん
07/09/10 00:58:09
メンバ関数ポインタから整数型へのキャストができた試しはないけど、
どうもそれを禁止している条項が規格を洗っても見つからない。
誰か、どこにあるか知ってる人いますか?

553:デフォルトの名無しさん
07/09/10 01:10:26
肯定的な形でreinterpret_castの

554:デフォルトの名無しさん
07/09/10 01:55:41
ポインタは同じサイズの整数型へとキャストできるけど、結果は処理系依存、ってやつのことですよね?
処理系依存だから禁止するのも処理系次第、ってことでいいんですかね。

555:デフォルトの名無しさん
07/09/10 02:02:42
僕の肛門からも悪魔が出そうです><

556:デフォルトの名無しさん
07/09/10 02:03:29
ポインタを同じサイズの整数型にキャストしたときは、それを元のポインタに戻せるはずじゃ?

A pointer converted to an integer of sufficient size (if any such exists on the implementation)
and back to the same pointer type will have its original value;
mappings between pointers and integers are otherwise implementation-defined.

557:デフォルトの名無しさん
07/09/10 02:04:32
いや、そもそもキャスト自体がコンパイル通らない。
VC++ でも g++ でも。

558:デフォルトの名無しさん
07/09/10 02:08:24
もちろん、普通のポインタならキャストは通る。
でも、メンバポインタだと通らない。
警告じゃなくて、エラーになる。

559:デフォルトの名無しさん
07/09/10 02:16:34
メンバポインタは

560:デフォルトの名無しさん
07/09/10 02:20:11
>>558
だったらメンバ関数のキャストの仕方間違ってるだけだろ

561:デフォルトの名無しさん
07/09/10 02:21:32
boostとかで、
namespace xxx_detail{ ふがふが }
ってのを見掛けるんですが、
これは何か意味あるんですか?
ADLの効果抑止とか?

無名namespace( namespace { げふげふ } )とかじゃダメなの?

562:デフォルトの名無しさん
07/09/10 02:26:30
(C++というプライドに賭けた)保守性を考慮した結果。
彼らがあくまでC++プログラマという事を忘れてはいけない。

563:デフォルトの名無しさん
07/09/10 03:40:05
>>561
ヘッダで宣言するコンポーネントに無名 namespace の名前を使ったら、
コンパイル単位ごとに個別の宣言になっちゃうから、 ODR 違反になるだろ。

564:デフォルトの名無しさん
07/09/10 07:42:42
>>552
5.2.10 p4 の以下の記述がメンバへのポインタから整数型への変換を許しているように読める。
"A pointer can be explicitly converted to any integral type large enough to hold it."

でも 3.9.2 p3 に以下の記述がある。
"Except for pointers to static members, text referring to “pointers” does not apply to pointers to members."

"A pointer" も同様に、メンバへのポインタは含まないってことじゃない?

565:デフォルトの名無しさん
07/09/10 10:43:59
C/C++室でも出てた話題だけど、メンバポインタはvoid*には変換できないが、メンバポインタへのポインタならvoid*に変換できると誰かが言っていた。
[void*]を[整数型]として考える

566:デフォルトの名無しさん
07/09/10 10:56:38
>>564
それだ! 凄いわ。ありがとう。

567:デフォルトの名無しさん
07/09/10 11:03:16
人権擁護委員会が在日を擁護する時
URLリンク(www.kajisoku-f-2.com)
URLリンク(www.kajisoku-f-2.com)

568:デフォルトの名無しさん
07/09/11 11:27:29
質問です。hogeオブジェクトを大量に生産しつつ、いらなくなったものを削除しようとして、
以下のようなコードを書きました。

//using namespace std;

//hoge pHoge = new hoge();
//pHogeList.push_back(pHoge);

list<hoge*>::iterator it = pHogeList.begin();
while(it != pHogeList.end()){
if (/*消滅条件が整ったら*/){
delete *it;
*it = NULL;
}
it++;
}
pHogeList.remove(NULL);

しかし、なぜかhogeオブジェクトを生産し続けると動作が極端に遅くなります。
双方向リストを使用し続けると動作が遅くなるということはあるのでしょうか?
このやり方が悪いのでしょうか? もしくは、別の原因があるのでしょうか?


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch