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


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

C++相談室 part61



1 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 19:37:43 ]
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

302 名前:260 mailto:sage [2008/03/25(火) 23:08:35 ]
おなにーでさーせん。swapとかごめん。あと別に必要なかったかも。
コンパイル通った。
>>283と一緒かな?

class D {
 public:
  struct Proxy { Proxy( D *d ):d_( d ){}; D *d_; };
  operator struct Proxy () { return Proxy( this ); };
  D( struct Proxy p ) {};
  void operator = ( struct Proxy p ){};
  D(){};
  D( D &rhs ){};
  void operator = ( D &rhs ){};
};

D Return() { return D(); }

int main( int, char** ){
D d = R();

return 0;
}

Accept( D &d );ってのは間違ってたかも。
ようは、
D( const D &rhs )だと、オーナーシップの移譲とかでrhsに変更加えられない。で、
D( D &rhs )だと、右辺値を渡せない。
だから、Proxyを返して、ごにょごにょする。って話なのか。

303 名前:デフォルトの名無しさん [2008/03/27(木) 00:31:14 ]
Cの関数ポインタにC++のClassの実体化した関数ていれられますか?
ビルドエラーが出るんですけど、そもそもそんなの出来ない?

304 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 00:54:49 ]
>>303
できない。
関数ポインタとメンバ関数ポインタは別物。

305 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 01:38:47 ]
>>303
Windowsのコールバック関数みたいに
こっちから引数を渡せれば、どうにでもできる。

306 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 01:54:41 ]
>>303
sizeofを使ってポインタサイズを調べてみると、あれびっくりサイズがデカイって分るよ。
どうやっても入りません、キャストしたら情報ロストします。

307 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 02:00:59 ]
>>306
いろいろ勘違いしてるような。

308 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 02:24:05 ]
>>307
どこを?
具体的にどうぞ。


309 名前:デフォルトの名無しさん [2008/03/27(木) 02:29:53 ]
>>304-306 のうち確実に間違っているのは >>305 です、要注意。

310 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 02:49:53 ]
面倒だからboost::functionを調べてみ >303



311 名前:デフォルトの名無しさん [2008/03/27(木) 02:56:20 ]
詳しく説明した方がいいかと
要するに、メンバ関数ポインタがさす関数はvirtualである事もあって
インスタンスに仕込まれた仮想テーブルを参照して、関数テーブルのうちどの位置にあるものかを取得する必要がある。
また、関数はvirtualでないケースもある、この場合仮想テーブルには関数のアドレス情報はないので、関数メンバポインタ内に情報がなければならない。
関数メンバポインタはこれら複合情報で構成された構造体となっている。


312 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 03:03:53 ]
どこが詳しいのか


313 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 06:03:12 ]
それなりに詳しいと思うけど、
であるがゆえに「要するに」から始まっているのは間違いだと思う。

314 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 07:26:14 ]
>>303
関数ポインタには入れられないが、
実体とメンバ関数ポインタの対を構造体にしたものを引数に取る
ラッパ関数を通して呼ぶことはできる。
もちろん、C 側ではその構造体を直接扱うことはできないから、
void * を通すなり不完全型を利用してポインタで扱うなりする必要はあるけど。

315 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 07:39:53 ]
>>309
>>305はCのライブラリのコールバック使うときとかの対処法の話じゃね?
大抵はvoid*のパラメータ持ってるし。

316 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 07:46:12 ]
virtual関係無いよね。

317 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 08:15:45 ]
そもそも、C++のclassの実体化した関数って何?実体化って何を言ってるんだ
インスタンス増えたら関数も増えるとか思ってるのだろうか、理解に苦しむ

www.microsoft.com/japan/msdn/vs_previous/visualc/techmat/feature/jangrayhood/

318 名前:303 [2008/03/27(木) 08:50:26 ]
やりたいのは複数newしたクラスからCの関数叩くんですけどその時の引数にコールバック用のCの関数ポインタがあるんです
そしてその時呼んだ実体に関数ポインタによって帰ってくるようにしたいんです


319 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 09:03:26 ]
引数を加えて、static関数で良いんじゃ?

320 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 09:20:50 ]
>>317
非staticメンバ関数/インスタンスメソッドの事だとみんな理解してるよ。

>>318
コールバック関数のパラメタを汎用ポインタとかで指定できるなら、そこにオブジェクトのアドレスを入れて、コールバック関数内でキャストしてメンバ関数を呼ぶ。
パラメタを指定できないなら、コールバック関数から見えるスコープの変数にオブジェクトのアドレスを入れておき、コールバック関数からメンバ関数を呼ぶ。



321 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 10:10:15 ]
クラスの関数ポインタはthisが略されてるようなもんじゃね

322 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 10:31:11 ]
>>317
往生際が悪い、素直に自分の知識不足でしたと認めろ

323 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 11:13:55 ]
>>317
そのあたりは処理系依存だろ

324 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 13:09:21 ]
static メンバ関数を C のコールバックに登録するのってよく見るし実際に
やったこともあるんだけど、ほんとは extern "C" と extern "C++" の違いで
型が遭わないはずなんだよね。

だからって対応策がわかんないし、使ったことのあるコンパイラでは全部通るから
そのまま使っちゃうんだけどさ。

325 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 13:35:22 ]
>extern "C" と extern "C++"
"C" とかの修飾は、識別子を外部にどういう規則で公開するかという点についての指定であって、スタックフレームの作り方の指定ではない。
機種依存なので、そっちにいけと事になるが、cdeclとpascalが違えば "C" を付加しても動作しない。
C型のスタックフレームを持つ関数として登録可能な関数なら、C型のコールバックに登録する事ができるという事。
そうでないなら、コンパイルが通ったとしてもうまくいかない。

326 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 13:52:21 ]
>>325
スタックフレームとか実装に立ち入った話はしてない。言語概念上の型が違うんだよ。

327 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 13:53:59 ]
>>326
力いっぱいデタラメぶちかまさない

328 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 13:58:42 ]
知識不足は許容できるが嘘吐きになってはイカンぜよ

329 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 14:03:56 ]
>>327-328
気持ちはわかる。きっとみんなこれらは同じものとして使ってるだろうし、
動作も問題ないだろうさ。

でも規格ではエラーにならないとダメなんだよ。はっきり書いてあるから。

7.5 "Linkage specifications" p1 より
> ... Two function types with different language linkages are distinct types even
> if they are otherwise identical.

gcc でもバグ扱いだ。
gcc.gnu.org/bugzilla/show_bug.cgi?id=2316

330 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 14:06:37 ]
>>329
自分を嘘と虚栄で塗り固めるような真似はやめた方がいい、どこに突っ込み入っているのかすら理解できていないだろ。



331 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 14:10:44 ]
静的メンバ関数はextern "C++"ではない

332 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 14:11:10 ]
328は327に宛てたもんだと俺は思った、どうでもいいけど。

333 名前:329 mailto:sage [2008/03/27(木) 14:11:40 ]
>>330
ごめん。どこに突っ込み入っているのかすら理解できてない。
どこが嘘になってるの?

334 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 14:16:32 ]
>>331
何を根拠にそんなこと言うのか知らないけど、じゃぁ静的メンバ関数の
language linkage は "C++" 以外の何になるのさ?

335 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 16:56:26 ]
虚言癖というか妄想癖というか・・・なんかもう病気だね(汗

336 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 17:04:34 ]
>>334
静的メンバ関数のリンケージは内部リンケージで
その根拠は外部に公開されないから
逆にextern "C++"と同じという根拠は?

337 名前:デフォルトの名無しさん [2008/03/27(木) 17:05:02 ]
もうv(^・^)vの人はいないの?

338 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 17:20:53 ]
ちゃんと勉強しろ、そんな高度な話題じゃねぇよ

339 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 18:55:41 ]
コンストラクタの中で
配列宣言しているオブジェクトの
コンストラクタ引数を設定するにはどうしたらいいですか?

340 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 19:03:37 ]
class Test{
Test0 objects[10];
...
};

Test::Test()
:objects[0]( 10 )
,objects[1]( 8 )
...
{
}

こんなかんじをやりたいのです。
もちろん、これではエラーです



341 名前:デフォルトの名無しさん [2008/03/27(木) 20:36:48 ]
>>339
できないよ。

342 名前:デフォルトの名無しさん [2008/03/27(木) 20:51:07 ]
解答を待っているのかもしれないが、本当にできないから。
www.geocities.jp/ky_webid/cpp/language/012.html

343 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 20:57:51 ]
どうしてもそれっぽいことがやりたいなら
vector<Test>にひとつひとつpush_back()するか
ポインタの配列にしてひとつひとつnewすればいいんでないの

344 名前:デフォルトの名無しさん [2008/03/27(木) 21:55:56 ]
VC++6で
for(int i=0; i<10; i++){
...
}
for(int i=0; i<10; i++){
...
}
って書いたら
iの再定義っておこられた
拡張子cppになってるのに

345 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 21:57:25 ]
仕様です

346 名前:デフォルトの名無しさん [2008/03/27(木) 21:58:46 ]
1998年発売のソフトやもん。

347 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 21:59:23 ]
>>344
びっくりするくらいみんな知ってる。
規格準拠していないんだから何も問題ない。

348 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 22:01:35 ]
>>344
#define for if(0); else for

魔法のおまじない

349 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 22:01:59 ]
当時は準拠してたんだよ

350 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 22:03:21 ]
まだ規格もなかったのに何に準拠してたというのか。



351 名前:デフォルトの名無しさん [2008/03/27(木) 22:04:00 ]
常識。

352 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 22:29:04 ]
>324,329
だいたい、「関数ポインタ型」それ自体にはリンケージなんか無いだろ。
それともこーゆーコードが通るコンパイラでもあるのかっつーの。
typedef static void (*hoge)();
typedef extern void (*foo)();
typedef extern "C" void (*var)();

353 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 22:36:23 ]
typedef void (*__stdcall type)();

こういうのならたまにやる。

354 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 22:36:46 ]
それはリンケージじゃなくて呼び出し規約

355 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 22:48:31 ]
>>350
ARM、ISOのドラフト

356 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 22:49:53 ]
>>355
>>344 なていたらくでか

357 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 22:58:27 ]
>>356
forの中で定義した変数の有効範囲が
直後のループ本体に限られるようになったのは
結構遅かったのでは?D&Eでも軽く触れられていたし。

それに加え過去の互換性のためVC6はあれがデフォルトになったんだと思う。

358 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 23:27:37 ]
昔の人が考えた仕様には、頭おかしいだろうってのがそれなりに有るからね。

359 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 23:47:27 ]
初期のコンパイラの実装の都合もあったんじゃないかな?

最近のコンパイラで、forの変数の有効範囲が限られるようになってるのに最近気づいて思わずGJと叫んだ。


360 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 00:10:34 ]
>>357
まあ 1998 年と言えば規格が出る年だしな。
開発期間とか考えると多少前の仕様に準じようとしてたと考えるのが妥当だけど、
その時期ならドラフトとはいえかなりな部分まで練られてると思うんだけどな。
まあ、想像でしかないので本当にギリギリになって入れられた仕様なのかもしんないけど。

VC6 はテンプレートまわりがバグ持ちすぎてかなり酷いが、
テンプレートも遅くに入った仕様だからな・・・。
new がデフォで bad_alloc 投げないとか、とにかく色々と酷い上に、
しばらく次のコンパイラが出なかったという・・・。



361 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 00:18:58 ]
未だに古いライブラリとかで使わないといけないことが結構あるからねぇ
VS2005から入った俺としては結構苦痛
まあでもテンプレートさえなければインテリセンス反映が早いのはよい

362 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 00:36:24 ]
VC++6.0は当時の状況を考えればしょうがないと思う

問題なのは次のコンパイラがさっさと出なかった事
お陰で変に普及しちまって、このスレでもVC++6.0でコンパイルできません的な質問が絶えない

363 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 00:38:12 ]
全てはMSが次期製品を確実に買ってくれる為に図った陰謀。

364 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 00:53:13 ]
MSの事情的にはむしろ逆のような?
過去のシステムヘッダに, for で宣言した変数が
その後も生きることに依存したコードがあったっていう……

365 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 00:56:00 ]
#define for if(0) else for
のおまじないと使ったあとでATLをincludeすると
怒られるちゅーか

366 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 01:14:53 ]
>>363
そして満を持して登場した 2002 が糞だったという罠。
そして 2003 で大きく改善されるという二重の罠。
アカデミックだと無料アップグレードできないという三重の罠。

367 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 01:16:50 ]
#define for if(0); else for は色々やった後にやるとよろし。

368 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 01:55:57 ]
ってかincludeする前にundefするだろ・・・

369 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 02:11:01 ]
>>336,352
ややこしくて嫌になるが、内部とか外部とかがある「リンケージ」と
"C" とか "C++" とかがある「言語リンケージ」("language linkage") とは
別物。 >324,329 が言ってるのは言語リンケージのほうなんで、話がまるで
かみ合ってない。

370 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 03:12:43 ]
自信満々な>>336が可哀想に見えてきちゃったよw
逆にextern "C++"と同じという根拠は?ってのが哀愁をソソル



371 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 03:26:11 ]
>>336
素の「リンケージ」の話だとしてもおかしい。静的メンバ関数のリンケージは
ほとんど外部リンケージになる。例外は関数内のクラスのメンバの場合とかね。

372 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 03:29:08 ]
静的メンバ関数が「外部に公開されない」ってのもおかしいな。
クラスの宣言されたスコープや、クラス内での private なり public なりに
従うだろ、常考。

373 名前:デフォルトの名無しさん [2008/03/28(金) 03:50:38 ]
びやーんはもうC++なんか使っていないらしい。

374 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 05:40:45 ]
ソースは?

375 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 07:19:26 ]
2ch

376 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 08:03:31 ]
>>372
public, privateと内部リンケージ, 外部リンケージはまた別の話だ

377 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 08:07:53 ]
もう何がなんだかわからないよママン

378 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 09:26:26 ]
>>359
もともとがCへのトランスレータだった事を考えれば自然に合点が行くね。
for( int i = 0 ; .... ) { ... }
変換後
{
 int i ;
 for( i = 0 ; .... ) { ... }
}

379 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 09:47:14 ]
>>377
C++の仕様書を見ればいいと思うお

380 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 09:57:02 ]
>>372
リンカなどの外部に公開され得るのはクラスであって内部リンケージであるメンバが同様に公開されているように見えるのは処理系の都合



381 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 11:33:58 ]
>>380
クラスが外部リンケージを持つときに、メンバ関数が外部リンケージを持つかどうか は処理系依存だと言っているのならそれは違うよ

382 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 03:01:24 ]
>>377 >329,324

383 名前:デフォルトの名無しさん [2008/03/30(日) 01:04:01 ]
テンプレートをつかうと一気にコンパイル時間が10倍に?!

384 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 01:07:31 ]
>>383
>>5

385 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 15:11:26 ]
template使っても
型が1個と100個じゃ大違いだろ

386 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 15:17:08 ]
このテンプレいつの間にか一つのレスにまとめられてたのかw

387 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 15:27:00 ]
template <typename Questioner>
int IsCompileTimeBecomeLongerByUsingTemplate() {
return ENVIRONMENT_DEPENDENT;
}

388 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 16:25:46 ]
テンプレート無意味過ぎる

389 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 16:28:21 ]
>>388
質問者に応じて別の回答をするように特殊化するんだよ。

390 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 16:36:16 ]
template<> int IsCompileTimeBecomeLongerByUsingTemplate<教えて君>()
{
 throw spoon();
}




391 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 16:59:30 ]
匙は投げられた。

392 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 17:30:09 ]
the biggest news of the meeting was that we voted lambda functions and closures into C++0x.

// Writing a collection to cout, in C++0x:

for_each( w.begin(), w.end(),
[]( const Widget& w ) { cout << w << " "; } );


393 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 17:59:38 ]
スレ違い

394 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 01:28:23 ]
LRESULT CALLBACKの関数をCLASSに所属させるにはどうすればできますか?

395 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 01:37:29 ]
static

396 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 02:07:44 ]
>>394
web.archive.org/web/20070810174250/http://techtips.belution.com/ja/vc/0009/

397 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 05:36:51 ]
RTTIについて質問です。
RTTIありでオブジェクトファイルを生成したいが
外部libなどがRTTIを含んでいない場合は
自分側もそれにあわせてRTTIなしで組まなければ成らないのでしょうか?

398 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 10:26:48 ]
コンパイラオプションでRTTIを使うかどうかの設定の話なら、ケースバイケース。
自分が知るVC++では、外部のオブジェクトに対してtypeidやdynamic_castをしなければ、
自プログラムがRTTI有効でも、問題なくリンクして実行できる。
逆にそうでない処理系も世の中あるかもしれない。

399 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 12:28:13 ]
>>397
リンクでエラーが出たらオプション変えればいいんじゃないか?


400 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 17:21:40 BE:1614463687-2BP(200)]
www.borland.co.jp/cppbuilder/freecompiler/
が切れていてBorland C++ Compilerがダウンロードできないんだけど




401 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 17:25:43 ]
>>400
普通にアクセスできるしスレ違いですさようなら

402 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 02:25:47 ]
test






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

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

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