[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 2chのread.cgiへ]
Update time : 05/09 21:15 / Filesize : 160 KB / Number-of Response : 654
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【初心者歓迎】C/C++室 Ver.71【環境依存OK】



1 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 23:15:45 ]
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。

【前スレ】
【初心者歓迎】C/C++室 Ver.70【環境依存OK】
pc12.2ch.net/test/read.cgi/tech/1258873470/

【アップローダー】(質問が長い時はココ使うと便利)
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
codepad.org/ (コンパイルもできるし出力結果も得られるのでお勧め)

◆ソースのインデントについて
半角空白やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのも手ですが直接貼る場合は、
全角空白か に置換すると見栄えだけはよくなります。


159 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 11:15:33 ]
struct hoge {
int bar1;
char *buf;
int bar2;
};

こんな構造体のbufに文字列入れるなりmallocするなりするとメモリ的にはどうなるの?
bar2がその分後ろにずれたりするの?

160 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 11:22:14 ]
template<size_t T_size>struct hoge {
int bar1;
char buf[T_size];
int bar2;
};

161 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 11:22:50 ]
>>155
void*なんか使わないほうがいいと言えばそのとおりなんですが
スクリプトと拡張型のポインタをやり取りするのに一回void*に変換されて型情報がなくなってしまうのです
スクリプト側で変なことしなければ問題はないんですが、間違えるとエラーも出せずに落ちてしまうのでどうにかできないかな、と

>>156,157
やっぱり無理・・・でしょうか

>>158
すいません
詳しくお願いできますか?

162 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 11:45:30 ]
void*のポインタ先をデータの生ポインタではなく、

struct ptr_holder {
void *ptr;
type_info ty;
};

のポインタとかにはできないの?

163 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 11:54:49 ]
>>161
void*を何かのクラスに変換するのはプログラマの責任になるんだね。
変換方法はプログラマから決めないといけないけど、1種類のクラスしか扱えないのが実情。
そこで、複数のクラスを扱うには、>>162のように1種類のクラスを挟んでクラスを識別できるようにして変換する。
それをやっているのが>>158の方法。shared_ptr<void>へのポインタshared_ptr<void>*をvoid*として渡し、shared_ptr<void>*に戻す。その後、shared_polymorphic_cast<Hoge>(*Ptr);で変換。型が違えば例外が投げられる。

164 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 11:56:54 ]
>>159
ずれない
                +------+
0x11111100 | bar1   |
                 |------|
0x11111104 | buf     | ---> NULL
                 |------|
0x11111108 | bar2   |
                +------+
↑こんな感じのが ↓こんな感じになるだけ
                +------+
0x11111100 | bar1   |
                 |------|
0x11111104 | buf     | ----+
                 |------|        |
0x11111108 | bar2   |        |
                +------+        |
                 +------+       |
0x22222200 | 文字列 |  <--+
                 +------+

165 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 12:13:53 ]
>>163
shared_ptrのその使い方はshared_ptrの本来の使い方の一部にしかすぎない。
shared_ptrの本来の使い方を知った上で使うべき。

166 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 12:13:58 ]
>>162
残念ながら、ptr_holder*をvoid*にして渡すという形になりますので
結局のところvoid*がptr_holder*に戻せるかという、ほぼ同じ問題に戻ってしまいます

>>163
やはりvoid*がshared_ptr<void>に変換できる保証はないので、完全では無いですね


でも同一プロジェクト内でならshared_ptrに統一することは可能なので試してみたいと思います
みなさんレスありがとうございました

167 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 12:39:16 ]
>void*がptr_holder*に戻せるか

そこは当然ptr_holderしか使わないという縛りが必要になる



168 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 12:50:54 ]
void*やshared_ptr<void>ではなく、boost::any(あるいはany*やshared_ptr<any>)にしたらいい。

169 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 15:23:09 ]
LinuxでC++勉強したいんだけど
ライブラリって何が標準なの?

170 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 15:25:02 ]
gccとかのこと?

171 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 15:25:38 ]
>>169
まずは C 標準ライブラリと C++ 標準ライブラリだな。

172 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 15:29:38 ]
>>171
boostというのが標準ですか?それともSTLというのですか?

173 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 15:35:08 ]
>>172
boost は標準ではないが、将来の標準に含まれるものを含んでいる。
STL は昔の名前で、今は C++ 標準ライブラリに含まれている。

174 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 15:38:54 ]
>>172
boostは標準ライブラリではない。
だが信頼性・移植性のある外部ライブラリだと思う。
あとboostのすごいところは最先端をめっちゃ追求しているところかな。



175 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 15:45:36 ]
boostは盛りだくさんだから、ひとくくりで全部OKとかダメだとは言いにくいな。

176 名前:progress_display mailto:sage [2010/02/07(日) 15:49:25 ]
>>175
私のことお呼び?

177 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 16:40:18 ]
昨日違うスレで質問しましたが、質問させてください

public void setXXX(Foo* f)というメソッドがあった場合、
1.setXXX(f);→fはポインタ
2.setXXX(&f);→fはポインタではなく、fのアドレスを渡している

普通にプログラミングをした場合は、1 or 2のどちらでも大丈夫だと思います
しかし、GUI関係をプログラミングした場合は、2の方法はダメな可能性が高いと思うのですが
結局はGUI Tool Kitに依存するといいうことでしょうか?



178 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 16:47:07 ]
fがFooのポインタなら1だし、Fooのインスタンスなら2
ツールキットとかそういう問題じゃない
そもそもpublic void setXXXは通常なら構文エラー

179 名前:177 mailto:sage [2010/02/07(日) 16:51:15 ]
>>178
1はFoo* f = new Foo();
2はFoo f;
で宣言しています

>そもそもpublic void setXXXは通常なら構文エラー
何故?

180 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 16:58:25 ]
そのGUIオブジェクトがローカルスコープ限りで削除されるような場合は別に2でも問題ないと思うけれど
デバイスコンテキストとかはそういう使い方をしそうだがウィンドウとかはあまりそういう使い方をしないだろう

181 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 17:06:54 ]
>>179
エラーってのは、publicの後ろにコロンが付いてないだけのことだと思う。

182 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 17:06:54 ]
>>177
> GUI関係をプログラミングした場合は、2の方法はダメな可能性が高いと思うのですが

なんで?
意味わかんない。

可能性が高いとかグダグダ言ってないで、関数の仕様を確認すればいいのに。

183 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 17:15:50 ]
スタックやヒープといったメモリ領域はご存じ?

184 名前:177 mailto:sage [2010/02/07(日) 17:56:51 ]
>>180
それもそうですね

>>181
java出身なもので、うっかりやってしまいました

>>183
yes

185 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 18:14:18 ]
177がなんでそんな疑問を持ったかのほうが気になる
そもそも実引数fの型がFOOへのポインタだとしたら
上の1と2は全く同じ意味だというのは分かってる?

186 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 18:17:44 ]
185は忘れてくれ

187 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 18:21:54 ]
>>185
ドンマイ。たまにうっかりしちゃうよな。



188 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 18:39:49 ]
>>177は何かを勘違いしてる気がする。

public : void setXXX(Foo* f);

Foo fOrg;
Foo* f = &fOrg;

1.setXXX(f);→fはポインタ
2.setXXX(&fOrg);→fOrgはポインタではなく、fOrgのアドレスを渡している

これでどっちも同じになるんだが。

189 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 18:47:44 ]
>>188いや、たぶんそれ自体は理解してるんじゃないかな
GUIアプリで、長期間あるオブジェクトを使うような場合に、
ヒープにとるべきか(1)スタックにとるべきか(2)という質問なんじゃないの

190 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 18:54:41 ]
じゃあ、インスタンスの寿命を気にしてるってことか。
そんなのJavaもC++も一緒じゃないの?
スコープを抜けたらデストラクタが実行されるでしょうよ。

191 名前:190 mailto:sage [2010/02/07(日) 18:56:52 ]
ごめん違った。Javaはfinalizeがいつ実行されるのか分からんのね。

192 名前:177 mailto:sage [2010/02/07(日) 19:11:12 ]
>>189
その通りです。そういう質問です
ttp://gihyo.jp/dev/feature/01/qt/0003?page=2
>1.子ウィジェットのメモリ解放の自動化
を読んでいたら疑問が湧きました

>>188 には↓と書いていますが、
>これでどっちも同じになるんだが。

1.Foo fOrg;←スタックにインスタンスが確保されるハズ
2.Foo* f = new Foo();←ヒープにインスタンスが確保される

2の方法だとヒープにあるインスタンスはdeleteしないと削除されませんが、
1の方法だと自動的に削除されるのでは?と考えました

もしも、1の方法で自動的に削除されなかった場合、
スタック(first in first out)なので「他の変数も削除されなくなる可能性」があるんじゃないかな〜と

わかりずらくて、スマソ

193 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 19:18:21 ]
1のやり方で自動的に削除されるよ
f自体は削除されるが
fのメンバにポインタがあった場合
そのポインタがさしてる先が削除されるかは
ちゃんとそういう処理を書いたかってことによる


194 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 19:20:45 ]
いや、スタックってLIFO: Last In First OutまたはFILO: First In Last Outだから。
スタックに確保したインスタンスは、スコープを外れれば自動的に削除されます。
つまりスコープを外れない限りは自動的に削除されることは無い。
削除されないならそのシステムが腐ってる。
LIFOをイメージ出来れば今回の疑問は解決するはず。

195 名前:177 mailto:sage [2010/02/07(日) 19:35:38 ]
>>193-194
なるほど、いろいろと勝手にやってくれて
やってくれなかった場合はシステムが腐っているってことですね
---------------------------------------------------------------------
qt4を参考に、適当に考えてみたコードなのですが

class MainWindow { //ウインドウ関係のクラス
public:
void setWindowTitle(string* s);

void init() {
string s = "これの方法は安全なのか?";
mainWindow.setWindowTitle(&s);
mainWindow.show(); //guiのイベントループを開始する
}

mainWindowが終了した段階で、MainWindowがstring sをdeleteする
また、mainWindow.show();はブラックボックスかされていて、
init()の方が最初に終わるかもしれないという条件の場合  //かなり、腐っている気がするけど

string s;はやっぱり、string *s = new string("テスト");とした方がいいんですね?
最後にこの質問だけ教えてください

196 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 19:38:41 ]
「1の方法で自動的に削除されなかった場合」ってどういう状況でそうなると思った?
システム的には、>>194の通り、スコープを外れたら自動的にデストラクタが呼ばれる。
>>193の言うようにそのデストラクタ内の処理で必要なものを解放していなければメモリリークになる。

Javaみたいに、オブジェクトがどこからか参照されている間は削除されないなんてことはないので、
もしsetXXX(&f)することで生存期間が伸びるとか思ってるなら間違い。
無効なアドレスに対してアクセスが発生して、運が良ければ落ちるし、最悪の場合は黙って動き続けることに…

197 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 19:39:48 ]
>>195
string*はやめてconst string&で受け取った方がいい
MainWindowにWindowTitleのメンバを用意して、
コピーコンストラクタでコピーするべき



198 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 19:41:20 ]
コピーコンストラクタは間違いだった。

199 名前:177 mailto:sage [2010/02/07(日) 19:56:45 ]
>>196
>Javaみたいに、オブジェクトがどこからか参照されている間は削除されないなんてことはないので、
>もしsetXXX(&f)することで生存期間が伸びるとか思ってるなら間違い。

なるほど、それが聞きたかった
わかりました、ありがとうございます

>>197
>string*はやめてconst string&で受け取った方がいい
うーん、それは危なくないですか?
>init()の方が最初に終わるかもしれないという条件の場合
という条件があるので

200 名前:196 mailto:sage [2010/02/07(日) 19:56:46 ]
更新してなかった
>>195の条件ならどっちもダメ
newした場合は自分でdeleteしなきゃいけないので、メンバ変数とかに持っておく必要がある

>>192のQtの場合は、親ウィジェットから辿れる子ウィジェットについては、
親ウィジェットのデストラクタ内でdeleteを呼んでくれてるってことだと思う
そういうフレームワークを使うなら自分でdeleteする必要はない(というかしたらまずい)

あと直接関係ないけど、
スタックを使う場合は、Javaには真似できないRAIIって技法があるから調べてみると面白いかも
ヒープの場合はスマートポインタ(boost::shared_ptrとか)を使うと安全度が高まる

201 名前:177 mailto:sage [2010/02/07(日) 20:07:03 ]
>>200
>Javaには真似できないRAII
これ調べておきます

>mainWindowが終了した段階で、MainWindowがstring sをdeleteする
こういう条件があるので↓は気にしなくていいのでは?
>newした場合は自分でdeleteしなきゃいけないので、メンバ変数とかに持っておく必要がある


202 名前:196 mailto:sage [2010/02/07(日) 20:15:39 ]
>>201すまん、見落としてましたw
じゃあnew以外ないね(逆に、スタックに確保したインスタンスをdeleteするのは駄目)。
ただ、関数レベルでそんな実装するのはC++的じゃないので、普通ないとは思うけど。

203 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 20:26:02 ]
C++を習得する場合、
Java→C++よりC→C++の流れの方がやっぱりまともだな

204 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 20:28:11 ]
なぜわざわざ荒れそうな方向へ持っていく

205 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 20:30:31 ]
>>204
そういう荒れそうな発言は、メッ!ですよ

206 名前:177 mailto:sage [2010/02/07(日) 20:32:25 ]
>>202
いろいろと、ありがとうございました

207 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 20:33:14 ]
>>203
Cはクラスがないじゃん
だから面倒くさい



208 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 20:34:52 ]
これがゆとりか…

209 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 21:09:47 ]
2ちゃんねるブラウザで一番難しい所は、スレを表示する機能だと思うんだよね
しかし、既存の専ブラはそれをどうやって解決しているのか?って所が問題

210 名前:209 mailto:sage [2010/02/07(日) 21:13:17 ]
ごめん、誤爆した

211 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 21:36:08 ]
C++を学ぶのにCを学ぶ必要はないよ
Cの古くて危険なやり方はやらない方がいい

212 名前:デフォルトの名無しさん [2010/02/07(日) 21:48:26 ]
www1.axfc.net/uploader/Sc/so/80610.zip

CodeSynthesis XSD/eのサンプルプログラムをVisual C++ 2008 Express EditionのIDE上でビルドしたいのですが、リンカエラーが
大量に出てしまい出来ません。うpしたのはXSDEのライブラリとサンプル1つだけ取って小さくしたものです。
nmakeだとビルド出来るのですが、IDEの「既存のコードからプロジェクトを作成」で作成したプロジェクトでビルドすると失敗してしまいます。

www.codesynthesis.com/products/xsde/

213 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 21:51:40 ]
>>211
その古くて危険なもので、今現在もどれほど多くのものが作られているか。

バカには使いこなせない、って点では確かにC++以上だとは思うけどな。

214 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 21:56:39 ]
C++はポインタ操作をクラス内に隠蔽できるメリットを理解して使ってる人はどれくらいの割合いるんだろうか。
Cを知らずにSTLをいきなり使ったほうが幸せになれるのではないかと思う今日この頃。


215 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 22:00:19 ]
>>213
CはCで今でもあちこちで使われているのは俺も同意だけど、それとこれとは別。

216 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 22:03:24 ]
そこでAccelerated C++ですよ

217 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 23:50:57 ]
>>214
deleteをほとんど出さない入門書があってもいいのではないかと思うと気がある



218 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 02:48:34 ]
「〜の数」ってときにつける変数名、皆さんはどうしてますか。
たとえばりんごの数とか…。

219 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 03:13:16 ]
num_apples

220 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 03:16:40 ]
人に薦めるならcountかなぁ。

自分のプロジェクトでは、数はnum、番目はnoを使ってる。
それ一緒や!元ネタ一緒やで!というツッコミは甘んじて受けよう。
大事なことはプロジェクト内での一貫性。(あと検索一意性)
それさえ見失わなければhogeでも構わん。

221 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 03:35:36 ]
>>219>>220
レスありがとうございます!
私はthe number of 〜とか考えてました。でもこれじゃあなんかな〜…と。
これからはnum、noを一貫してつけていくことにします。

222 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 07:03:31 ]
プログラムからPukiWikiのページを書き換えるにはどうやればいいですか?

223 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 07:59:00 ]
HTTPでしかるべきPOSTメソッドを送信すればいいと思うけど

224 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 08:19:06 ]
>>223
どうもです。
HTTPというと、C++で使うのはwininetですかね。
HTTPの事も調べないといけないなぁ。

225 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 08:52:24 ]
個数ならcount
量ならamountだな

226 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 09:26:00 ]
変数名スレでやれ

227 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 09:36:02 ]
Boost.Asioを使ったHTTP通信のサンプルコードはよく転がってるよ



228 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 14:39:57 ]
int n;
cin >> n;
char buf[4096];
for(int i=0;i<n;++i){
cin.getline(buf,4096);
cout << buf << endl;
}
このプログラムで
1
hello world
という入力をしてhello worldを出力したいんですが
1 Enterの時点でプログラムが終わってしまいます
最初のcin>>nで一つ目の改行が読まれていないみたいなので驚いたんですが
getlineと通常の>>は混ぜて使わないほうがいいんでしょうか?

229 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 15:06:36 ]
cin>>n は数値を読むだけで改行は読まないから
改行が来るまで吐き出させるとか
char c;
do {
cin >> c;
} while (c != '\n');

230 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 20:56:46 ]
string s = "str";
if( s ) {
  std::cout << "true" << std::endl;
}
このスレで条件式にインスタンスを渡してもいいと教えてもらったのですが
シンタックスエラー?が出ました
>/Test/main.cpp:9: error: could not convert ‘str’ to ‘bool’

why?



231 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 20:58:47 ]
stringはデフォでboolに変換できない。
s.c_str()とかやりなされ

232 名前:230 mailto:sage [2010/02/08(月) 21:14:31 ]
>>231
s = NULLの時はfalse、s != NULLの時はtrueと教えてもらったのですが

233 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 21:33:46 ]
>>232
それは騙されたんだよ。
char* ならそうなるけど、string はそうはならない。


234 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 21:45:34 ]
>>232
妄信的に考えるのは良くないよ。それは何を評価してるかわかってるのかなぁ??

stringはクラスで>>230の使い方だと特にポインタにnewしてるわけでもないので、即インスタンスは確保される。
適当な型変換をクラスの実装による変換で要求するが、
stringは変換機構を実装してないからコンパイラさんが評価できないよ〜。ってエラーを返している。

235 名前:230 mailto:sage [2010/02/08(月) 21:45:55 ]
>>233
stringだからダメなんですかね?
その時は、if(オブジェクト)はなぜシンタックスエラーにならないの?って質問したんですが

236 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 21:51:23 ]
>>235
ifは論理式の評価の後に最終的にはboolを要求する。
boolの基本は、0がfalse、それ以外がtrueなので、
ポインタを評価したときにポインタにNULLが入っていたらNULL==0==false相当なのでそのように動く。
凄い細かい話なんだが。。。

237 名前:230 mailto:sage [2010/02/08(月) 21:53:01 ]
>>236
わかりました
ありがとうございます



238 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 22:21:43 ]
C++テンプレートテクニックスという本に載っていた
vtableを自分で実装する方法で非仮想関数を仮想関数のように扱う方法なんですが
これって普通に仮想関数を使った場合とどっちが早いんですか?

239 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 22:38:26 ]
if(boolean-expression) {}

boolean-expression が object だった場合、
コンパイラは次の優先順序で変換を試みる。

1. operator bool() {}
2. operator 数値型() {}
3. operator ポインタ型() {}

operator bool() が実装されていない場合、
かつ operator 数値型() が複数実装されている場合は、
曖昧であるためコンパイルエラーとなる。

VC2008EEで確認したら、こんな動作だった。
これは言語仕様で定義されてるのかな?


240 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 22:51:23 ]
>>238
実装によるとしか。
大抵ほぼ同じになると思うが。

241 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 23:09:16 ]
>>238
最適化うんぬんやらスレッド安全性などを考えても、
vtableを自分で実装なんてしなくていいともうけどね。

だいたい、仮想関数のスピードがネックになる設計なんて
今まで俺はみたことないよ。

80-20の法則ってやつを思い出すしか。


242 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 23:10:36 ]
>229
おまいは今 ignore さんの存在意義を否定した。

243 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 23:29:37 ]
__FreeList* element = static_cast<Integer::FreeList*>(::operator new (sizeof(Integer)));
__freeList_ = element;
__for (int i = 1; i < BLOCK_SIZE; ++i) {
____element->next = static_cast<Integer::FreeList*>(::operator new (sizeof(Integer)));
____element = element->next;
__}
__element->next = 0;

これの意味が解りません



244 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 23:30:57 ]
どこが分からないの?

245 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 23:44:11 ]
>239
もうちょい周辺の記述も有った方が分かりやすそうだけど、とりあえず以下の規定から導かれる動作だと思われ。
> 14882:2003
> 13.3.3p1
>(略)
> - the context is an initialization by user-defined conversion (see 8.5, 13.3.1.5, and 13.3.1.6) and the standard
> conversion sequence from the return type of F1 to the destination type (i.e., the type of the entity
> being initialized) is a better conversion sequence than the standard conversion sequence from the return
> type of F2 to the destination type.
>
> 13.3.3.2p4
> Standard conversion sequences are ordered by their ranks: an Exact Match is a better conversion than a Promotion,
> which is a better conversion than a Conversion. Two conversion sequences with the same rank are
> indistinguishable unless one of the following rules applies:
> - A conversion that is not a conversion of a pointer, or pointer to member, to bool is better than another
>   conversion that is such a conversion.
>(略)

246 名前:デフォルトの名無しさん mailto:sage [2010/02/08(月) 23:52:36 ]
>>244
この辺がよくわかりません。
static_cast<Integer::FreeList*>(::operator new (sizeof(Integer)));

配列を確保してるのですよね?

247 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 00:40:32 ]
>>241
vtableの自前実装は、型消去かバイナリ互換が主な理由だと思う。
速度目的は聞いたことないなあ。



248 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 00:55:02 ]
自前vtableっていまいち使い道が不明だと思ってたんだけど、そういうところで使うのね

249 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 01:01:23 ]
ああ、自前vtableで速度向上になるって話も思い出した。
どこだか忘れたけど、概要としては非ポリモーフィックに扱う限り
非仮想関数だから最適化されやすいという理屈。

今時のコンパイラなら、仮想関数でも多態的でない状況で使われることを
検出してやるなんて朝飯前だろうから、やっぱり速度目的で自前vtableにする理由はないな。

250 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 01:41:35 ]
>>246
::operator new()というのは、
要求されたメモリを確保して
void*として返す関数。
(bad_allocを投げるmalloc()、と考えてよい)

したがって、sizeof(Integer)のメモリを確保して
それを(void*から)Integer*にキャストしてる。

251 名前:222 mailto:sage [2010/02/09(火) 08:05:12 ]
うーん、通信のプログラム難しい・・・。
HttpOpenRequestやHttpSendRequestを使うと思うのですが、どうやればいいのかわからないです。
ブラウザでPukiWikiを開いてソースを見ても、これと同じ事をwininetでやるにはどうすればいいのかさっぱり・・・。
何か良いサンプルはないでしょうか?

252 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 10:25:13 ]
そもそもHTTPはわかってるの?

253 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 11:43:02 ]
>>252
軽く調べた程度の知識しかないです。

254 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 11:52:52 ]
じゃあまずは簡単なCGIを自作して、そいつにPOSTするようなの書いてみては

255 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 12:58:56 ]
サブクラスを普通に使いつつ、スーパークラスをインスタンス化を禁止する方法ってありますか?


256 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 13:06:01 ]
virtual function-name() = 0

257 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 13:06:21 ]
スーパークラスのコンストラクタをprivate/protectedにして実装を書かない
って技があったと思う
iostreamライブラリでも使われてるってEffectiveC++のどっかに書いてあった



258 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 13:10:25 ]
抽象クラスっていうんでしょうか?
ただスーパークラスの関数はすべてvirtualながらも定義していて、
必要に応じてサブクラスで上書きしているので、純粋仮想関数は使えないです

スーパークラスのデフォルトコンストラクタをprotectedにしてみました
これはアリでしょうか?

259 名前:デフォルトの名無しさん mailto:sage [2010/02/09(火) 13:12:07 ]
>>257
リロードしてなかった・・・
いまその記事発見しました
ありがとうございます






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<160KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef