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


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

C++相談室 part71



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

前スレ
C++相談室 part70
pc12.2ch.net/test/read.cgi/tech/1244942050/l50

447 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 16:16:22 ]
規格票を持っていたら§14.5.3 Friends
を参照してみて欲しい

いろいろと制限がきついことがわかると思う

448 名前:428 mailto:sage [2009/08/11(火) 16:45:41 ]
>>447
すみません。
一介の趣味プログラマ(職業とは関係ない)でして、
規格票は買ってはおりません。

日本工業標準調査会:データベース-JIS詳細表示
ttp://www.jisc.go.jp/app/pager?id=40240
ここで探してみます。

449 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 17:05:27 ]
namespace MyNS
{
//省略

template<typename int_t>
class MyTempl;

template <typename hoge_t, typename boke_t>
hoge_t foo(const boke_t& arg);

template<typename int_t>
class MyTempl
{
public :

int_t num;

MyTempl(int_t n = 0) : num(n) {}


template <typename hoge_t>
friend hoge_t foo(const MyTempl<int_t>& arg)//問題の箇所1
{
return static_cast<hoge_t>(arg.num.num);
}
};
}//namespace MyNS

450 名前:449 mailto:sage [2009/08/11(火) 17:06:42 ]
Comeau C++でコンパイルOK
VC++2008で実行可能

だった。

451 名前:449 mailto:sage [2009/08/11(火) 17:16:19 ]
template<typename int_t>
class MyTempl;

この前方宣言は要らなかった。スマソ。

452 名前:449 mailto:sage [2009/08/11(火) 17:17:00 ]
namespace MyNS
{
//省略

template <typename hoge_t, typename boke_t>
hoge_t foo(const boke_t& arg);

template<typename int_t>
class MyTempl
{
public :

int_t num;

MyTempl(int_t n = 0) : num(n) {}


template <typename hoge_t>
friend hoge_t foo(const MyTempl<int_t>& arg)//問題の箇所1
{
return static_cast<hoge_t>(arg.num.num);
}
};
}//namespace MyNS


453 名前:428 mailto:sage [2009/08/11(火) 17:22:28 ]
>>449さん
その方法なら
テンプレートかつクラス内定義friend関数に
できるのですね。

ありがとうございます。


454 名前:428 mailto:sage [2009/08/11(火) 17:47:41 ]
>>449さんのコードを記しました。
ttp://codepad.org/xotYKfl3
g++ 4.4.0
VC++ 2008
Comeau C++
では通りましたが、
BCC5.5.1
では通りません。
まあどうせBCCが悪いのだろうとは思いますが。

BCC6.1.3をお持ちの方、試していただけませんでしょうか?

455 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 17:49:51 ]
struct { ... } var; という感じで名前のないクラス/構造体を作れると思いますが、
これにコンストラクタ/デストラクタを付けたいなら名前を付けるしかないですか。



456 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 17:51:28 ]
ということは、
>>446の言う逃げのコード(>>446のttp://codepad.org/yBp6Lo3p)
はbcc5.5.1ですら通る互換性の高いコードということか。

bcc5.5.1を見捨てるならどうでもいいんだろうけど。


457 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 17:52:29 ]
>>455
4章:クラス
ttp://www5c.biglobe.ne.jp/~ecb/cpp/04_15.html


458 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 17:56:08 ]
>>454
エラー E2015 codepad9.cpp 49: 'MyNS::double foo<double,MyNS::MyTempl<MyNS::MyInt> >(const MyNS::MyTempl<MyNS::MyInt> &) at codepad9.cpp:8' と
'MyNS::double foo<double>(const MyNS::MyTempl<MyNS::MyInt> &)' の区別が曖昧(関数 main() )

と出てしまいます

459 名前:428 mailto:sage [2009/08/11(火) 18:02:27 ]
>>458
ありがとうございます。
BCC6.1.3でも無理なようですね。

・・・ちなみに、
少し改変した
ttp://codepad.org/LQvoBRSP
g++ 4.4.0
VC++ 2008
Comeau C++
では通りましたが、
BCC5.5.1
では通りません。



460 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 18:10:33 ]
>>457
#include <cstdio>
class {
int foo;
public:
void func() {printf("Whee!:%d\n", foo);}
void set(int v) {foo = v;}
} bar;

int main()
{
bar.set(3);
bar.func();
return 0;
}
--
無事に実行できるけど?

461 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 18:11:59 ]
>>460
元質はコンストラクタ/デストラクタが作れるか聞いているのは判る?

462 名前:457 mailto:sage [2009/08/11(火) 18:12:22 ]
>>460
正直スマンかった。

463 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 18:17:56 ]
>>460
つまり、そのサイトはダメダメということで宜しいか?

464 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 18:34:44 ]
>>459
エラー E2015 codepad10.cpp 59: 'MyNS::double foo<double,MyNS::MyTempl<MyNS::MyInt> >(const MyNS::MyTempl<MyNS::MyInt> &) at codepad10.cpp:8' と
'MyNS::double foo<double,MyNS::MyInt>(const MyNS::MyTempl<MyNS::MyInt> &) at codepad10.cpp:38' の区別が曖昧(関数 main() )

となってやはりbcc6.1.3でも無理です

465 名前:428 mailto:sage [2009/08/11(火) 18:45:35 ]
>>464
Borlandはこのあたり伝統的に対応がおそいようですね。

ありがとうございます。





466 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 18:50:23 ]
template <typename T>
bool is_not_zero(const T& arg);
テンプレート引数T型はint型からT型へ暗黙のキャストが可能なものを選ぶとするとき、
operator!=(const T&, const T&)が定義されていれば
template <typename T>
bool is_not_zero(const T& arg)
{return arg!=static_cast<T>(0);}
とし、定義されていないならoperator==(const T&, const T&)を利用して
template <typename T>
bool is_not_zero(const T& arg)
{return !(arg==static_cast<T>(0));}
とする。
こんな方法は可能でしょうか?
可能でしたらご教示ください。


467 名前:デフォルトの名無しさん [2009/08/11(火) 18:56:51 ]
今朝来たMSDNのメールて、 【64 ビット プログラミング ガイド日本語版を公開中!】 次世代 Windows 環境に備えよう
なんてのが届いたので、みていたら。
int i1 = -2;
unsigned int i2 = 1;
char *s = "Hello";
printf("%s", s + 1 + (i1 + i2));
このコードは32ビットなら動くけれども、64bitだと修正しろとあります。
ぱっと見た目変なところはなさそうにみえるのですが・・・
1.int が 64bit → 問題なし
2.int/unsigend は 32bit で64bit int にキャストされる → 問題なし
3.int + unsigned = unsigned → 0x000000000ffffffffL になるから?
 なんで long int になんねーんだよwなのだろうか?

64bitもっている人誰かいたら解説ください。

468 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 19:00:50 ]
そんな不気味なコード書かないだろうたぶん
たしかWindowsはlongも32ビットだから、size_tやptrdiff_tを使わないとだめなんじゃ?

469 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 19:40:33 ]
printfの行がキモすぎるwww
たぶんポインタまわりのことを言いたいんだと思うが。

470 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 19:41:28 ]
windowsはLLP64だから
i1 + i2 -> unsigned int (0xffffffffU:32bit)
s + 1 -> char* (64bit)
s + 1 + (i1 + i2) -> s + 1 + 0x000000000ffffffffULL

何ビットだろうがそんなコード書くな

471 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 21:14:40 ]
もっと他のまともな例があった気がする。
どこで見たっけな。

472 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 21:45:42 ]
class
{

class testのメンバ変数hogeを返す場合
以下の定義で何が違うのでしょうか?

inline const Hoge getHoge(...)
const Hoge & getHoge(...)
Hoge getHoge(...)

473 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 21:48:28 ]
VC++2005だとこんなコードを32bitでコンパイルしても64bit移植性警告出るね。
char* s="hello";
int a=reinterpret_cast<int>(s);


474 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 21:49:20 ]
>>473
ああそれ鬱陶しかったよね。
2008にして良かった。

475 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 22:37:46 ]
>>474
鬱陶しいなら警告切ればいいだけだと思うのだけど……。
デフォルトで、2005はオン、2008はオフというだけなのだから。



476 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 23:04:41 ]
>>473-474
妥当な警告じゃないの?
intptr_t とか、適切なサイズの整数を使えって意味で。

477 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 23:09:42 ]
>>476
32bitでコンパイルする場合に出るんだよ。
まあ、10年は32bitの時代だね。

478 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 23:22:17 ]
>>444
それはたぶん、暗黙の型変換とごっちゃになってるんじゃ…

479 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 23:33:54 ]
>>477
何ビットだろうが、ポインタと int のビット数の大小を決め付けてるのはおかしいってことね。

480 名前:デフォルトの名無しさん mailto:sage [2009/08/11(火) 23:49:33 ]
>>472
inline const Hoge getHoge は、
 - 戻ってくるときにHogeのコピーコンストラクタが呼び出される
 - 戻ってきたHogeの非constメンバ関数は呼べない

const Hoge &getHoge は、
 - 戻ってくるときにHogeのコピーコンストラクタは呼び出されない
 - 戻ってきたHogeの非constメンバ関数は呼べない

Hoge getHoge は、
 - 戻ってくるときにHogeのコピーコンストラクタが呼び出される
 - 戻ってきたHogeのメンバ関数は全て呼べる

481 名前:デフォルトの名無しさん mailto:sage [2009/08/12(水) 00:25:09 ]
クラスのデストラクタがvirtualではないクラス
を継承する安全な方法はないですよね?

482 名前:デフォルトの名無しさん mailto:sage [2009/08/12(水) 00:28:38 ]
boost::shared_ptrを使うと、デストラクタがvirtualじゃなくても適切なデストラクタが呼び出される
はず

483 名前:デフォルトの名無しさん mailto:sage [2009/08/12(水) 00:35:33 ]
protected継承にする。

484 名前:デフォルトの名無しさん mailto:sage [2009/08/12(水) 02:08:51 ]
>>457
そのリンク先の
> out.num1 = 10;
という使い方を初めて知った。これって合法なのかな
無名構造体のメンバを作ってそれ経由しかしたことなかった(>>460の方法)

485 名前:デフォルトの名無しさん mailto:sage [2009/08/12(水) 09:39:03 ]
>>484
無名クラスはスルーできるみたいよ。
例えばgccだと`int OuterClass::<anonymous class>::num1'と解釈するみたい。
つーか、>460の型名のないクラスは無名クラスとは呼ばないのかな?
言葉の定義は誰か詳しい人よろしく。



486 名前:デフォルトの名無しさん mailto:sage [2009/08/12(水) 16:53:23 ]
                  `丶´ ̄ ̄ '' ‐- - - - ァ
             /)ヾ  /  /ア|      ,, -‐ '' /
            ///)::/\/ /'  |∧ヾ    `丶  /
          /,.=゙''"//::_/        ',   ミ  /
   /     i f ,.r='"-‐'つ/  \   /  i  ::l  /
  /      /   _,.-‐'~ :::} f:(_)ヽ   .r(_)、l :::l  ',   こまけぇこたぁいいんだし!!
  .   /   ,i   ,二ニ⊃..::ノ {O:c::j    {::c::::}| :::|  ヽ
    /    ノ    il゙フ | :/:::{ `ー´.._, 、__ ー ´| :::|  ;;\ゞ
      ,イ「ト、  ,!,!ヽ、|/レ小、.   {  _ノ   ノ :/|/ヾ、l
      / iトヾヽ_/ィ" ヽ..、_r-ヾ¨ TE_ァ ヾ´V |/


487 名前:デフォルトの名無しさん mailto:sage [2009/08/12(水) 16:54:16 ]
誤爆した
すまん

488 名前:デフォルトの名無しさん mailto:sage [2009/08/12(水) 16:54:49 ]
池田ァ!!

489 名前:デフォルトの名無しさん mailto:sage [2009/08/12(水) 17:46:01 ]
まさかム板でこまけぇこたあAAしかも池田かよw

490 名前:デフォルトの名無しさん mailto:sage [2009/08/12(水) 18:04:22 ]
そんなやつは絶対プログラミングできないなw

491 名前:デフォルトの名無しさん mailto:sage [2009/08/12(水) 19:09:52 ]
>>487
                  `丶´ ̄ ̄ '' ‐- - - - ァ
             /)ヾ  /  /ア|      ,, -‐ '' /
            ///)::/\/ /'  |∧ヾ    `丶  /
          /,.=゙''"//::_/        ',   ミ  /
   /     i f ,.r='"-‐'つ/  \   /  i  ::l  /
  /      /   _,.-‐'~ :::} f:(_)ヽ   .r(_)、l :::l  ',   こまけぇこたぁいいんだし!!
  .   /   ,i   ,二ニ⊃..::ノ {O:c::j    {::c::::}| :::|  ヽ
    /    ノ    il゙フ | :/:::{ `ー´.._, 、__ ー ´| :::|  ;;\ゞ
      ,イ「ト、  ,!,!ヽ、|/レ小、.   {  _ノ   ノ :/|/ヾ、l
      / iトヾヽ_/ィ" ヽ..、_r-ヾ¨ TE_ァ ヾ´V |/

492 名前:デフォルトの名無しさん mailto:sage [2009/08/12(水) 20:16:59 ]
C++でシステム毎に定義された円周率の値を求めることは出来ますか?
例えばnumeric_limitsの様な感じで。

493 名前:デフォルトの名無しさん mailto:sage [2009/08/12(水) 20:25:39 ]
>>487
486を除く
このスレ書き込み自己申告して下さい。


494 名前:デフォルトの名無しさん mailto:sage [2009/08/12(水) 20:28:30 ]
>>492
#include <cmath>
M_PI
とか?


495 名前:486 mailto:sage [2009/08/12(水) 20:32:17 ]
誤爆した
すまん



496 名前:デフォルトの名無しさん mailto:sage [2009/08/12(水) 20:41:10 ]
円周率定数は標準にはないので
2*asin(1)でも使うといい

497 名前:デフォルトの名無しさん mailto:sage [2009/08/12(水) 20:45:24 ]
>>496
それって毎回計算されたりするの?

498 名前:492 mailto:sage [2009/08/13(木) 00:24:02 ]
ありがとうございます。
両方とも考慮していきます。

499 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 06:37:53 ]
x87ならFLDPI命令呼びたいよなー。

500 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 08:42:49 ]
#include <stdio.h>

int main(void)
{
double d;

__asm {
FLDPI
FSTP [d]
}

printf("%16.15f\n", d);

return 0;
}

3.141592653589793

501 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 09:58:26 ]
2.0*asin(1.0)をFLDPIにしてくれるコンパイラが欲しいゾ

502 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 10:20:24 ]
幾つかpieを計算する関数を試してみた。
処理時間は概ね、acos(-1) > asin(1) * 2 >> atan2(0, -1)になった。

503 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 10:27:25 ]
>>502
興味深い結果だ。

504 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 11:27:17 ]
環境を変えたら入れ替わったりするんだろうか?

関数呼び出しのオーバーヘッド分とか
2倍する演算の分とかその辺の差のような気がする。

505 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 11:32:44 ]
調査している人がいてもおかしくない気もするが。
とりあえずdoubleに限るなら
#IFDEFでM_PIがあるかどうかで分けるのが正解な気がしますが。



506 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 12:25:19 ]
>>502
それって本当に「時間」?

507 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 12:27:49 ]
ぐぐると6*asin(0.5)ってのがよく出てくるけどこの方がいいのかな

508 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 12:33:08 ]
結果定数なんだから定数で置き換えてくれればいいのに。
そういうのをコンパイラに伝える機能って新しく追加されたりしないんだっけ?
javaだったかな。

509 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 12:34:48 ]
constexprっていうまさにそういう機能がC++0xで追加されるよ

510 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 12:35:51 ]
thx

511 名前:502 mailto:sage [2009/08/13(木) 12:36:11 ]
>>506
はいな、時間だよ。勿論、atan2(0, -1) >>>>> 定数 だろうけれど。
因みに、gccはpow(2, -23)とかは定数にしてくれるけど>502はM_PIにもfldpiにもならなかった。
尤も、fld1も使う場合と使わない場合があるようだけど。

512 名前:466 mailto:sage [2009/08/13(木) 12:51:27 ]
確かに、πを数値計算する場合、
asin(x)のテイラー展開(正確にはマクローリン展開)が一番自然で、
しかも誤差の項にx^nがかかるため
asin(1)よりもasin(0.5)の方が圧倒的に収束は速いと考えられますね。

そのため6*asin(0.5)が良いという可能性はありますよね。


ところでどなたか
>>466
をお答えいただけませんでしょうか?

513 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 14:18:09 ]
Cの関数を使わず直接FPUを叩いてみた

結果は>>502と同じ
というか、ソースを見てもらうとわかるが、acosを求めるのに一番
手間がかかり、次はasinであり、atanはfpatan一発で求まるので
一番簡単なので結果は予測できる

kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9897.txt

ここにソースを置いておく
>>502と違う結果が出た人がいたら環境を教えて欲しい

514 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 14:23:35 ]
C++と関係ない話は他でやれ

515 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 14:25:46 ]
別にこれ位いいだろ
>>504の疑問に答えただけだ



516 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 14:31:29 ]
ご教示願います。

詳説C++ではデストラクタは継承されないとあります。
Accelerated C++では仮想デストラクタは継承されるとあります。

非仮想のデストラクタは継承されない。
仮想デストラクタは継承される。

という認識で正しいでしょうか?

517 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 14:33:52 ]
So death.

518 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 14:43:20 ]
>>516
「継承される」ってどういう状態のこと言ってんの?

デストラクタは必ず派生クラスで再定義されるから、普通のメンバ関数や
メンバ変数みたいに基底クラスのものがそのまま使われるってことは無いよ。

あ、少なくとも言語仕様上はね。派生側で追加の処理が無ければまったく
同じ関数が走るようにコンパイルされることは考えられる。

でも、これは virtual 付いてようが付いてなかろうが同じ話。

519 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 15:01:08 ]
>>512 メンバ関数(演算子)の有無で切り替えたいというのなら、C++はできなかったと思う。
その代わり、関数の有無を継承したクラスで示すタグディスパッチという手法がある。
class EQ_tag{};//==があることを示すタグのクラス
class NE_tag{};//!=があることを示すタグのクラス
class A :public EQ_tag
{
public:
bool operator==(int val)const{return val==3;};
};
class B :public NE_tag
{
public:
bool operator!=(int val)const{return val!=3;};
};

template<class T>bool _isEQ(const T& s,int val,const EQ_tag&){return s==val;}
template<class T>bool _isEQ(const T& s,int val,const NE_tag&){return !(s!=val);}
template<class T>bool isEQ(const T& s,int val){return _isEQ(s,val,s);}// この第3引数で切り替える。

int _tmain(int argc, _TCHAR* argv[])
{
A a;
B b;
isEQ(a,3); //==が呼ばれる
isEQ(b,3); //!=が呼ばれる
return 0;
}


520 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 15:06:26 ]
>>517
>>518
結局、基底クラスのデストラクタを仮想にしておけば

・派生クラスのデストラクタ
・基底クラスのデストラクタ

がこの順番で呼び出されるので納得しました。


521 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 15:08:22 ]
>>520
仮想で宣言した場合としていない場合、
どう違うか
たぶん理解してないよ、それ。

基底クラスのポインタにキャストしてdeleteした場合について
限定しているわけじゃないでしょ?

522 名前:466 mailto:sage [2009/08/13(木) 15:10:29 ]
>>519
タグディスパッチとは、
input_iterator_tag
forward_iterator_tag
bidirectional_iterator_tag
random_access_iterator_tag
output_iterator_tag
と同じような物でしょうか?

523 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 15:14:36 ]
template <class T>
class Hoge
{
T val;
//詳細が続く。
}
こんなTクラスのラッパクラスであるHogeに対して、
hoge->T方向のキャスト演算子をオーバーロードしたいのですが、
const operator T()const{return val;}
operator T(){return val;}
のような2通りのバージョンを用意すべきでしょうか?
それとも上の1つだけにした方が望ましいですか?

524 名前:523 mailto:sage [2009/08/13(木) 15:16:12 ]
正しくは
operator const T &()const{return val;}
operator T &(){return val;}
かもしれません。
参照をいまいち理解出来ていなくて。。。

525 名前:519 mailto:sage [2009/08/13(木) 15:18:09 ]
>>522
うん



526 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 15:21:55 ]
参照でない(コピーを返す)なら、const版だけでいい
参照を返すなら、valを変更されてもよければ2つとも用意する
valを変更されたくなければconst版だけ

527 名前:466 mailto:sage [2009/08/13(木) 15:22:22 ]
>>525
ありがとうございます。
そのあたり、もっと勉強してきます。

528 名前:523 mailto:sage [2009/08/13(木) 15:27:36 ]
>>526
valはHogeのプライベートメンバなのですが、

T型へのキャストでvalを変更可能にするのとしないのと、
クラス設計としてはどちらが望ましいとかはありますか?


529 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 15:32:01 ]
そのラッパクラスの目的、どういう利用方法を想定しているかによる

530 名前:デフォルトの名無しさん [2009/08/13(木) 15:41:16 ]
なるほど、一概には言えませんということですか。
ありがとうございました。


531 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 16:32:09 ]
class hogeのインスタンスメソッドbokeをthreadや、
APIのコールバック設定関数の引数void (*arg)(void)に渡したいんですが、どうすればいいでしょうか?
頼みのboost.bindやfunctionも、boost内部のクラスで定義され、void (*arg)()にキャスト不可能でした

532 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 16:38:01 ]
APIのコールバック関数は大抵void*のパラメータを渡せるようになってるはずなので、
それ使ってthisを渡してstatic関数経由で呼べばいいと思います

533 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 16:39:09 ]
      - -―- 、
    /...::::::::::::::.. ヽ
  / ..:::::::::::::::::::/\ ヽ
  /..:::/::::/::::// ヽ l:. l.
  l:::::!::::/●)  (●)|:: |
.  !:::l::::l///  ,, ///l:i:l  ェェエエ工工
  ヽ:i::!、 r ― ァ ノノ'     
    ` l\`ー './
   ノヽ \_フ.ヽ
   |_ 丶   ヽ
.   | |' 初心者)


534 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 16:47:14 ]
>>521
いえ大丈夫です。
ありがとうございます。

535 名前:531 mailto:sage [2009/08/13(木) 16:47:58 ]
>>532
が、できたら苦労はないんですけど、
引数void (*arg)(void)からわかる通り、指定できるコールバック関数の引数が0個なんですよ…
なので、クラスメソッド→インスタンスメソッド経由だと、インスタンスのアドレスもわからないですし
複数のインスタンスを扱う事を考えるとグローバル変数も使えずで…途方に暮れてます



536 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 16:58:49 ]
じゃあ、適当に10個くらいコールバック関数を用意して、
どのオブジェクトがどのコールバック関数を使用中か管理して、
空いてるコールバック関数を使う
一杯だったらリソース不足ってことにしてあきらめる

CPUが決まってるなら、実行時に各オブジェクト用のコードを
その場で生成するっていう手もないこともない・・・

537 名前:531 mailto:sage [2009/08/13(木) 17:18:23 ]
>>536
そうですね…、やはり管理クラスを別で作るしかなさそうな感じです。
コールバックごときに時間も掛けてられないので、この仕様で行こうと思います。
ありがとうございました。

538 名前:519 mailto:sage [2009/08/13(木) 18:02:35 ]
>>535
プライベートなスタティック変数を経由する。



539 名前:デフォルトの名無しさん [2009/08/13(木) 19:07:06 ]
複数のグローバル変数を1つのclassで包めば安全度あがる?

540 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 19:15:11 ]
オブジェクトとして扱うなら

541 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 19:15:27 ]
あがりません。
グローバル変数のまずい点の一つは
密結合であるということだからです。

542 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 20:47:43 ]
安全度ってものが何を意味するか微妙だけど、
とりあえず何の名前空間にも含まれていないグローバル変数が
複数あるならその段階でコードがクソ設計である可能性は高い。
・・・って誰もこんな事聞いてないか。


543 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 21:26:18 ]
MapDataというマップダータの変数があるとして
マップ描写、当たり判定、キャラなどのクラスからアクセスがあるなら
グローバル変数以外にどう実装すればおk?

全部ひとつのクラスで包めばいいかもしれないが
それぞれのクラスにMapDataを渡すとなれば引数が多くなりスマートにならないんじゃね

544 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 21:33:05 ]
今日はじめてC++の文法解説サイトを読みました。
C++というか構造体++に見えてしまうんですが、
オブジェクト指向とか仰々しい名前が付いててこんなもんですか?

545 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 21:34:28 ]
>>544
継承と仮想関数があってもですか?



546 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 21:39:25 ]
オブジェクト指向なんて今時珍しくもなんともないだろ

547 名前:デフォルトの名無しさん mailto:sage [2009/08/13(木) 21:39:44 ]
テンプレート超楽しい






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

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

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