スレを勃てるまでもないC/C++の質問はここで 12at TECH
スレを勃てるまでもないC/C++の質問はここで 12 - 暇つぶし2ch116:デフォルトの名無しさん
09/07/27 13:43:11
>>113
x方向にデータが連続していると言う条件はつくけど、std::copyでも使えばいいんでない。
# cなら>115で。

117:デフォルトの名無しさん
09/07/27 13:50:18
そうですね組み込み以外でもつかうんでstd::copyします
>>115,>>116どうもでした

118:デフォルトの名無しさん
09/07/27 19:18:23
C++
コンソールで、カーソルの位置を一行上に挙げたいのだが。
エスケープシーケンスは使えん。
使えるように設定できるのは知ってるが、別の方法で頼んだ。

119:デフォルトの名無しさん
09/07/27 19:21:34
で、その結果は?

120:デフォルトの名無しさん
09/07/27 20:32:20
shared_ptrって

(*p).hoge() と p->hoge();ってどっちがいいの?

121:デフォルトの名無しさん
09/07/27 21:01:46
p->hoge();


122:デフォルトの名無しさん
09/07/27 21:46:51
>>120
何のためにアロー演算子があると思っているのだ。
p->hoge()
が望ましい。

123:助けて
09/07/27 22:16:07
10進数から2進数に変える時、2進数を補数表現で表すプログラムを教えて下さい。

ドシロウトなんで、お願いします。

124:デフォルトの名無しさん
09/07/27 22:19:51
>2進数を補数表現で表す
???????????????

125:デフォルトの名無しさん
09/07/27 22:39:30
>123

十進数 -10 を変換したとして
-1010 ではなく 1111111111110110 と表示したいのか?

126:デフォルトの名無しさん
09/07/27 22:49:21
補数って、1の補数とか2の補数ってやつだよな。
もう忘れた。

127:デフォルトの名無しさん
09/07/27 22:53:44
>>123
signed intなりsigned longに代入したあとに1ビットずつビット演算で取り出す

128:助けて
09/07/27 22:54:36
>125

はい。その通りです。

129:デフォルトの名無しさん
09/07/27 23:05:28
class hoge {
private:
int *p;

public:
hoge(int x) : p(new int[x]) {}
~hoge() {delete [] p;}
void fuga() {・・・}
};

int main(void) {
try {
std::cin >> x;
hoge h(x);
}
catch(std::bad_alloc& e) {
std::cout << e.what() << std::endl;
}

h.fuga();

return 0;
}

↑スコープが外れちゃうからh.fuga()でコンパイルエラーになってしまう
自動変数に対してtry-catchする場合はtryスコープを伸ばすしかない?
保守性を考えて自動変数からスマートポインタに変えるのがいいのかな?

130:デフォルトの名無しさん
09/07/27 23:18:10
>>128
#include <bitset>
#include <iostream>

using namespace std;

int main() {
const unsigned long value = 10;

bitset< 16 > b( value - 1 ), result;
result = ~b;
cout << result.to_string() << endl;
}

131:デフォルトの名無しさん
09/07/27 23:23:38
>>129
君が try しているのは hoge オブジェクトじゃないのか?
それなのに、どうして try の外でそのオブジェクトを使おうとするのだ…。

132:デフォルトの名無しさん
09/07/27 23:41:46
tryしたいのは生成だけなのに延々としたまでスコープを伸ばしたくないんです
tryスコープの中って処理重くなりそうだし、できるだけ短くしたほうがよかないですかね?

133:デフォルトの名無しさん
09/07/27 23:44:25
catchは下のほうにまとまってたほうがよかないか?

134:デフォルトの名無しさん
09/07/27 23:46:42
tryの中だから遅くなるなんてことはない。
実装にもよるが、tryに入るとき、抜けるとき、throwするとき、(catchして)catch節を抜けるときなど
基本的に要所要所でしかコストはかからないとみていい。

135:デフォルトの名無しさん
09/07/27 23:47:17
>>132
わかるわかる。
自転車がパンクしてるかどうかをチェックしたいし、その結果は大事だけど、その後はもちろん自転車に乗るってことだよね

136:デフォルトの名無しさん
09/07/27 23:51:54
あ、あんまし遅くならないんですね
ずっと中の人が監視してなにか操作するたびチェックしてるのかと思ってた・・・
とすると
void func() {
    try{
        // 全処理
    }
    catch(ex1 &e) {
        // ~
    }
}
    catch(...) {
        // ~
    }
}
みたいにやるほうがいいのか
どうもどうも。すっきりしました

137:助けて
09/07/28 00:01:45
>130

ありがとです

138:デフォルトの名無しさん
09/07/28 09:48:09
なんでC++の標準ライブラリのヘッダって、.h って統一的なファイル名の
つけ方をやめちゃったの?
拡張子ついてないから、扱いつらくない?

139:デフォルトの名無しさん
09/07/28 10:27:12
>>138
多分苦肉の策だと思う

140:デフォルトの名無しさん
09/07/28 11:01:49
>>138
標準化委員会に言ってくれ。

まあ一応 統一的に(一様に).h付いてないから
俺は許せるけど。

141:デフォルトの名無しさん
09/07/28 11:17:45
>>138
それがファイルでなくても構わないから。

142:デフォルトの名無しさん
09/07/28 11:23:14
タイプ量が減ってありがたいじゃないか。

143:デフォルトの名無しさん
09/07/28 11:35:21
>>141
その点は、Cの.hも同じですがね。

144:デフォルトの名無しさん
09/07/28 14:02:41
.hppが一番クール

145:デフォルトの名無しさん
09/07/28 14:20:10
>>138
Effective C++の49項を見る限りは、.hと差別化する最も単純な方法として
拡張子を無くす案が採られたみたいだね。

146:デフォルトの名無しさん
09/07/28 15:03:46
hxxじゃだめだったんかな

147:デフォルトの名無しさん
09/07/28 15:08:47
画面に指定した座標の点をプロットしたいのですが、
そういったことが出来る簡単なC++ライブラリはありますか?


148:デフォルトの名無しさん
09/07/28 15:11:05
DXライブラリを使いましょう

149:デフォルトの名無しさん
09/07/28 15:11:10
Win32API

150:デフォルトの名無しさん
09/07/28 15:13:10
ありがとうございます。
DirectXスレかAPIスレに逝ってきます

151:デフォルトの名無しさん
09/07/28 15:39:11
>147がLinux使いだったら大笑いだな。まさしく、井蛙の愚だ。

152:デフォルトの名無しさん
09/07/28 15:44:43
>>151
敢えて触れない方がいいと思ったけど、とっても気になったので理由を聞かせてもらおうか

153:デフォルトの名無しさん
09/07/28 16:05:34
>>151
何で?


154:デフォルトの名無しさん
09/07/28 16:18:05
DXライブラリもWinAPIもWindows用だからだろ。JK

155:デフォルトの名無しさん
09/07/28 16:22:26
MACかもしれないといってみるテイスト

156:デフォルトの名無しさん
09/07/28 17:14:57
それがなんで井蛙の愚につながるの?
誰も井の中の蛙ではなくないか?

157:デフォルトの名無しさん
09/07/28 17:17:58
自身の環境を書かない>147や、Windowsだと決めて掛かる>148-149をからかったんだろうけれど、
顧みすれば>151自身が井の中の蛙になっている罠。

158:デフォルトの名無しさん
09/07/28 17:22:37

井(い)の中の蛙(かわず)大海(たいかい)を知らず

自分の狭い知識や考えにとらわれて、
他の広い世界のあることを知らないで
得々としているさまをいう。
井蛙(せいあ)。

まあ・・・なんかどうでも良くなってきた。

159:デフォルトの名無しさん
09/07/28 17:24:58
PC
デバイスA デバイスBでシリアル通信する。

PCからはデバイスA,Bに対して交互に1S間隔で
リードコマンドを発行している。
AまたはBがある状態になるとリードコマンドに対して
1バイトの'b'を返すようになる。
デバイスA、Bともには電源立ち上げ時バージョン情報等を
PCに送るがその文字列の中に'b'が含まれている。
PC側はリードコマンドに対する応答の'b'だけを判断したい。
デバイスA,Bの電源立ち上げ時の情報は固定ではく、'b'が
含まれているとする。
このような内容だとどのようにコマンドに対する応答の'b'
であると判断するのがよいでしょうか?

160:デフォルトの名無しさん
09/07/28 17:32:02
PCのリードコマンドを出す前にPCの受信バッファを空にしておくとか?

161:デフォルトの名無しさん
09/07/28 17:36:31
>>157
決めてかかったわけじゃないですよ
質問者が使う環境じゃなきゃ質問者は勝手に捨て置くでしょ

162:デフォルトの名無しさん
09/07/28 18:21:09
掛け声みたいだな
「無礼者め手打ちにしてくれる、井蛙(せいあー)!!」

163:デフォルトの名無しさん
09/07/28 19:43:24
DXライブラリでゲームを作り始めたのですが、
メインループの書き方がおかしくないか不安です ><

#include "GV.h"

int WINAPI WinMain(
HINSTANCE hI,HINSTANCE hP,
LPSTR lpC,int nC
)
{
ChangeWindowMode(TRUE);
if(DxLib_Init() == -1) return -1;

Flame* T = new Flame;
SetDrawScreen(DX_SCREEN_BACK);
while(!(ProcessMessage()) && !(CheckHitKey(KEY_INPUT_ESCAPE))
&& (T -> MainLoop()) && !(ScreenFlip()) && !(ClsDrawScreen()));

DxLib_End();
return 0;
}
こんな感じなんですが・・・・


164:デフォルトの名無しさん
09/07/28 19:48:27
もしかして: Frame

165:デフォルトの名無しさん
09/07/28 19:50:52
うわぁ・・・・
勢いだけで作成中なので英語力のなさが出た結果だとしか・・・
orz(それでもゲームを作りたいんです)

166:デフォルトの名無しさん
09/07/28 19:54:48
Yahoo!辞書 - flame
URLリンク(dic.yahoo.co.jp)


167:デフォルトの名無しさん
09/07/28 20:03:24
殻っていみのフレームのつもりがフレイムになってたなんて・・・
もしかしてこの質問ってスレチってやつでしょうか?

168:デフォルトの名無しさん
09/07/28 20:26:56
ゲームプログラムなら俺に聞け ってスレがあるよ

169:デフォルトの名無しさん
09/07/28 20:28:48
ゲ製の方を紹介してやれよ

170:デフォルトの名無しさん
09/07/28 20:46:04
ここより雰囲気のいいスレッドが見つけられないオ↓レ↑は、
専ブラで2chを覗く程度の初心者です。

171:163
09/07/28 21:31:24
とりあえず
スレリンク(gamedev板)
こっち行ってみます。ふんいきこわいけど・・・

スレチすマソでしたー。



172:デフォルトの名無しさん
09/07/28 23:21:22
classの全部のメソッドで通常の例外チェック再スローと
STLなどの外部ライブラリが出すかもしれない把握できない例外用のcatch(...){throw UnknownException();}
をやってるんですが、やりすぎでしょうか?
例外ってドキュメントが少なくてどうやればいいのかなかなか方針が定まりません

173:デフォルトの名無しさん
09/07/28 23:51:33
>>172
どう考えるかによるんじゃね?
例えばSTLの投げる例外ならそのままthrow;で外に再送してあげた方が
むしろ親切では?


174:デフォルトの名無しさん
09/07/29 00:33:01
カプセル化の事を考えて例外も隠蔽して
指定したもの以外出さないほうがいいかなぁと思ったんですが・・・

175:173
09/07/29 07:23:08
>>174
例外クラスは知ってるよね?
例えば
C++編(標準ライブラリ) 第27章 例外クラス
URLリンク(www.geocities.jp)
std::exceptionクラスを継承したものについては
そのまま投げてあげた方が。。
まあ再送しなくても内部で処理できる問題だったらいいけど、
そうでなくて全部例外を飲み込んでUnknownException();にしちゃうのは
どうだろう?

だれか他の方も意見くださいな。

176:デフォルトの名無しさん
09/07/30 19:50:12
shared_ptr<> でnew deleteがほんとに1対1になってるか確かめたいんですけど
グローバル変数を用意してコンストラクタで++、デストラクタで--とすればいいのかなと思うんですが
これだと組み込み型のカウントをするのに困ります。どうすれば良いでしょうか?

177:デフォルトの名無しさん
09/07/30 21:00:36
>>176
グローバルなoperator newとoperator deleteを定義すればいいと思う。

178:デフォルトの名無しさん
09/07/30 21:08:40
>>176何故?何のため?


179:デフォルトの名無しさん
09/07/30 22:07:31
コードを重複して書くのがいやなのでtemplateで書いた
けど公開するのは、例えば<int>と<double>だけに限定したい
こんなときはどうすればいい?

class Hoge {
private:
template <typename T> class Fuga {};

public:
typedef Fuga<int> _IntFuga;
typedef Fuga<double> _DoubleFuga;
};

typedef Hoge::_IntFuga IntFuga;
typedef Hoge::_DoubleFuga DoubleFuga;

これよりいい方法あったら頼む!

180:デフォルトの名無しさん
09/07/30 22:13:07
明示的な実体化をした実装を別ファイルに移して、
クライアントコードから見えなくする

181:デフォルトの名無しさん
09/07/30 22:54:19
>>180
いまいちわからないんだけど、

hoge.h
template < typename Type > class Hoge ;
template <> class Hoge< int > ;
template <> class Hoge< double > ;

hoge.cpp
#include "hoge.h"
template <> class Hoge< int > {} ;
template <> class Hoge< double > {} ;

main.cpp
#include "hoge.h"
int main( void ) { Hoge< int > ihoge ; Hoge< double > dhoge ; /* ~ */ ; return 0 ; }

みたいな感じ・・・?
これだと結局重複したコードを書いてるから意味無いような
やりかたが間違ってるのかな?

182:デフォルトの名無しさん
09/07/30 22:58:33
ていうか↑コンパイルできないですね
もうちょっと勉強してきます

183:デフォルトの名無しさん
09/07/30 23:01:13
template関連はごちゃごちゃしてるので記憶が曖昧だが許してくれ。

hoge.h
template < typename Type > class Hoge;

hoge.cpp
template < typename Type > class Hoge { } ;
template class Hoge < int > ;
template class Hoge < double > ;

main.cpp
(同じにつき略)

184:デフォルトの名無しさん
09/07/31 02:13:34
class hoge{
private:
class hoge_sub{
};
std::vector<hoge_sub> a(20);
public:
};

class内で固定長のclass型の配列を作りたいのですが
VC++で
error C2059: 構文エラー : '定数'
というエラーを吐かれてしまいます
このような場合どうすれば良いのでしょうか

185:デフォルトの名無しさん
09/07/31 02:22:50
>>184
コンストラクタ初期化子
class hoge{
private:
class hoge_sub{
};
std::vector<hoge_sub> a;
public:
hoge() : a(20) {}
};

186:デフォルトの名無しさん
09/07/31 02:23:01
vectorはそもそも配列じゃないですし
可変長なので固定長にもなりません。^^
vectorではなく、配列を使ってください。
hoge_sub a[20]; のようにするのです。

187:デフォルトの名無しさん
09/07/31 02:52:31
>>185,186
ありがとうございます
class型の配列を扱いたいなと思った時に調べましたところ
vectorを使う方法が紹介されてましたので、誤って認識していました


188:デフォルトの名無しさん
09/07/31 07:17:30
>>187
せめて入門書一冊分くらいは基礎を学んでおいた方がいいとおもうぞ。

189:デフォルトの名無しさん
09/07/31 22:45:01
>>188
入門書として適切なものを教えてください。
いや、手元には独習がありますが、ぜんぜん足りないような気がしているのです。

190:デフォルトの名無しさん
09/08/01 00:53:20
ハーバートシルト先生に教えてもらっておいてまだ足りないとな?

191:デフォルトの名無しさん
09/08/01 08:06:09
独習C++なんて捨ててaccelerated C++とexceptional C++を読むんだ

192:デフォルトの名無しさん
09/08/01 10:16:59
独習C++半分ぐらい読んで、EffectiveC++、More~を全部読んで、独習デザインパターンも半分ぐらい読んで、ゲーム作る程度にはそれで十分だった

193:デフォルトの名無しさん
09/08/01 10:36:12
あまりの糞さに独習(ryは半分で飽きたということですね…わかります

194:デフォルトの名無しさん
09/08/01 11:42:47
マナたん(藁)→ロベールの次に読めるまともな本を教えて下さい

195:デフォルトの名無しさん
09/08/01 18:27:53
#include <iostream>

class hoge {
private:
int x;

private:
class in_hoge {
public:
in_hoge() {std::cout << x << std::endl;}
};

in_hoge ihoge;

public:
hoge() : x(100), ihoge() {}
};

int main(void) {
hoge h; // output: 100

return 0;
}

コンパイルできないんだけど、どうやれば実装できるかな?

196:デフォルトの名無しさん
09/08/01 18:36:36
>>195
in_hogeのコンストラクタにxを渡せばいいんじゃね?

197:デフォルトの名無しさん
09/08/01 18:51:33
in_hogeの配列を確保する予定なので、コンストラクタに引数を渡せないのです・・・

198:デフォルトの名無しさん
09/08/01 18:57:14
配列使うかわりにvector使えばいいんじゃね?

199:デフォルトの名無しさん
09/08/01 21:48:17
stringのreserve()ってメモリをここでいっぺんに確保して後の操作で動的確保をなるべくしないようにってことでいいの?
resize()との違いがようわからん

200:デフォルトの名無しさん
09/08/01 21:48:44
URLリンク(d.hatena.ne.jp)

忍法ししちょびれ。

201:デフォルトの名無しさん
09/08/01 21:50:28
>>199
Yes, 高洲クリニック。
reserveは指定したサイズになるように「空き容量」を増やす。
resizeは指定したサイズになるように要素の数を増やすか減らす。
増えた要素は例えば0で埋められるし、減らされた要素は削除される。

202:デフォルトの名無しさん
09/08/02 18:41:23
VS C++ 2008 EE で コマンドラインから cl をつかってコンパイルする方法はないものですか?
パスをとおし、バッチファイルvcvers32.bat を実行しただけはうまくいかないようです。

203:デフォルトの名無しさん
09/08/02 18:45:50
>>202
それだけでできると思うけど、スタートメニューの中に
Visual Studio 2008 コマンドプロンプトとかいうのがあるはず。そっちが確実。

204:202
09/08/02 18:49:23
自己解決です。
URLリンク(msdn.microsoft.com)
に詳細がありました。でも専用のcmd を使わないとダメなようです。cygwin プロンプトから実行というわけにはいかないようです。


205:202
09/08/02 18:50:11
>> 203
ありがとうございます。

206:デフォルトの名無しさん
09/08/02 19:01:09
Javaスレ、 C++スレ迷いましたが、上のほうの板は荒れ気味なのでここで質問させてください。宜しくお願いします。
g++ (GCC) 4.2.4 です
java からC++ で作ったプログラムを使いたいのですが、どのような手順で作成すれば良いのでしょうか、
参考になるHP とかがあれば教えてもらえませんか。

207:デフォルトの名無しさん
09/08/02 19:01:53
>>204
Cygwin上で使いたいのなら、自分で環境変数INCLUDEとLIBとPATHを設定すればいい。
C++/CLIを使うならLIBPATHも。
内容はVisual Studioコマンドプロンプトの丸写しでいい。

あるいは、Visual Studioコマンドプロンプト上でCygwin.batを呼んで起動するという手もある。

208:デフォルトの名無しさん
09/08/02 19:02:37
>>206
まずはJNIでググるんだ。
よく分からなかったら、どこがどう分からないかを書き添えてもう1度聞きに来るといい。

209:デフォルトの名無しさん
09/08/02 19:16:43
>>208 さん、早速の回答ありがとうございます
やはりやり方といいますかjava で呼び出すことができるんですね、よく分かりました
Windows でもLinux でもdll を作成してJava Native Interface 機能を用いて呼び出すことができるんですね、どうもありがとうございました。

210:デフォルトの名無しさん
09/08/02 23:29:35
質問です。
C++でソケット使ったメール送信プログラム組んでます。

ループ内でコネクト・ライト・シャットダウン、クローズを
繰り返して複数メールの送信をしているのですが、
データ量が有る場合に送信されずにクローズしてしまいます。
送信バッファの指定・リンガ設定もしたのですが、変わりませんでした。
ソケット内での解決法やロジックでの解決法があれば
教えて下さい。。

211:デフォルトの名無しさん
09/08/02 23:32:05
ソースを晒さないとなんとも

212:デフォルトの名無しさん
09/08/03 00:54:59
>>210
パケットダンプ追えば、何がおきてるかわかるんじゃね?

213:デフォルトの名無しさん
09/08/03 01:47:48
関数の終了コード(errnoとか)は見てる?

214:デフォルトの名無しさん
09/08/03 16:07:40
msdnのドキュメントなんだが、関数別に投げる可能性のある例外とか書いてあるページって無いものかな?
知りたかったらいちいちソース読まないといけないんだろうか・・・

215:デフォルトの名無しさん
09/08/03 16:18:48
ないよー

ちなみに何の関数について知りたい?

216:デフォルトの名無しさん
09/08/03 16:36:11
>>215
今回知りたいのはtr1のmt19937とuniform_intですけど、ほかのも結構頻繁に気になります

217:デフォルトの名無しさん
09/08/03 18:19:23
最近の SDK には boost が含まれてるのか?

218:デフォルトの名無しさん
09/08/03 20:18:14
0xだろ

219:デフォルトの名無しさん
09/08/03 21:48:05
>>217
0xの先取りTR1
randomのほかshared_ptr, regex, unordered_map/setなんかのライブラリが入っている。

VC++では2008に拡張パックまたはSP1で導入できる。
URLリンク(msdn.microsoft.com)

220:デフォルトの名無しさん
09/08/03 21:52:33
VC++のSTLのソースってすごい見づらい

221:デフォルトの名無しさん
09/08/04 17:33:29
関数オブジェクトとかよくいうけど関数ポインタでいいじゃんっておもう
なにがすごいのこれ?

222:デフォルトの名無しさん
09/08/04 17:44:50
インライン展開できる

223:デフォルトの名無しさん
09/08/04 19:34:41
インスタンスが持てる

224:デフォルトの名無しさん
09/08/04 21:34:17
operator =ってコピコンみたいに継承元のコピー勝手に呼んでくれる、みたいな思いやりの精神は無いの?

225:デフォルトの名無しさん
09/08/04 21:47:11
コピコンにそんな機能あったのか

226:デフォルトの名無しさん
09/08/04 21:51:21
ないはず
勝手に呼ばれるのは継承元のデフォコンでは?

227:デフォルトの名無しさん
09/08/04 22:12:57
おまえら普通にコピコンとかデフォコンとかやめてください

228:デフォルトの名無しさん
09/08/04 22:13:45
Base::operator=を最初に呼ばないといかんのかめんどくさいな

229:デフォルトの名無しさん
09/08/04 22:15:28
じゃあシスコンで

230:デフォルトの名無しさん
09/08/04 22:18:21
デスコンとか超強そう

231:デフォルトの名無しさん
09/08/04 22:22:29
デスコン使うとか必死ですねwww

232:デフォルトの名無しさん
09/08/05 13:07:10
例外って難しいです・・・

233:デフォルトの名無しさん
09/08/05 16:30:13
さじを投げてるだけじゃん。
誰かが拾って続きやるかもしれないけど、そいつもさじ投げるかもね。

234:デフォルトの名無しさん
09/08/05 22:01:09
Enterを押したら処理が進むようにするにはどのようにすれば良いのでしょうか?
char dammy;
cin >> dammy;
cout >> "Hit";

のようにしてもEnterだけだと入力を受け付けられず、
なにか文字をいれてEnterをおさないと進みません。
よろしくおねがいします。

235:デフォルトの名無しさん
09/08/05 22:47:39
int dummy;
dummy = cin.get();
cout << "Hit";

236:デフォルトの名無しさん
09/08/05 23:00:53
>>235
ありがとうございます。
ぶじかいけつできました。!!

237:デフォルトの名無しさん
09/08/06 01:24:15
20個ものclassのインスタンスがあるのですが、
rand()%20 +1でせいせいした1~20までの数に合わせて
それぞれのインスタンスにメソッドを適用したいです。
classのインスタンスを引数にわたしてメソッドを実行する関数を書いたので
classの配列をつかってその関数にclassを渡したいです。Web検索で
vectorを使うとかの説明は1つだけ出てきたのですが詳しくわからないのでよろしくおねがいします。

具体的にいうと
class Hoge
{
public:
Hoge() {}
void fuga() {}
};

void foo(Hoge h)
{
h.fuga();
}
int main(void)
{
Hoge a;
Hoge b;
Hoge c;
hit = rand()%3 + 1;
class_array = なんらかのほうほうでa,b,cの配列
foo(class_array[hit]);
return 0;
}
と言う風にかけないかと思っています。
よろしくおねがいします。

238:デフォルトの名無しさん
09/08/06 01:29:08
Hoge a;
Hoge b;
Hoge c;
hit = rand()%3 + 1;

じゃなくて

Hoge class_array[3];
hit = rand()%3;

じゃだめ?

まあfooは参照かアドレスで渡すべきというのは置いておいて。


239:デフォルトの名無しさん
09/08/06 01:31:37
>>238
すみません、大事な部分を忘れていました。
a,b,cのコンストラクタにはいくつかそれぞれ別の引数を渡したいのですが、
それもふまえた上でよろしくおねがいします。(上のコードのclass Hogeのコンストラクタは引数をとる物に変更してください)

240:デフォルトの名無しさん
09/08/06 01:36:19
こら。

Hoge *class_array[3];
にして、それぞれ new すれば良いでしょ。

>それもふまえた上でよろしくおねがいします。
>(上のコードのclass Hogeのコンストラクタは引数をとる物に変更してください)

どんだけ上目線なの。



241:デフォルトの名無しさん
09/08/06 01:38:35
>>240
なるほど、なんとなくわかってきました。
ありがとう御座います。
>どんだけ上目線なの。
すいませんでした、いま自分の望んでいる動作を日本語にするのが難しくて
変な日本語になっていました。すいません。

242:デフォルトの名無しさん
09/08/06 01:40:17
実際はインスタンスが100個以上あるので、できればもう書いて生成してしまったインスタンスを
けしてそれぞれnewし直す事なく修正したかったのですが、無理なようですね。
とりあえずがんばろうと思います。

243:デフォルトの名無しさん
09/08/06 01:43:27
ポインタ知ってる?

244:デフォルトの名無しさん
09/08/06 01:49:11
どうやったらコンテナじゃないインスタンス100個とか糞みたいなコード書けるんだ

245:デフォルトの名無しさん
09/08/06 01:57:56
>>244
すいません、まだC++についてよくわかっていないのです..
おなじ種族に属する物で名前やジャンルが違うものを
100個の内50個はデフォルトでひつようで残りの50個は条件の違いによって
生成時に与えられるパラメータが違うという妙な仕様になっていて
しかも100個どれが使用されるかはわからないという変なプログラムなんですよ。
まあ簡単にいうと動物園みたいなものです。

246:デフォルトの名無しさん
09/08/06 02:03:37
配列にするのが嫌ならswitchでも使えばいいでしょ。
Hoge& selectHitTarget(Hoge& a, Hoge& b, Hoge& c)
{
switch(rand() % 3)
{
case 0: return a;
case 1: return b;
case 2: return c;
}
}
int main(void)
{
Hoge a;
Hoge b;
Hoge c;
Hoge& hit = selectHitTarget(a, b, c);
foo(hit);
return 0;
}

247:デフォルトの名無しさん
09/08/06 02:08:50
246は何の解決にもなってないので却下として、

生成時に与えられるパラメータでインスタンスの生成方法が変わるものを
100個分書いた時点でなんかもう…。ま、書き直しを勧めます。
普通はパラメータは外部配列にしておくか、アルゴリズムで与えて、
オブジェクトが100個だろうが100000個だろうがループで回して配列に
入れながら new するでしょうね。
#スケーラビリティと言います。

この後はアドレス渡しではまって、継承ではまって仮想関数ではまって…
となるのね。出題者は「わん」とか「にゃー」とか呼び分けたいだけなのに、
その手前で悩んでるパターンですかね。。。



248:デフォルトの名無しさん
09/08/06 02:25:46
static変数にパラメーターリストを入れて
デフォルトコンストラクタでそれを参照しながら初期化するとか
でもなんか気持ち悪いな・・・

249:デフォルトの名無しさん
09/08/06 02:30:53
オレだったらコンストラクタをテンプレート関数にして個々のメソッドの中にconstメンバを基にSTATIC_ASSERT吐く様にする

250:デフォルトの名無しさん
09/08/06 02:32:32
モンスターのパラメータ
ランダムエンカウント時のモンスター決定
かと思った

251:デフォルトの名無しさん
09/08/06 11:49:18
URLリンク(racanhack.sourceforge.jp)

このページのコードを実行したいのですがGlibはどうやって導入すればいいんでしょうか
WindowsXPでVisual Studio 2008 Expressを使ってます

252:デフォルトの名無しさん
09/08/06 13:37:37
>>251
GTK+の本家サイトでWin32版がダウンロードできるみたいだよ
URLリンク(www.gtk.org)

253:253
09/08/06 21:02:01
CもしくはC++でウェブ上の画像をURLを指定してhttpでダウンロードしたいのですが
できなくて困っています。

環境は下の通りです。
OS:windows XP
開発環境:Visual C++ 2008 ExpressEdition(win32プロジェクト)

htmlファイルならwininetを使ってダウンロードできたのですが、
画像だとできません。htmlファイルと同様に画像もできないのでしょうか?
また、wininet以外でいい方法があるなら教えてください。

サンプルプログラムは次に書きます。


254:253
09/08/06 21:06:00
HINTERNET hInet, hUrl;
char szBuf[128], *lpszSrc;
DWORD dwRead;
int nTotal = 0;
HGLOBAL hMem;
//目的のURLの入力
char szUrl[] = "URLリンク(hogehogehgoe.co.jp)";
hInet = InternetOpen("hoge",INTERNET_OPEN_TYPE_PRECONFIG,NULL, NULL, 0);
if (hInet == NULL) return -1;
hUrl = InternetOpenUrl(hInet, szUrl, NULL, 0, 0, 0);
if (hUrl == NULL) return -1;
//lpszSrcに1バイトのみ確保
hMem = GlobalAlloc(GHND, 1);
lpszSrc = (char *)GlobalLock(hMem);
while (1) {
InternetReadFile(hUrl, szBuf, (DWORD)sizeof(szBuf) - 1, &dwRead);
szBuf[dwRead] = '\0';
//読み出す物がなくなったのでループ脱出
if (dwRead == 0)break;
//必要バイト数の計算
nTotal += dwRead;
//確保領域の大きさ変更
hMem = GlobalReAlloc(hMem, nTotal, GMEM_MOVEABLE);
if (hMem == NULL) break;
lpszSrc = (char *)GlobalLock(hMem);
if (lpszSrc == NULL) break;
strcat_s(lpszSrc, nTotal+1, szBuf);
}

続く

255:デフォルトの名無しさん
09/08/06 21:07:14
strcat?
画像の途中に 0x00 があったら、そこで切れない?

256:253
09/08/06 21:07:18
//ファイル出力処理
std::ofstream fileout;
fileout.open("D:/hoge.jpg"); // 出力ファイルをオープン
if (!fileout){
MessageBox(NULL , TEXT("エラー!出力ファイルをオープンできません") ,TEXT("") , MB_OK);
return -1;
}
fileout << lpszSrc <<'\n';
fileout.close();

//メモリの解放
GlobalUnlock(hMem);
GlobalFree(hMem);
//インターネットハンドルの解放
InternetCloseHandle(hUrl);
InternetCloseHandle(hInet);

以上です。
すいませんがアドバイスください、お願いします


257:253
09/08/06 21:21:11
>>255
そうなんですか?
じゃあ画像ファイルの場合どうしたらいいのでしょうか?

258:デフォルトの名無しさん
09/08/06 21:30:44
どこまで格納したか覚えておいて、memcpyで

memcpy(&lpszSrc[現在の位置], szBuf, dwRead);
現在の位置 += dwRead;

みたいな感じで

259:253
09/08/06 21:51:36
>.258さん、ありがとうございます。

>>254のサンプルプログラムのwhileループの前で
int nowI = 0;
と宣言して
whileループの最後のstrcat_sをコメントアウトして下の二行を追加しました。
memcpy(&lpszSrc[nowI], szBuf, dwRead);
nowI += dwRead;

でもできませんでした。なにか間違ってますでしょうか?
ファイルは作成されてるんですけどデータがほとんど入っていないようで
画像ファイルとして開けません。


うう・・・
別にwininetにこだっているわけではありません。
C/C++(VC+ EE)でweb上の画像をダウンロードする方法が他にあるのなら
wininetじゃなくてもいいです。

260:デフォルトの名無しさん
09/08/06 22:20:19
おまえは、まず、バイナリデータをファイルに書き込んで、それを読み込むことが出来るのか?
話はそれからだ。

261:デフォルトの名無しさん
09/08/06 22:37:57
fprintfで書いてるんじゃなかろうな

262:253
09/08/06 22:51:10
>>おまえは、まず、バイナリデータをファイルに書き込んで、それを読み込むことが出来るのか?
うぅ、できません・・・
どうやら全然基礎が足りないみたいです。
もう一度勉強しなおします。
スレ汚してすいませんでした。

263:デフォルトの名無しさん
09/08/07 00:21:20
今時ポインタがあるプログラミング言語なんてゴミ
らしいのですが
いまどき一番需要のあるプログラミング言語は何でしょうか?

264:デフォルトの名無しさん
09/08/07 00:30:01
>>263
スレタイ読め

・・・っとただの釣りだったか。

265:デフォルトの名無しさん
09/08/07 02:05:25
char (*a)[10];
a = malloc(10 * n * sizeof(char*));

とすれば、n行10列のメモリ領域を確保できると思います。
しかし、実際にこの領域に格納したいデータは、
hoge0、hoge1、…、hoge100、… のように、添え字がついており、長さがどんどん長くなります。
極端な話、char (*a)[100]; のように、十分に大きい値に設定しておけば問題ないのですが、
何かメモリ領域をうまくとる方法はありませんか。

266:デフォルトの名無しさん
09/08/07 03:06:38
char (*a)[10];
a = malloc(n*sizeof(char [10]));

sizeof(char *)で何をしようと思ったのか理解できないのだが
もう少し詳しく書いてくれると良い情報が聞き出せるかもね

267:デフォルトの名無しさん
09/08/07 04:37:52
reallocしたいとか
vector使えとか
そういう話じゃないかね

268:デフォルトの名無しさん
09/08/07 05:15:11
ジャグ配列が欲しいって話だろ

269:デフォルトの名無しさん
09/08/07 12:06:41
explicitをコピコンに使うと値渡し・返しができなくなるんだけどそういうもんなの?

270:phenix
09/08/07 16:16:32
>>269
hoge a=b;で渡せないって意味ならそう。
hoge a(b);で渡せる。



271:デフォルトの名無しさん
09/08/07 18:47:28
フェニックスさんキタ!!

272:デフォルトの名無しさん
09/08/08 12:24:01
関数の仮引数名に悩む場合
(どうすれば分かりやすくなるかな?とか)
どう考えて付ける?

273:デフォルトの名無しさん
09/08/08 12:32:22
変数名と同じ扱いでいいんじゃない?

274:デフォルトの名無しさん
09/08/08 12:36:32
>>273
俺は
同じ型の引数を持つ場合、
void foo(hoge_1, hoge_2)
の様にしているんだが、
果たしてこれで分かりやすいと言えるのだろうか。
void foo(hoge_lhs, hoge_rhs)
とどっちが分かりやすいだろう?

と言うか分かりやすい引数って何だろう?


275:デフォルトの名無しさん
09/08/08 12:56:01
ユニークな名前付ける方がいいよ
file_copy(file1, file2) より file_copy( src, dst ) みたいに

276:デフォルトの名無しさん
09/08/08 13:01:10
判り易くしようとすると変数名が長くなりがちだから、
そこらへんのバランスをどうするかが難しいな。

277:272
09/08/08 13:06:24
みんなありがとう。
指針とさせてください。


278:デフォルトの名無しさん
09/08/08 16:23:05
windows xp でファイルの存在を確認したい
プログラムを書きたいのですができなくて困っています。
開発環境はVC++ 2008 Express Edition(win32 プロジェクト)でやっています。

下のプログラムのように、LPCWSTR型にファイルパスを直接代入すれば
できるのですが、ファイルパスはstd::string型の変数で扱いたいです。
LPCWSTR lpszFilePath = TEXT("test.jpg");
if( PathFileExists( lpszFilePath ) ) {
 cout << "指定されたパスにファイルが存在" << endl;
} else {
 cout << "ファイルはありません" << endl;
}

std::stringからLPCWSTRへの型変換の問題になると思うのですが
これがわかりません。




279:デフォルトの名無しさん
09/08/08 16:34:08
LPCWSTR は Long Pointer to Const Wide String なので
C++標準に置き換えると const wchar_t *になるよね?
なので、std::stringでは扱えません。

std::string を使う場合は LPCSTR を使いましょう。

280:デフォルトの名無しさん
09/08/08 16:50:05
>>278
AとWを相互に変換するライブラリがあるらしいよ。使ったことないけど…
URLリンク(msdn.microsoft.com)(VS.80).aspx

#include <atlstr.h>
std::string s = "test.jpg";
LPCWSTR lpszFilePath = CA2W(s.c_str());

281:デフォルトの名無しさん
09/08/08 16:55:57
俺も>>279だな
LPCWSTR → LPCSTR
PathFileExists → PathFileExistsA

282:デフォルトの名無しさん
09/08/08 17:03:47
Standard Edition 以上なら CString ですんじゃうんだけどねぇ。
MFCは嫌い? あ、そう。

283:278
09/08/08 17:06:36
>>279-281
ありがとうございます、できました。

string hogeStr = "test.jpg";
LPCSTR lpszFilePath2 = hogeStr.c_str();
if( PathFileExistsA( lpszFilePath2 ) ) {
cout << "指定されたパスにファイルが存在" << endl;
} else {
cout << "no file!!!!!!!!!!!!!!!!!" << endl;
}

ちなみに>>280さんのATL(#include <atlstr.h>)は
Express editionでは使えないみたいです。
URLリンク(www.microsoft.com)

もう、やりたいことができたのでいいんですけど・・・
ともかく皆さんありがとうございました。

284:278
09/08/08 17:09:20
更新しわすれた・・・
>>282
そうですね、Cstringも同じですね。
嫌いというか今はただお金をかけたくないんだけなんですけどね・・・



285:デフォルトの名無しさん
09/08/08 17:18:30
ナロー文字とワイド文字の混在は厄介だね。

char、wchar_t のかわりに TCHAR マクロを
"文字列", L"文字列"のかわりに _T("文字列") マクロを使い、
さらに
プロジェクト→プロパティ→構成プロパティ→全般→文字セットで
「設定なし」を選んでプロジェクト全体をshift-JIS標準に。
そうすればlocaleとかwstringとかwcoutとかostream_iterator< wchar_t >とか
いちいち考えなくてすむ。

286:デフォルトの名無しさん
09/08/08 19:16:17
いやいや、stringのほうを両対応に変えようよ。
typedef std::basic_string<TCHAR> tstring;

tstring filePath = TEXT("test.jpg");
if ( PathFileExists( filePath.c_str() ) ) {
 cout << "指定されたパスにファイルが存在" << endl;
} else {
 cout << "ファイルはありません" << endl;
}

287:デフォルトの名無しさん
09/08/08 20:20:47
でもその tstring は cout に渡せるときには wcout には渡せず、
wcout に渡せるときは cout に渡せないというような厄介なことになるよ。
Win APIやMFC、ATL側はひとつの名前で char と wchar_t に破綻なく処理を分岐してくれるけど
C++ 標準で同じことやろうとすると膨大なマクロなりtypedefなりを組むことになる。
その上、結局プログラマに「それはcharなのかwchar_tなのか」ということを意識させることに。

…と、思う。素直にMicrosoftの標準に従っといたほういい。
Windowsの開発環境は特殊だから。

288:デフォルトの名無しさん
09/08/08 20:44:49
toutを作ればいいじゃない

289:デフォルトの名無しさん
09/08/08 20:56:39
Microsoft標準に従うというのはプロジェクト全体をshift-JIS標準にすること?

290:デフォルトの名無しさん
09/08/08 21:07:05
汎用テキストマッピング(_T()とかTCHARとか使うやつ)なんて破綻してるから使わないほうがいいよ。
実際の現場で、文字列の編集のある処理で、ワイド文字とマルチバイト文字の両方で
動くように書いてるやつなんて、すごい少数だろ。
さらに、両方でテストしてるところなんて皆無だろうし。
(テスト以前に両方でコンパイルを通してるところもなさそう)

汎用テキストマッピングを使っても、実際には片方でしか動かないコードしかできないし、
いまさらwin9x系に対応する意味とかないし、最初からワイド文字きめうち問題ないよ。
問題ないっていうか、変にワイド、マルチ文字両たいおうしたつもりのコードのほうが
問題おこしそう。

291:デフォルトの名無しさん
09/08/08 21:16:41
つーか、相当処理がカツカツじゃなければ、一旦なんらかの内部コードに変換して統一した方がいいと思う。
まぁ、扱う入力データの種類にもよるが。

292:デフォルトの名無しさん
09/08/08 22:49:27
>変にワイド、マルチ文字両たいおうしたつもりのコードのほうが問題おこしそう。

まったくそのとおりだと個人的にも思うが
tstring のようにC++標準を両対応にするくらいなら
まだTCHARとか使っておいたほうが安全だと思う。

293:デフォルトの名無しさん
09/08/09 00:45:30
C言語で動画処理をしようと思っています

aviファイル読み込み→キャプチャ→RGBに対してフィルタ処理→表示
というようにしたいのですが、キャプチャしたときにRGBをしまう配列を指定できないでしょうか?
具体的には unsigned char を四つ持つ構造体に対して、ひとつメンバを余らせて一画素ずつ入れたいです
現在OpenCVで試しているのですが、RGBはunsigned char型の配列に自動的にしまわれてしまい、
キャプチャの値を構造体に入れなおすと時間がかかってしまいます

これができればOpenCVでなくてもかまわないので、誰かお知恵をお貸しください

294:デフォルトの名無しさん
09/08/09 01:17:04
なぜ「ひとつメンバを余らせ」たいのか、OpenCVがキャプチャしてくれた
配列じゃなぜダメなのか?C言語が良いのか?

その辺をもう少し詳しく。
でないとDirectShowって言っちゃう。


295:デフォルトの名無しさん
09/08/09 02:58:51
293です、詳しく説明します
実はCUDAというものでGPUを使った画像処理を行っているのですが、それを動画に応用したいのです
簡単にいえばCUDAでは4バイトずつデータにアクセスすると高速化する特性があります
そこでひとつ空きを作って無理やり4バイトにし、構造体単位でアクセスを行っています
これを空きなしの3バイトにしたところ10倍近く遅くなったので、1バイトのchar型だとさらに遅くなる可能性があります
C言語がいいのはCUDAがC言語を拡張したものだからです

296:デフォルトの名無しさん
09/08/09 03:28:51
>>295
OpenCVを使うのであれば
IplImageを作るときにIPL_DEPTH_8Uにするのではなく
IPL_DEPTH_32S又はIPL_DEPTH_32Fにして宣言すれば4Bになるんじゃないでしょうか?

imageDataのR,G,Bは8bit*4なのに注意してください。
参考にどうぞ
URLリンク(rest-term.com)

297:293
09/08/09 12:55:44
ありがとうございます!
ためしてみます

298:デフォルトの名無しさん
09/08/09 15:08:07
引き数にだけ文字列を使いたい時でもconst string&使ったほうがいいの?


299:デフォルトの名無しさん
09/08/09 15:12:42
>>298
何を言っているのかわからん。

300:デフォルトの名無しさん
09/08/09 15:21:28
>>298 もしかしてこういうことか?

void foo(const string& s) { cout << s << endl; }

void bar(const char* s) { cout << s << end; }

int main() {
foo("footest"); // リテラル文字列をstring&に渡す
bar("bartest"); // char*に渡す
}

こういう話だったら、const char* でもいいだろうけど
char*とstringが混在すると面倒だから俺は全部stringに統一

301:デフォルトの名無しさん
09/08/09 15:55:20
そんなかんじですね
ヘッダ解析のコストもあるしchar*でわたして必要ならソースでstringにかえればいいかなと・・・

302:デフォルトの名無しさん
09/08/09 16:01:04
C++ code - 21 lines - codepad
URLリンク(codepad.org)

struct Animalのstatic constなメンバであるweight = 10;
を、Animalを継承したHumanで別の数字に変更したい場合、
このような方法でよろしいでしょうか?



303:デフォルトの名無しさん
09/08/09 16:25:57
>>302
それでおk。

あと
struct Animal
{
static const int weight = 10;
};
が他人が作った物である場合、
struct Human : Animal
{
enum{ weight = 50 };
};
こうやって書き換えた方が良い。
互換性が高い。

304:デフォルトの名無しさん
09/08/09 20:06:43
>>303
互換性ってなんの?

305:デフォルトの名無しさん
09/08/09 20:14:18
>>303
enum って何の略か分かってる?

306:デフォルトの名無しさん
09/08/09 20:18:36
>>305
enumハックしらないの?

307:デフォルトの名無しさん
09/08/09 20:20:52
互換性って古めのコンパイラだと前者を配列の宣言に使用できないとかそういうこと?

308:デフォルトの名無しさん
09/08/09 22:27:30
いまさらenumハックを自信ありげに言われてもなあ

309:302
09/08/09 23:18:20
ありがとうございます。
enumハックで行かせていただきます。


310:デフォルトの名無しさん
09/08/09 23:40:46
よせ、あくまでハックはハックだ
正攻法には劣る

311:デフォルトの名無しさん
09/08/09 23:57:49
>>308
いくつかの環境で開発をしたことがあるなら当たり前の知識である
enumハックのコードを見て、enumが何の略かなんて問うのもどうかと思うよねw

312:デフォルトの名無しさん
09/08/10 00:04:28
>>305
enumハックをしらないやつがなんでまた偉そうにw

313:デフォルトの名無しさん
09/08/10 00:06:07
>>310
劣るかなぁ?どう劣る?

読みづらいとか?

314:デフォルトの名無しさん
09/08/10 01:22:44
たびたびすみません、293です
296さんのサイトを見てみたのですが、どうやらこちらの説明不足だったようです
一つのチャンネルを4バイトで表したいのではなく、ピクセルそのものを4バイトで表したい
つまり、cvCreateImage(cvSize(x, y), IPL_DEPTH_8U, 4);
このようにしたかったのです
それで実際に試してみたのですが、うまくいきません
キャプチャを cvQueryFrame で行っているのですが、おそらくここでメモリを取り直されているのだと思います
実装部分を探して改良しようとも思ったのですが見つかりませんorz
半分スレ違いみたいな内容ですが、解決方法があったらご教授ください

315:デフォルトの名無しさん
09/08/10 01:55:20
>>314
Grabが3yte/pixelで行われる限り、一度は3byte/pixelから 4byte/pixelへの
拡張をしてやらないといけないと思うよ。
OpenCVでやるか(cvCopy?)、自前の関数でやるかは別として。

316:デフォルトの名無しさん
09/08/10 02:06:10
>>314
「cuda rgba」でググったらぴったりのものが出てきた。
URLリンク(wiki.livedoor.jp)

317:デフォルトの名無しさん
09/08/10 04:48:35
生成と同時にコンストラクタに値を与えたいオブジェクトがあるので、

CTest* ctest[10];
for(int i=0;i<10;i++){
ctest[i] = new Ctest();
}

と統一してるんですが、最初に要素数を決めなきゃいけないのと、
newとdeleteを使う分、かったるいので

vector<CTest*> ctest;
for(int i=0;i<10;i++){
ctest.push_back( ? );
}

って風にしようとしてるんですが、ここで「?」になにも入れないと
「0個の引数は指定できない」と怒られます

この場合「?」の部分はCTestコンストラクタに渡す引数になると思ってたんですが、
引数がない場合はどうすればいいでしょう?
やはりnewとdeleteを使わなきゃいかんのでしょうか

318:デフォルトの名無しさん
09/08/10 05:46:18
vector<CTest*> ctest(10);
でいけたような。

319:デフォルトの名無しさん
09/08/10 06:17:46
>>317
CTest*のvectorでしょ
push_backするのはCTest*じゃないの?
ctest.push_back(new CTest());
とか
ctest.push_back(NULL);
とか・・・


320:デフォルトの名無しさん
09/08/10 07:05:40
ctest.push_back(new CTest());
とか
ctest.push_back(NULL);
とか
ctest.resize(i+1);
ctest[i] = new ctest();
とか試してみたけど、

error LNK2001: 外部シンボル "__CrtDbgReportW" は未解決です
error LNK2019: 未解決の外部シンボル __CrtDbgReportW が
関数 "public: class Ctest * & __thiscall std::vector<class Ctest *,class std::allocator<class Ctest *> >::operator[](unsigned int)"
(??A?$vector@PAVCtest@@V?$allocator@PAVCtest@@@std@@@std@@QAEAAPAVCtest@@I@Z) で参照されました。 Main.obj

なにこれ(゜д゜)

321:デフォルトの名無しさん
09/08/10 07:59:13
失礼、ランタイムライブラリをマルチスレッド(/MT)から
マルチスレッドデバッグ(/MTd)に変えたら解決しました。
理屈はわかりませんが・・・

CTest.push_back( new CTest(引数) );
でいけそうですが、この場合、指定のオブジェクトを破棄するとき
deleteで指定のアドレスを破棄してから、vectorのポインタを破棄する、
というクドいコードになりますね・・・

かといって、vector<CTest>と、ポインタで持たずにnewを使わなければ
引数付きコンストラクタでの初期化がややこしくなりますし・・・
しかたないですかね

322:デフォルトの名無しさん
09/08/10 11:36:10
>>321
それは仕方がない。というかnewした以上、deleteするのは当たり前。
vectorにオブジェクトのポインタをプールするなんてまぁよく聞く話だし。
デストラクタに全要素deleteするコード書いとけ。

323:デフォルトの名無しさん
09/08/10 11:38:19
>>321
>引数付きコンストラクタでの初期化がややこしくなりますし・・・
そもそも、ここが判らん。

324:デフォルトの名無しさん
09/08/10 12:46:32
>>321
boost::ptr_vectorで解決

325:293
09/08/10 14:50:51
>>315
確かにキャプチャ部分がこうなっている以上コピーするしかないですよね
Grabを自前で実装できればよいのですが、キャプチャ自体がどのように行われているかさえ
まだ理解していないので当分コピーで済ませていこうと思います
ありがとうございました

>>316
このようなページを知らなかったとはまだまだ勉強不足のようですorz
もうちょっと自分で調べてみようと思います
ありがとうございました


326:デフォルトの名無しさん
09/08/10 15:59:01
>>321
それなら
std::vector<boost::shared_ptr<CTest> > ctest;
ctest.push_back(boost::shared_ptr<CTest>(new CTest()));

コンパイルして書いてるわけじゃないから何か変だったら適当になおして

327:デフォルトの名無しさん
09/08/10 18:40:28
const char * const p= "有効な文字列p";
const char * const q= "有効な文字列q";

このようなpとqに格納されている文字列が等しいかどうかを調べる場合、

strcmp
を使う方法と
std::string(p)==q

std::string(p)==std::string(q)
とする方法と、どちらが望ましいでしょうか?

328:デフォルトの名無しさん
09/08/10 19:14:12
そら、態々メモリ割り当てずに strcmp が速いでしょ。

329:327
09/08/10 19:17:27
>>328
ありがとうございます。

330:デフォルトの名無しさん
09/08/10 20:26:59
男キャラを担当する女声優はわんさかいるけど、
女キャラを担当する男声優なんて聞いたことない

331:デフォルトの名無しさん
09/08/10 20:27:39
超誤爆

332:デフォルトの名無しさん
09/08/10 20:36:20
どのスレだよw


333:デフォルトの名無しさん
09/08/10 21:40:42
class Aからclass Bへの暗黙の型変換が許されている状況で、
A hoge;
として

B piyo = hoge;
B piyo(hoge);
B piyo = (A)hoge;
B piyo = static_cast<A>(hoge);

これら4つは全く等価だと考えてよろしいですか?


334:デフォルトの名無しさん
09/08/10 23:27:55
少なくとも一番目と二番目は全く違うような。

335:デフォルトの名無しさん
09/08/10 23:36:36
>>334
違いますか?
どのあたりが違いますか?


336:デフォルトの名無しさん
09/08/11 02:15:35
同じだよ。どれもコピーコンストラクタが呼ばれる。
ときおり初心者が1番目の式を代入と勘違いするけど
普通の教科書にはそれは代入じゃねぇンだよって説明が書いてあるので
それを知らないのは教科書をよく読んでいない証拠。

もし書いてないなら、その教科書は資源ごみにでも出したほうがいい。

337:デフォルトの名無しさん
09/08/11 05:33:53
すんごい初歩的な質問だと思うんですけど、
deleteで解放をし忘れしているプログラムを何度も動かした場合、
不要なデータはPC上に残り続けるんでしょうか?

溜まったそれらのデータをなんとか解放、削除したい場合は
どうすればいいんでしょ?

338:デフォルトの名無しさん
09/08/11 06:04:39
一度プログラムを終了させれば

まともなOSなら
deleteしていなくても問題ない。

少なくとも、普通の方法で確保したメモリを
プロセスが終了しても解放しないものはまず無い。
メモリ以外のリソースはそうでもない場合もある。

339:337
09/08/11 06:10:01
多謝

340:333
09/08/11 10:32:22
>>336
やっぱり全く等価ですよね。

どうもありがとうございます。


341:デフォルトの名無しさん
09/08/11 10:37:12
explicitを付けて(1)を使えなくしてやるー

342:デフォルトの名無しさん
09/08/11 10:53:55
>>334
こいつ恥ずかしいなwww

>>338
メモリ管理問題
URLリンク(kmaebashi.com)
熟読せよ

343:デフォルトの名無しさん
09/08/11 11:17:26
>>342
言いたいことがあるなら自分の言葉でどうぞ。

344:デフォルトの名無しさん
09/08/11 11:24:16
共用体について質問です

union AB{
A a;
B b;
};

void init(union AB ab){
union AB ans;
ans = ab;
}

void main(){
init( (A)10 ); // 10をA型にキャストして引数に与える
init( (B)10 ); // 10をB型にキャストして引数に与える
}

・・・このソースでなにがしたいかと言うと、
引数に与えた型を判別して、A型ならans.aに、B型ならans.bに
自動的に代入してほしいのです。

考え方が間違えてるのか「AからABに変換できません」とエラーが出ます
この場合、どうしたらいいのでしょうか?

345:デフォルトの名無しさん
09/08/11 11:27:14
共用体にA用とB用のコンストラクタを設ける

346:デフォルトの名無しさん
09/08/11 11:28:05
>>344
>引数に与えた型を判別して
C++ でも使いましょう。

347:デフォルトの名無しさん
09/08/11 11:29:05
>>344
まて、その前にクラスはまともに使えるのか?
例えば
>>333
この様なclass Aとclass Bを記述することは出来るだけの技量はある?

348:デフォルトの名無しさん
09/08/11 11:36:51
クラスは普通に使ってます。
というかこの質問が、同じクラスのメンバ変数が2タイプに分かれる場合があって、

2つ変数を設けて片方を空っぽにするのが気持ち悪いので、共用体を使おうとしてるのです
(初期化関数を統一したいのもあります)

ただ「共用体にコンストラクタを設ける」といわれるとなんのことやら・・・
共用体がクラスのように扱える、ということでしょうか

349:342
09/08/11 11:39:39
>>343
こいつ(は無知なのに「全く違う」という強い否定を使い
それが全くの初歩の話題であったことを知り)
恥ずかしい(とさぞかし思っているだろう)なwww

で満足?

350:343
09/08/11 11:41:05
>>349
あ、いや、後段の方。

351:デフォルトの名無しさん
09/08/11 11:41:40
>>348
クラスと同じように共用体もコンストラクタやデストラクタを持てる

union AB{
....
AB(A a){ this->a = a; }
AB(B b){ this->b = b; }
};

352:347
09/08/11 11:41:42
>>348
>クラスは普通に使ってます。
じゃあとりあえず、
自分のコードのunionになっている場所をclassに単純に書き換えて
実現してみてよ。

それがすぐ答えにつながる。


353:デフォルトの名無しさん
09/08/11 12:06:41
>>342
理屈上はそうかも知れんが、
free()しないとメモリを管理できてないような気がする。
特にdeleteしないとデストラクタがどう動くかよく分からん。

354:デフォルトの名無しさん
09/08/11 12:11:00
つーか、共用体にする意味があるのか?
気持ち悪いと言う理由だけでは意味がなさ過ぎる。
どちらかだけ有効だと言うのであれば、boost::optionalでも使って有効性をチェックすればいいだけの気もするが。

355:342
09/08/11 12:12:23
いや俺はfree()しないことに反対な人だから。
ただこういう意見な人も居るよっていいたかっただけだ。



356:デフォルトの名無しさん
09/08/11 12:12:23
>>353
deleteしなければデストラクタが動くわけないじゃん。
OSは、クラスの管理までしてくれるわけじゃないよ。

357:デフォルトの名無しさん
09/08/11 12:13:11
>>354
boost::optional
の使いどころおかしくねぇか?
valiantじゃなくて?


358:デフォルトの名無しさん
09/08/11 12:23:55
>>357
元質の趣旨が判らんから勝手に推測した。valiantを使うべきならそうしてくれ。

359:デフォルトの名無しさん
09/08/11 20:28:12
class hoge {
public: static fuga();
};

これって普通の関数と比べてなんかいいことあんの?


360:デフォルトの名無しさん
09/08/11 20:35:16
>>359
静的メンバ関数でググれ

361:デフォルトの名無しさん
09/08/11 20:38:17
>>359
1・それがいいか悪いかは別として、似たようなstatic関数が100個くらいあったとき
  まとめて他のクラスのfriendにできる

2・hogeのstaticじゃないprivateなメンバに触れる

362:デフォルトの名無しさん
09/08/11 20:55:02
あぁプライベートメンバに触れるのかそれは便利そうだ
二項演算しとかに使えそう

363:デフォルトの名無しさん
09/08/11 20:59:09
とおもったらオペレーターは静的にできなかった・・・
ぬかよろこびだったでござる


364:デフォルトの名無しさん
09/08/11 21:33:44
てか、コンストラクタをprivateにしてstaticなファクトリ作るくらいじゃない?

365:デフォルトの名無しさん
09/08/11 21:44:24
>>359
コールバック関数に使える。

366:デフォルトの名無しさん
09/08/11 22:04:07
URLリンク(codepad.org)

std::numeric_limits< double >::quiet_NaN()==std::numeric_limits< double >::quiet_NaN()
の部分はfalseとなるようですが、
これは言語仕様そうなるものですか?

それとも実装依存でしょうか?

367:366
09/08/11 22:05:34
なお、
g++, VC++2008に食わせた後実行したらURLリンク(codepad.org)と同じ結果でしたが、
bccに食わせた後実行したらその実行ファイルは不正終了しました。
> これは言語仕様そうなるものですか?

368:デフォルトの名無しさん
09/08/11 22:22:22
URLリンク(codepad.org)

VC++だと実行結果が100になる
この記述でコピコンが呼ばれるかどうかは仕様で決まってないのかな

369:367
09/08/11 22:26:58
>>368
私の環境のg++ 4.4.0では100になりましたよ。
bcc 5.5.1でも100になりましたよ。
codepadが100にならないのは不思議ですね。


370:デフォルトの名無しさん
09/08/11 22:33:58
>>342の知ったかバカ

>>337の質問が
>deleteで解放をし忘れしているプログラムを何度も動かした場合、
>不要なデータはPC上に残り続けるんでしょうか?
という内容で、

>>338の回答が
>一度プログラムを終了させれば
という、限定された条件なんだけど、わかってるのかね?

371:デフォルトの名無しさん
09/08/11 22:36:28
>>366
TがNaNである値nを持つとき、
型Tの値nがNaNである ⇔ すべてのTの値xに対してx ≠ nである
ゆえにNaN ≠ NaNである

quet_NaNは型がNaN値を持つとき、
LIA-1(ISO/IEC 10967-1)の要求を満たすとあるので(ISO/IEC 14882:1998 18.2.1.2.45)
恐らく規格準拠だと思うよ
詳しくはC++98とLIA-1をあたってくれ
多分NaNに関してはLIA-1に1段落目で書いたことのようなものが載ってる筈

372:366
09/08/11 22:39:12
>>371
ありがとうございます。
助かりました。

373:デフォルトの名無しさん
09/08/12 00:12:29
URLリンク(codepad.org)
URLリンク(www1.axfc.net)

二回目のバイナリ書き込みがなぜかテキスト書き込みになってしまいます
なぜでしょう?

374:デフォルトの名無しさん
09/08/12 01:52:18
>>373
おおざっぱに言うと、式の中にcharが出てくるとint型に拡張される。「汎整数昇格」で検索すると解説が出てくるかも。
だから2回めの書き込みは、cout << (int)(ch * 2) と同じこと。

375:デフォルトの名無しさん
09/08/12 02:03:11
>>370
どうした?
>>337 >>338 >>342の流れはfreeしなくていいよ派の滞りない流れではないか?

376:デフォルトの名無しさん
09/08/12 03:10:30
もしかして、単に優越感に浸りたいだけの基地外さん?
もしかして、単に優越感に浸りたいためだけに、自分に都合の良い解釈しかしない人?

377:デフォルトの名無しさん
09/08/12 03:19:45
バカは相手にすんな

378:デフォルトの名無しさん
09/08/12 03:41:01
>>375
342はfreeしろ派じゃねーの?

379:デフォルトの名無しさん
09/08/12 04:04:11
freeしろ派があのリンク先を持ってくるかなあ?
リンク先を見た上で、しかしこういう考えのもと、やはりfreeすべきだという内容がレスにあるわけでもないし

380:デフォルトの名無しさん
09/08/12 04:41:00
いい加減freeの話題で荒れるのは勘弁してくれないかな。

381:デフォルトの名無しさん
09/08/12 05:16:11
今までの話を纏めると
結論:必ずfreeすべし

382:デフォルトの名無しさん
09/08/12 05:47:53
この話は明示的なメモリの解放を行うことができる言語がある限り繰り返されると思うよ
片手間で作ったちょっとしたツールでせっせと例外捕捉して必死でメモリ解放するとかやってられんしょ

383:デフォルトの名無しさん
09/08/12 09:44:43
>>374
その解釈はおかしい。
何故ならば、ch * 2が既にintだと言っているのだから(int)(ch * 2)は(int)(int)....(ch * 2)と言う位意味がない。
敢えてその顰に倣って書くのなら、(int)ch * 2と言った処だろう。

384:デフォルトの名無しさん
09/08/12 12:38:32
ていうかバイナリモードで開いてるのになんで文字としての数字が保存されてんの?
って聞きたかったんすけど・・・

385:デフォルトの名無しさん
09/08/12 12:40:27
>>384
std::cout << '0'としても、std::cout << 0としても出力が同じなのと同じ理由。
バイナリモードかどうかは全く関係ない。ついでに言えば、大抵のOSではテキストモードとバイナリモードの違いさえない。

386:デフォルトの名無しさん
09/08/12 12:45:57
テキストモードでオープンすると '\032' から先を読まない処理系が昔あったなあ。

387:デフォルトの名無しさん
09/08/12 16:59:09
class Hoge
{
operator double(){return 1.0;}
};
というクラスがあるとき

Hoge e;
printf("%f\n", e );

と言うコードはコンパイルが通りますが、表示されるのは1.0ではありませんでした
eは何型にキャストされてからprintfに渡されているんですか?

388:デフォルトの名無しさん
09/08/12 17:07:20
>>387
キャストされないで、Hogeのままスタックに詰まれる。
それみたいにメンバ変数のないクラスのでやるとどうなるかしらないけど。

389:デフォルトの名無しさん
09/08/12 17:10:58
正確には、もうひとつのインスタンスが
(コピーコンストラクタを使って)スタック上に作られる、ってことだね。

390:デフォルトの名無しさん
09/08/12 17:27:39
>>388-389
ということは、やりたいようなことはたぶん出来ないんですね
面倒でも(double)eとするしかないと

ありがとうございました

391:デフォルトの名無しさん
09/08/12 18:02:12
>>386
\032って何ですか?


392:デフォルトの名無しさん
09/08/12 18:14:04
>>391
Control-Z。MS-DOSやCP/MのEOF文字

CP/MというOSではファイルサイズを128の倍数でしか管理できなかったので、
データの最後にEOFをつける必要があった

393:デフォルトの名無しさん
09/08/12 18:29:35
>>384
じゃあ何が保存されればいいの?

394:デフォルトの名無しさん
09/08/12 19:00:57
>>392
ありがとうございます。

395:デフォルトの名無しさん
09/08/12 21:04:36
安西先生、引き数と返り値の型も隠蔽したいです


396:デフォルトの名無しさん
09/08/12 22:00:45
c++で2重起動を防止する方法を教えてください。
環境linux+gccです

397:デフォルトの名無しさん
09/08/12 22:18:02
セマフォを使う

398:デフォルトの名無しさん
09/08/13 01:43:06
mutex


399:デフォルトの名無しさん
09/08/13 22:13:12
class hoge {
public:
class foo {...};
foo fuga();
};

こんな場合って普通fooの定義は外にだすもん?


400:デフォルトの名無しさん
09/08/13 22:21:56
>>399
クラスのネストくらいふつーだと思う。

401:デフォルトの名無しさん
09/08/13 22:28:08
クラス内クラス定義はpimplイディオムなんかの時に普通につかうよ

402:デフォルトの名無しさん
09/08/13 22:30:13
>>401

403:デフォルトの名無しさん
09/08/13 22:45:43
>>399
そういうことをやり始めたあたりから楽しくなってくるんだぜ(笑)


404:デフォルトの名無しさん
09/08/13 23:10:16
前スレで登場したテンプレートを
適当に貼り付けてみる。
template<typename T, std::size_t N>
inline std::size_t numberof(T (&)[N]) {return N;}
まだまだ納得できない俺がいる。


405:デフォルトの名無しさん
09/08/13 23:15:13
URLリンク(ray.sakura.ne.jp)

これのバブルソートのテンプレート化も面白いな

406:デフォルトの名無しさん
09/08/13 23:35:31
>汎用性の為に速度が犠牲になつてしまふことは、なんとしても避けなければならない。
執念が感じられるな(笑)



407:デフォルトの名無しさん
09/08/13 23:37:24
メンテ性悪すぎワラタ

408:デフォルトの名無しさん
09/08/13 23:47:03
何かあったんだろうなw

409:デフォルトの名無しさん
09/08/14 00:10:52
C/C++で書くのは実行速度気にするからで間違った方向じゃないと思うがね
アセンブラやFORTRANでブイブイ云わせてるオッチャンは失笑するかもしれんけど

410:デフォルトの名無しさん
09/08/14 04:13:44
同じ関数にわたす引数が場面によって違う場合、どうするのが一般的ですか?

パターン1:
if( case == 1 )
test( a, c, d, e, f);
else
test( b, c, d, e, f );

パターン2:
if( case == 1 )
temp = a;
else
temp = b;
test( temp, c, d, e, f );


このどちらかでいいじゃん、と思われたかもしれませんが
パターン1の場合、引数リストが10行近くに渡る場合、
引数1つの違いのために10行余計に食うハメになります・・・

パターン2の場合は、1つの引数のためにわざわざ
tempを用いてるのが醜いです

引数リストの中でif文を使えるようなら、
それが一番いいイメージなのですが・・・

411:デフォルトの名無しさん
09/08/14 04:40:19
3項演算子でググれ

412:412
09/08/14 06:01:09
できました。ありがとうございます

413:デフォルトの名無しさん
09/08/14 09:17:37
>>412
自己完結乙。

414:デフォルトの名無しさん
09/08/14 17:24:44
privateなstaticメンバ変数と
無名名前空間内の変数ってどうちがうんでさ?


415:デフォルトの名無しさん
09/08/14 17:36:16
>>414
どういうソースのこと?

416:デフォルトの名無しさん
09/08/14 17:42:44
Cの勉強を始めたばかりなんだけど、メモ帳に、参考書にある通りのソースプログラムを書いてリターンキーを押しても実行結果が表示されません。
原因を教えてください。

417:デフォルトの名無しさん
09/08/14 17:45:13
>>416
釣り?マジ?

418:デフォルトの名無しさん
09/08/14 17:48:21
>>417
マジです。

419:デフォルトの名無しさん
09/08/14 17:53:50
俺は、ちゃんと実行されるけど、
不正コピーのWindows使ってるから、動かないのじゃね?

420:デフォルトの名無しさん
09/08/14 18:04:20
普通のXPを使ってます。
リターンキーを押しても改行されるだけなんですが(T_T)

421:デフォルトの名無しさん
09/08/14 18:08:58
その糞参考書を晒せ

422:デフォルトの名無しさん
09/08/14 18:14:42
これはたしかに参考書が気になる

423:デフォルトの名無しさん
09/08/14 18:20:25
以前もさらっと「コンパイルが必要です」ってある参考書ではまってた奴がいたような。

424:デフォルトの名無しさん
09/08/14 18:42:14
>>415
class pool {
private: static map m;
(ry
};

みたいなコード
これだと無名グローバル変数でもいいように思えるんだけど・・・


425:417
09/08/14 18:44:07
codepad
URLリンク(codepad.org)

ここで実行しろ。

426:415
09/08/14 18:44:58
>>424
poolの外からmにアクセス出来なくね?

427:デフォルトの名無しさん
09/08/14 18:57:08
『明解C言語 入門編』
です。
これって名著と聞いてますが。

428:デフォルトの名無しさん
09/08/14 19:06:43
良く売れてますよ。

でも、C言語の入門書でK&R第2版を超えるものはひとつもありません。
特にUNIXシステムインタフェースの章は重要で、
システム依存のコード(システムコールを用いるコード)とどのように折り合いをつけるか、
平易に説明してくれる入門書はこれくらいのものでしょう。
結局、C言語はアセンブラに近しいところで利用されるので
このような低水準の話題は避けて通れないのです。
でも日本人が書いた入門書はそのへん全部無視しやがってアホか。

429:デフォルトの名無しさん
09/08/14 19:17:12
>>428
ありがとうです。
K&Rの正式な書名をよかったら。書店で探してみます。

430:デフォルトの名無しさん
09/08/14 19:19:56
プログラミング言語C 第2版 ANSI規格準拠
B.W. カーニハン (著), D.M. リッチー (著), 石田 晴久 (翻訳)

431:デフォルトの名無しさん
09/08/14 19:34:26
>>430
ありがとうです。
明日さっそく書店へ行きます。

432:デフォルトの名無しさん
09/08/14 19:54:38
>>416
入力した c ソースをコンパイルして、実行ファイルを指定して実行していますか?
意味がわからなければ、さわりでコンパイルの方法が書いてある書籍をさがすか、人にきいてみてください。

433:デフォルトの名無しさん
09/08/14 19:55:53
>>431
最初の最初に読む書籍ではないことに注意してください。ある程度の経験が必要です。

434:デフォルトの名無しさん
09/08/14 20:13:44
最初の最初に読むのにいい本があったら教えて、誰かエロい人!

435:デフォルトの名無しさん
09/08/14 20:18:29
書籍スレへどうぞ。

436:デフォルトの名無しさん
09/08/14 20:18:39
もともとC言語を他の言語の経験なしに最初に学ぼうという時点で無謀だ。w
せいぜいテキストファイルを読み込んで集計する程度のプログラムしか書かないなら
C言語を使う理由など皆無に等しく、そんなものはBASICで十分だろう。

C言語は(BASICに比べれば)難解で保守しにくく、
それでもなおC言語を使うのはC言語には低水準固有のパワーが備わっているからだ。

そういうプログラムを書きたいと望むものが
K&Rの内容も読めないなら、
実際にプログラムをしようとしたとき、
C言語よりも遥かに難解なハードやOSを前にして
ただただ途方にくれるだけだろう。

437:デフォルトの名無しさん
09/08/14 20:19:09
入門レベルならWebでいいんじゃねぇの

438:デフォルトの名無しさん
09/08/14 20:28:47
BASICってVisualBasic?
Cより難解で複雑で混沌としてんじゃねーか

439:デフォルトの名無しさん
09/08/14 20:30:36
最初にC習って特に問題なかった俺は天才ということだな

440:デフォルトの名無しさん
09/08/14 20:44:06
>>439
俺もだ、天才同志よ。

441:デフォルトの名無しさん
09/08/14 20:45:19
C言語だとファイルの削除はremove(fileName)でできましたが、
C++だとどうやってファイルを削除しますか?

442:デフォルトの名無しさん
09/08/14 20:50:55
std::remove(fileName)

443:デフォルトの名無しさん
09/08/14 20:52:40
>>442
ありがとうございます。
チュ♥

444:デフォルトの名無しさん
09/08/14 21:13:13
STDMETHODってなんでしょうか?

445:デフォルトの名無しさん
09/08/14 21:23:40
COMで使われるマクロです

446:デフォルトの名無しさん
09/08/14 21:27:03
そんな用語はないよ?



447:デフォルトの名無しさん
09/08/14 21:31:45
俺も秀才なんで、Cから始めます。

448:デフォルトの名無しさん
09/08/14 22:12:18
俺おくてだから、勇気を出してCから始めます。

449:デフォルトの名無しさん
09/08/14 22:20:34
vecterとかmapのデフォルトコンストラクタってメモリ確保しないよね?

450:デフォルトの名無しさん
09/08/14 22:58:41
実装依存だから確実ではないけど、普通は確保しないよ。

451:デフォルトの名無しさん
09/08/15 00:08:57
stlportって何ですか?
ググってみると良いことずくめに書いてあるんですが。


452:デフォルトの名無しさん
09/08/15 00:33:47
演算子のオーバーロードを勉強中です。
コンパイルエラー出ます。本のサンプルプログラムなんですが。

a.c:17: error: ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion for the second:
string.h:21: note: candidate 1: char& String::operator[](size_t)
a.c:17: note: candidate 2: operator[](char*, int) <built-in>

です。原因は何でしょうか?エラーメッセージがよくわかりません。

もし、ソースコードが必要なら乗せます。

453:デフォルトの名無しさん
09/08/15 00:34:37
>>438が釣りなのかどうか判断つかん

454:デフォルトの名無しさん
09/08/15 08:02:56
>>452
必要に決まってるじゃん。
codepad
URLリンク(codepad.org)

ここで。

455:デフォルトの名無しさん
09/08/15 14:37:26
C++のサンプルコードが載ってるデザインパターンの本で良書あります?

456:デフォルトの名無しさん
09/08/15 15:43:32
>>451
VC6のころは必須だった。 今は別になくてもいい。

457:デフォルトの名無しさん
09/08/15 17:39:41
ゲーム内に存在するユニット(プレイヤー、モンスター、障害物など)にユニークIDを付けたいんだけど
アドレスをintにして返すだけの基底クラスを継承させれば問題ないかな?


458:デフォルトの名無しさん
09/08/15 17:48:24
アドレスをハッシュにするのはよくある手段だな
ポインタ型のサイズが変わったときにちょっとハマるかもしれんから
ハッシュ同士を==,!=で比較する以外の使い方をするときには注意が必要になるだろう
できれば専用の型でラップして使うべきだろうな

459:デフォルトの名無しさん
09/08/15 17:56:05
intptr_tなりUINT_PTRなりをtypedefしてxxx_IDとして用いれば大丈夫だろうね。

460:デフォルトの名無しさん
09/08/15 18:26:48
>>455
独習C++デザインパターンかなぁ。この手の本は殆どがJavaで書かれてるからC++の本は少ないな。

461:デフォルトの名無しさん
09/08/15 19:14:22
「Java謎+落とし穴」という書籍の中でC++はリフレクションが弱い、との記述があったのですがこれは事実でしょうか?
かなり古い本なので最近のC++のリフレクション周りについて知りたいです。
できればJava、C++、C#辺りのリフレクションの違いについて教えて頂けると有り難いです。
よろしくお願いします。

462:デフォルトの名無しさん
09/08/15 20:03:39
>>461
弱いどころか無いに等しいよ。
リフレクションが必要ならインタプリタ言語にまかせよう。

463:デフォルトの名無しさん
09/08/15 20:06:02
C/C++で、
 aa(), bb(), cc()
とした場合、この式の評価順序は
 aa()が最初で次がbb()で次がcc()
ということは仕様で保証されていますか?


関数の引数の評価順序は保証されていないということだそうで。

464:デフォルトの名無しさん
09/08/15 20:15:32
>>463
この場合はコンマ演算子だから、左から右へ評価されることは保障されており、かつ値は最後に評価したものですね。

465:463
09/08/15 20:53:28
>>464
ありがとうございます。
ではそれに依存してコーディングしていきたいと思います。

466:461
09/08/15 21:07:09
>>462
ありがとうございます。
クラスやメソッドを実行時に決定したい場合などは諦めるしかないのでしょうか?
あるいはそういう需要があること自体、設計がおかしいという判断になるのかな

467:デフォルトの名無しさん
09/08/15 21:11:00
>>466
> クラスやメソッドを実行時に決定したい場合などは諦めるしかないのでしょうか?
C++には継承と仮想関数がありますからそれをうまく使ってください。

> あるいはそういう需要があること自体、設計がおかしいという判断になるのかな
if(flag)
{hoge.foo();}
else
{hoge.bar();}
こんなことは良くやりますけど。

あとはC++には関数ポインタもありますねぇ。

468:デフォルトの名無しさん
09/08/15 21:21:59
場合分けはさすがに無いだろw
まぁJavaでもClassクラスなんて使うのは最終手段だし設計を見直すのが吉だろうな

469:デフォルトの名無しさん
09/08/15 21:36:03
>>466
ポリモーフィズムがあるんだから利用しない手はないだろ。
実行時に型を決定したいなんて結構あるんじゃないか?
それがあってるのかどうかは知らんが。

470:デフォルトの名無しさん
09/08/15 22:20:55
C++プログラミングの筋と定石 (新紀元社情報工学シリーズ)

この本を読むのじゃ。
お前様のほしい情報が載っておるぞ。
あたら高度だけど。

471:デフォルトの名無しさん
09/08/15 22:33:03
滅茶苦茶古い本だぞそれ

472:デフォルトの名無しさん
09/08/15 22:57:12
古いけどナイスガイ

473:デフォルトの名無しさん
09/08/15 22:58:16
宣伝は他でやれ

474:デフォルトの名無しさん
09/08/15 23:01:16
宣伝だと思うなら無視すればいいじゃない。
宣伝しなくても名著だからみんな知ってるだろうし。
MoreEffective C++でも推薦されてたくらいの本だから
もちろん、君も知ってるよね?

475:デフォルトの名無しさん
09/08/15 23:23:04
あぁ原書は有名だけど翻訳が糞過ぎて読む気無くなったなそれ

476:デフォルトの名無しさん
09/08/15 23:25:28
どう見ても宣伝だわw

477:デフォルトの名無しさん
09/08/16 19:02:57
Baseクラスと、Baseをpublic継承したDerivedクラスがあります。

Derived hoge;
void foo(const Base&);//1
void foo(const Derived&);//2

となっている時、
foo()//1にhogeを渡したいのですが、どうすればよいでしょうか?

foo(static_cast<Base>(hoge));
だと無駄なテンポラリオブジェクトができてしまいますか?



478:デフォルトの名無しさん
09/08/16 19:41:38
// 値型のキャストだとコピーになるが、参照型でキャストすればコピーは発生しない
foo(static_cast<Base&>(hoge));

479:477
09/08/16 20:00:14
>>478
ありがとうございます。

ということは
Derived hoge;

const Derived& hoge = ...
であった場合は
foo(static_cast< const Base& >(hoge));
であっていますか?

480:デフォルトの名無しさん
09/08/16 20:01:39
C++でもassertって使うの?

481:デフォルトの名無しさん
09/08/16 20:15:06
#include <iostream>
using namespace std;
class Base{};
class Derived : public Base {};

void foo(const Base&){cout << "Base" << endl;}
template<class T>
void foo(const T&){cout << "T" << endl;}

int main()
{
Derived hoge;
foo(hoge);
return 0;
}

これでTが表示されるのは、
基底クラスへキャストするよりもテンプレートの方が優先される
ためだと思いますが、
この動作はC++の仕様でしょうか?

482:デフォルトの名無しさん
09/08/16 20:37:48
>>480
使うよ。用途はCと一緒でしょ。

483:デフォルトの名無しさん
09/08/16 21:28:27
C++です。

ヘッダファイルに書かれた関数テンプレートを
どんなときにinline宣言すべきか分かりません。
明らかに短い時はinline宣言しますが、
どのあたりの長さからしない方がよくなるのでしょうか?

484:デフォルトの名無しさん
09/08/16 21:35:07
ほっとけばinline

485:483
09/08/16 21:38:31
>>484
ええと、ヘッダファイルに書かれた関数テンプレートでも
明示的にinlineと書かない限り
(コンパイラによる最適化以外では)
inlineにはならないと思っているのですが。


486:デフォルトの名無しさん
09/08/16 21:50:02
異なるcppファイルに同じヘッダを読み込んで、各々のオブジェクトファイルで実体化されたら
リンク時にカチ合うじゃないか。

487:デフォルトの名無しさん
09/08/16 21:51:34
>>485
Efficient C++(Effectiveじゃないよ)の9章と10章に載ってなる。
具体的には130ページに、行数(命令数か)と呼び出し頻度で決めなさいと書いてある。
あと、見た目のコード自体は短くても実際はそうでもないことがあるから注意な。

まあ、コンパイラの判断でインライン展開されるからinlineと書いたところで
必ずインラインになるとは限らんしな。

488:デフォルトの名無しさん
09/08/16 21:52:23
すみませんが構造体配列の初期化で全てを同じ値にしたいのですが上手くいきません
どこが間違っているのでしょうか?

struct Piece_t {
int Kind;
int State;
};

struct Piece_t Piece[(MAX_MASS + 2) * (MAX_MASS + 2)]={3,0};


489:デフォルトの名無しさん
09/08/16 22:01:08
初期値は必要な数だけ与えてやらんとだめ

struct Piece_t Piece[5] = { {3,0}, {3,0}, {3,0}, {3,0}, {3,0}, };

490:デフォルトの名無しさん
09/08/16 22:09:04
では要素数が可変の場合にはそれを上回る数を
あらかじめ用意するしかないのでしょうか?

491:デフォルトの名無しさん
09/08/16 22:14:24
forで回すなり、memsetするなりあるだろう。配列なら要素数も分かるだろ?

492:デフォルトの名無しさん
09/08/16 22:17:25
ああ…forで回せば良いのか…
疲れてたみたいです
アドバイス有難うございました

493:483
09/08/16 22:50:53
>>486
普通の関数ではそうですが、
関数テンプレートの場合はその限りではないと
記憶しています。



>>487
ありがとうございます。
Efficient C++は読んだこと無いので、
今度探ってみます。


494:デフォルトの名無しさん
09/08/17 00:31:52
いつもデバックなしで実行しているのですが、
リリースモードで実行するにはどうしたらいいですか?

495:デフォルトの名無しさん
09/08/17 00:35:43
まず、使っているコンパイラーを(ry

496:デフォルトの名無しさん
09/08/17 01:33:32
Intel C++コンパイラです。

497:デフォルトの名無しさん
09/08/17 10:20:38
>>496
使っているIDEのマニュアルでも読んでください。

498:デフォルトの名無しさん
09/08/17 11:07:11

if(flag_1)
return val_1;
else if(flag_2)
return val_2;
else if(flag_3)
return val_3;
これと
if(flag_1)
return val_1;
if(flag_2)
return val_2;
if(flag_3)
return val_3;
これはどちらが速いのでしょうか?

499:デフォルトの名無しさん
09/08/17 12:04:51
>>498
return文を使って関数から抜け出しているので、前者も後者も比較回数は同じになる。
また、return文を使って関数から抜け出しているので、前の条件が偽であるときしか後の条件を判断されないことになる。
よってelseを使う必要はない。
よって後者でおk。

ただ、速さが変わるかどうかは俺にはわかんね。

500:デフォルトの名無しさん
09/08/17 12:15:09
繰り返し文でその都度printfで結果を表示させたいのですが
古いほうから消えていきます。結果を全部残すにはどうすればいいですか

501:デフォルトの名無しさん
09/08/17 12:16:12
>>500
リダイレクトする。

502:デフォルトの名無しさん
09/08/17 12:28:15
>>498
少なくとも私は後者の方が速くタイプできました。

503:デフォルトの名無しさん
09/08/17 12:36:21
>>501
なるほど。それでググったら出来ました。ありがとうございます

504:498
09/08/17 12:45:18
>>499
ありがとうございます。

速さは・・・elseがない方がむしろ速いとか、
あった方が処理が分かりやすくて最適化しやすいとか
同一のasmに落ち着くから関係ないとか色々と考えられそうです。

ま、あまり気にしないのが正解なのでしょうか。

BoostやGCCの実装とかで同じような物があるかどうか探してみたいです。

505:デフォルトの名無しさん
09/08/17 13:32:44
>>504
こっちに似たような話があるから気になるなら参加したら?
【初心者歓迎】C/C++室 Ver.67【環境依存OK】
スレリンク(tech板)

506:504
09/08/17 14:21:07
>>505
みんな同じようなこと考えるんですね。
行ってみるかもしれません。
ありがとうございます。

507:デフォルトの名無しさん
09/08/17 14:43:09
えっ?

508:デフォルトの名無しさん
09/08/17 15:13:20
タイピングを楽にする為だけの#defineもtypedefにしたほうがいいのかな
テンプレートっぽいことができるのと#undefがある分有利な気がするんだけど


509:デフォルトの名無しさん
09/08/17 15:56:43
>>508
typedefに代えていけるならお薦め。

> テンプレートっぽいことができるのと
そりゃtypedefに代えていけないってことじゃん。

> #undefがある分有利な気がするんだけど
どうして?むしろ不利だろ?
typedefなら同名の物とかち合ったらコンパイルエラーになれる。


510:デフォルトの名無しさん
09/08/17 21:16:01
非同期ファイル読み書きには
Win32APIのCreateFileしか方法ないの?

511:デフォルトの名無しさん
09/08/17 21:20:56
スレッドを使ってみるとか

512:デフォルトの名無しさん
09/08/17 22:33:25
>>498
gccでコンパイルすると同じになったからどっちも同じ

513:デフォルトの名無しさん
09/08/19 09:21:13
C++でCGIをはじめました。POSTで日本語を受け取った場合URIエンコードされますがデコードのやり方が分からず困っています。
例えば あ であれば
%82%A0になりますが
どのようにすれば元の文字に戻せるのか
わかる方いましたらよろしくお願いします。
ソースを頂けたらなおありがたいです。

514:デフォルトの名無しさん
09/08/19 09:37:31
スレチな気もするが…
URLリンク(www.kinet.or.jp)

515:デフォルトの名無しさん
09/08/19 10:20:59
.lib+.hで提供されているライブラリをまとめて適当な名前空間に入れたいんですが
なにかいい方法はないでしょうか


516:デフォルトの名無しさん
09/08/19 11:26:18
>>515
.libだと真っ当な方法では無理。
せいぜいがDLLに隔離して新しいインターフェースを丸ごと書き直すぐらいかと。

517:デフォルトの名無しさん
09/08/19 12:10:07
514さん
大変参考になりました。
私もスレチかと思いましたがそれでも 教えて頂けて本当に感謝しております。ありがとうございました。

518:デフォルトの名無しさん
09/08/19 14:18:30
インターフェースに宣言されているメンバ関数をコンストラクタのように連鎖的に呼び出したい場合
スコープ解決して普通に呼び出しを繰り返すすほかになにかやり方はありますか?


519:デフォルトの名無しさん
09/08/19 16:37:47
>>518
具体的にどういうコードで問題になってるのかわからん。
インタフェースって抽象クラスのことか?

520:デフォルトの名無しさん
09/08/19 17:19:45
pthreadについて。

pthread_createで作成したスレッドを、スレッド外から終了させたいのだが。
名前的にはpthread_t指定してpthread_killぽいと思ったんだが、うまくいってないぽ...

どうすればいいの\(^o^)/

521:デフォルトの名無しさん
09/08/19 17:25:29
signal(pthread_killの第二引数)は何を指定した?
まさか0じゃないだろうな?
int pthread_cancel(pthread_t)じゃ駄目?

522:デフォルトの名無しさん
09/08/19 18:31:55
0さーせんwwwwww

cancelで終了した!
さんくす

523:デフォルトの名無しさん
09/08/19 20:17:23
ofsream.flush()でファイル出力時に
ディスクの容量オーバーの場合エラーにする事てできます?
例外がスローされずにフリーズしてしまいます…

524:デフォルトの名無しさん
09/08/19 20:22:21
>>523
OSなどの環境は?

525:デフォルトの名無しさん
09/08/19 21:40:41
>>524
すいません、linux + c++ + gcc です。

プログラムからシェルコマンドでディスク容量の結果とって調べる
とかは可能です?

526:デフォルトの名無しさん
09/08/19 22:27:51
>>523
ofstreamの bad()/fail()/good()あたりのメンバ関数で判断できるんじゃないかな。

527:デフォルトの名無しさん
09/08/19 22:43:20
APIを探してくるしかなさそうだな。

528:デフォルトの名無しさん
09/08/19 23:56:33
>>523
C++のストリームクラスで例外が投げられるようにするには、
予めメンバ関数exceptionsで例外を投げるよう指定する必要があるよ。

529:523
09/08/20 14:19:06
レスおそくなりすみません。
一応解決しました、ブロックが全て埋まりますが、
>>526のfail()で判定できました。
ありがとうございました。

530:デフォルトの名無しさん
09/08/20 18:46:59
メンバ関数の名前ってインスタンスが主語になるように名付けたほうがいいですか?

531:デフォルトの名無しさん
09/08/20 20:10:13
大抵そうじゃない?

532:デフォルトの名無しさん
09/08/20 20:18:46
>>530
is_invalid()
とかね。
むしろそうじゃないのってなに?


533:デフォルトの名無しさん
09/08/20 20:36:17
getter/setterとしてのgetName()は、
インスタンスを主語にするんなら、returnName()じゃね?

534:デフォルトの名無しさん
09/08/20 21:01:57
>>533
あーなるほど。


535:デフォルトの名無しさん
09/08/20 21:50:52
itsName()

536:デフォルトの名無しさん
09/08/20 23:50:26
>>533
インスタンスに対する命令語だから、Set / Get でいいのでは?
そうなるとこの場合、主語は無しだけど。

protected / private メンバ関数だと自動詞、
public メンバ関数だと他動詞になりやすくない?


537:デフォルトの名無しさん
09/08/20 23:58:53
>>536
命令だとしてもインスタンスに対してGetってのは
やっぱおかしくない?
ちなみに英語では命令文の主語は通例省略されるだけでありyouだ。

とりあえず標準C++で考えて見ると
C++文字列(std::string)
URLリンク(www.cppll.jp)
C++ ベクタ(std::vector)
URLリンク(www.cppll.jp)

例が悪い気がしてきた(笑)


538:デフォルトの名無しさん
09/08/21 00:17:06
イテレータが分からなかった時の
begin()とかend()とかの怖さといったら。

539:デフォルトの名無しさん
09/08/21 02:53:16
C++の設計について質問です。

たとえば、ゲームの当たり判定を計算する関数郡を内包した「当たり判定計算クラス」を作り、
その計算クラスを扱う「当たり判定制御クラス」を作ったとして、
当たり判定制御クラスに計算クラスのオブジェクトアドレスを渡す際に、
生成もすべて任せるべきでしょうか? それとも、生成はまた別のクラスで行い、その後に渡すべきですか?

どうも調べていると、「生成は別にすべき」とよく目にするのですが、
この場合、「計算クラス」を使うのは「制御クラス」以外にありえず、
いちいち別で生成するメリットが見出せません。

オブジェクトを生成するファクトリクラスなる概念が出てくるのですが、
これというのは自機や敵機という具体的なオブジェクト以外にも、
こういった計算クラスのオブジェクトの生成も担うべきなのでしょうか

540:デフォルトの名無しさん
09/08/21 03:17:07
>計算クラスのオブジェクトアドレスを渡す際に、生成
何を生成?

541:539
09/08/21 05:09:32
説明不足でした、すみません

CAtari* a; ←アドレスなので宣言の時点では生成されていない
a = new CAtari( 引数 ); // コンストラクタを呼び出してオブジェクト生成
↑これを、制御クラスで行うか、生成クラスを作って行うか?

制御クラスで行う場合、
CControlAtari* b;
b = new CControlAtari( a, 他引数 ); // コンストラクタに計算クラスオブジェクトを渡す
↑このようにして、bのコンストラクタでaの生成を行います
 aの解放もbのデストラクタで行います

542:デフォルトの名無しさん
09/08/21 08:58:05
特別な理由でもない限りオブジェクトファクトリー使う必要はないよ

ただ、newしてないポインタを渡すぐらいなら
呼び元でnewしたほうがいいのでは

543:デフォルトの名無しさん
09/08/21 09:03:57
どうしたらここで言ってることが理解できるようになりますか?

544:デフォルトの名無しさん
09/08/21 09:21:39
コードを沢山書いて、人のコードも沢山読んで、
んで頑張る。

545:デフォルトの名無しさん
09/08/21 09:43:44
当たり判定なんて座標渡して結果を受け取るだけでいいんじゃないのか?

546:デフォルトの名無しさん
09/08/21 12:32:25
private:int m_xがあるとして
get_x()よりpublic:const int& xのほうがクライアントコードも短いしいいんじゃないですか?


547:デフォルトの名無しさん
09/08/21 12:46:48
それするならpublic: int xでいいじゃない

548:デフォルトの名無しさん
09/08/21 12:57:07
>>546
const_castで値が変更できそうなのは見なかったことにしても
メモリの無駄じゃないかな

549:デフォルトの名無しさん
09/08/21 13:35:25
実行中に自身のクラス名(C++の)を取得する簡単な方法ってある?

550:デフォルトの名無しさん
09/08/21 13:39:28
typeid(*this).name()

551:デフォルトの名無しさん
09/08/21 13:41:00
template<int i> ~~
ここでi=1~8までならコンパイル可能
それ以外だとエラー(できればメッセージつきで)
という具合にできますか?


552:549
09/08/21 13:50:47
>>550
ありがとう。

553:デフォルトの名無しさん
09/08/21 13:58:23
>>551
boost::mplとかテンプレートメタプログラミングとかBOOST_STATIC_ASSERTで検索。

554:デフォルトの名無しさん
09/08/21 14:16:09
>>551
#include <boost/mpl/int.hpp>
#include <boost/mpl/and.hpp>
#include <boost/mpl/assert.hpp>
#include <boost/mpl/comparison.hpp>

namespace mpl = boost::mpl;

template <int X>
struct S {
BOOST_MPL_ASSERT_MSG
((mpl::and_<
mpl::less_equal< mpl::int_<1>, mpl::int_<X> >,
mpl::greater_equal< mpl::int_<X>, mpl::int_<8> > >::value),
X_SHOULD_BE_GE_1_AND_LE_8, (mpl::int_<X>));
};

int main()
{
// S<9> s9;
// S<8> s8;
S<0> s0;
return 0;
}

ASSERT_MSGがそのものズバリですな
最後の引数に任意の型を放り込めるんで、
型タプル(?)と併用して複数の型を一括inspectとかお手のものです


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