■過去ログ置き場に戻る■ 1- 前250 次250 最新50


[memo] "9999999999_00.html#R20" という感じで、URLの最後に "#RレスNo" を追加すると幸せになれます。

C++相談室 part47
501 名前:デフォルトの名無しさん :2006/03/03(金) 15:57:56
このスレに書いたからだろw

502 名前:デフォルトの名無しさん :2006/03/03(金) 16:45:00
std::exceptionやstd::runtime_error等の例外クラスの
wchar版はなぜ提供されないのでしょうか?
std::wexceptionとかstd::wruntime_errorとか

503 名前:デフォルトの名無しさん :2006/03/03(金) 17:30:43
>>502
俺はwcerrなんかのワイド文字ストリームがマルチバイト文字へ変換する仕様だからだと思っている。
その変換処理の最中に例外を投げたくなるようなことになったら、どうしようもなくなるだろうと。

504 名前:デフォルトの名無しさん :2006/03/03(金) 18:03:36
単純に、例外の中で例外を投げればって思った俺は駄目ですか?

505 名前:503 :2006/03/03(金) 18:34:00
>>504
俺は例外が発生している最中に例外が投げられることを問題に思っているのではなく、
エラーメッセージが表示できないことだと思っている。

もちろん画面への表示という行為も失敗するかもしれないけどさ。


506 名前:デフォルトの名無しさん :2006/03/03(金) 20:57:48
>>502
wchar_t 版がない理由は知らんが、char版でもUTF-8をブチ込むことは許されてるからそれで我慢汁カウパー。

507 名前:デフォルトの名無しさん :2006/03/04(土) 00:28:50
コンストラクタ は、protectedに,
デストラクタは、virtual で public に
というクラス定義がありますが、これは
どういう理由でこのようにしているのでしょうか?

508 名前:デフォルトの名無しさん :2006/03/04(土) 00:33:03
>>507
インターフェースとして使うように設計されていて、
実際に new などで生成されるのは派生クラスだけ
ということが想像できるが、作った奴に聞いてコメント書かせるのが正解。

509 名前:デフォルトの名無しさん :2006/03/04(土) 00:33:19
>>507
継承して使え。と書いた人が主張している。

510 名前:デフォルトの名無しさん :2006/03/04(土) 00:34:14
>>507
コントラはそのクラス変数の作成時に呼ばれる関数だから
作成されていないのに外部から勝手に呼ばれたら困る。だからプロテク。
デストラはそのクラス変数が破棄されるときに呼ぶものだが
途中で破棄したい場合に外部から呼ぶため。だからパブリ。

511 名前:デフォルトの名無しさん :2006/03/04(土) 00:35:36
>>510 キモイ

512 名前:デフォルトの名無しさん :2006/03/04(土) 00:59:17
static なメンバ関数内で new するというパターンなんかもあるよ。

513 名前:デフォルトの名無しさん :2006/03/04(土) 01:12:05
>>512
事前条件が厳しいときのファクトリーパターンであってますか?


514 名前:デフォルトの名無しさん :2006/03/04(土) 01:20:45
>>512
それだとコンストラクタは private だろ。

515 名前:デフォルトの名無しさん :2006/03/04(土) 01:56:15
もしかして、時代はwchar_tが普通で、
const char *とか書いてる自分は駄目なんじゃないか
と怖くなる今日この頃、皆様はいかがお過ごしでしょうか?

516 名前:デフォルトの名無しさん :2006/03/04(土) 02:21:47
vc8からはデフォルトでwchar_tだしな(UNICODE, _UNICODE)

517 名前:デフォルトの名無しさん :2006/03/04(土) 03:38:58
まだ使ったこと無いんだけど、vc8ではsizeof(wchar_t)っていくつなの?

518 名前:デフォルトの名無しさん :2006/03/04(土) 03:40:42
( ゚д゚)ポカーン

519 名前:デフォルトの名無しさん :2006/03/04(土) 08:36:01
>>517
WindowsがUTF-16を使っているので、Windowsの処理系ではまず間違いなくsizeof (wchar_t)は2です。

520 名前:デフォルトの名無しさん :2006/03/04(土) 13:08:53
>>519
さんくす。

sizeof(wchar_t)を4にするオプションがないかと期待したんだけど。
wchar_tを使っても可変長エンコーディングからは逃れられないのか。


521 名前:デフォルトの名無しさん :2006/03/04(土) 14:10:37
>>520
仕様:「本ソフトウェアはサロゲートペアに対応していません。将来的にも対応する気はありません。」

522 名前:デフォルトの名無しさん :2006/03/04(土) 14:55:52
>>519-520
確か、CodeWarriorなら Windows でも 4 == sizeof(wchar_t) だよ。

523 名前:デフォルトの名無しさん :2006/03/04(土) 16:00:14
>>521
サロゲートペアが理解できないユーザーからクレームが来るくらいなら、
可変長エンコーディングを我慢したほうが精神衛生上良いかと。

>>522
クロス開発環境だからWindowsアプリは作れないけど、ってオチ?


524 名前:デフォルトの名無しさん :2006/03/04(土) 16:49:18
>>522
フツーにWindowsアプリが作れますがなにか?

525 名前:デフォルトの名無しさん :2006/03/04(土) 16:58:56
>>524
ttp://www.metrowerks.co.jp/information/2005/info0323.html

526 名前:デフォルトの名無しさん :2006/03/04(土) 17:10:21
>>525
いや、そんくらい知ってるって。

527 名前:デフォルトの名無しさん :2006/03/04(土) 17:29:40
販売終了、サポート終了の製品を紹介されて、どうすれば?


528 名前:デフォルトの名無しさん :2006/03/04(土) 23:48:49
おまいら書くとき何使ってる?
俺まぢでメモ帳。

529 名前:デフォルトの名無しさん :2006/03/04(土) 23:50:34
>>527
そんなのもお構いなしで押し付けるのが信者という物です。

530 名前:デフォルトの名無しさん :2006/03/05(日) 00:22:16
>>528
xyzzy。とても快適。

531 名前:デフォルトの名無しさん :2006/03/05(日) 00:24:16
>>528
VSのIDEマンセー!
まあ、もうすこしインテリセンスがインテリになればいいんだけど。

532 名前:デフォルトの名無しさん :2006/03/05(日) 00:27:34
簡単な実験をするときはxyzzyで書いてcl
普段はVSのIDE
味気ないなぁ

533 名前:デフォルトの名無しさん :2006/03/05(日) 00:29:37
VS8重すぎ・・・
ファイル閉じるのに5秒くらいかかるよ・・・
複数ファイル一気に閉じると1分以上待たされる

というわけで、xyzzyに一票

534 名前:デフォルトの名無しさん :2006/03/05(日) 00:33:18
流石に1分はまたないが、起動と終了に時間が掛かる。

535 名前:デフォルトの名無しさん :2006/03/05(日) 00:37:30
2005は糞重いね

536 名前:デフォルトの名無しさん :2006/03/05(日) 00:39:09
ただ、2回目からの起動が2003に比べて早くなってるね。
逆に言えばメモリに常駐してる部分が大きいってことかね。

537 名前:デフォルトの名無しさん :2006/03/05(日) 00:41:53
>>536
ハァ?

ドトネトで、ネイティブコードのキャッシュが残るから、
二回目から起動が早くなるんだろう。

538 名前:デフォルトの名無しさん :2006/03/05(日) 01:16:24
急ぎ働きのときはcat、
ちょっと編集するときはvi、
腰据えて作業するときはXyzzy、
他人に見せるときは桜エディタ。

539 名前:デフォルトの名無しさん :2006/03/05(日) 01:24:55
スレ違いの流れに疑問を口にしないお前らに失望

540 名前:デフォルトの名無しさん :2006/03/05(日) 01:25:45
>他人に見せるときは桜エディタ。
なぜなんだか、とても気になる

541 名前:デフォルトの名無しさん :2006/03/05(日) 01:27:27
>>539
そうだよな
お前らマでやれよ

emacs

542 名前:デフォルトの名無しさん :2006/03/05(日) 01:33:22
ワロスww

543 名前:デフォルトの名無しさん :2006/03/05(日) 01:58:12
>>539
だって過疎化が進んで寂しんだもん。

544 名前:デフォルトの名無しさん :2006/03/05(日) 02:00:12
std::mem_fun()の使い方が今一よく判らん。
って話はSTLスレ向きかな。


>>540
Xyzzyはフォントを小さくしているしタブや2バイト空白が見える設定にしているから
他人には(特に老眼入ってる連中には)激しく読みにくいらしいから。
どうせ普段使わないからってことで、キーワードの色付けも自分の好みよりも派手にしてある。

545 名前:デフォルトの名無しさん :2006/03/05(日) 05:59:12
ある構造体型が定義されているのですが、
そこには

typedef struct tagStructName : public tagHogehoge{ /* tagHogehogeは構造体です */

public:
tagStructName(){};

void memberFunction();
}

などとありました。構造体の継承?何それって状態なんですが
考え方としてはクラスと同じ考え方でいいんですか?

546 名前:デフォルトの名無しさん :2006/03/05(日) 06:02:15
良い

547 名前:デフォルトの名無しさん :2006/03/05(日) 06:03:32
おk






すみませんでした

548 名前:デフォルトの名無しさん :2006/03/05(日) 13:03:20
産みの親の発音を教えて

549 名前:デフォルトの名無しさん :2006/03/05(日) 13:28:28
そんな無理に話題作らなくてもいいから

550 名前:デフォルトの名無しさん :2006/03/05(日) 13:43:43
>>548
釣られておく。
ttp://public.research.att.com/~bs/bs_faq.html#pronounce

551 名前:デフォルトの名無しさん :2006/03/05(日) 14:09:10
テンプレの[禿 Stroustrup]ってのみて
秀丸の人が開発者コミュニティでも作ったのかなと思ったじゃねーか

552 名前:デフォルトの名無しさん :2006/03/05(日) 14:54:56
>>551
たった今>>5のページ初めて開いて禿の意味がわかったwww

553 名前:デフォルトの名無しさん :2006/03/05(日) 15:11:24
ちなみに他には
ハーブサッター=髭
メイヤーズ先生=ふさふさ
と言われている
覚えておくといいぞ

554 名前:デフォルトの名無しさん :2006/03/05(日) 16:48:17
質問です。XP、VS8 です。

変数が静的か動的かを調べる方法はないでしょうか?
具体的には、以下のようなことがしたいと思ってます。

list<int *> List;

// 静的な変数を追加
int a=0;
List.push_back(&a);

// 動的な変数を追加
int* b = new int(0);
List.push_back(b);

// 全開放
list<int *>::iterator itr;
for (itr=List.begin(); itr!=List.end(); itr++) {
 if ( (*itr) が動的に確保された変数 )
  delete (*itr);
}

List.clear();

よろしくお願いします。

555 名前:デフォルトの名無しさん :2006/03/05(日) 16:49:15
標準にはないな。

556 名前:554 :2006/03/05(日) 17:15:41
設計を見直すしかないでしょうか・・・。
ありがとうございました。


557 名前:デフォルトの名無しさん :2006/03/05(日) 17:20:12
そんなことしたくなる状況がわからん

558 名前:デフォルトの名無しさん :2006/03/05(日) 17:28:42
>>554
動的な変数へのポインタのみを保持したコンテナをListとは別に作って
deleteはそちらのコンテナのイテレータを介して行うとか?


559 名前:デフォルトの名無しさん :2006/03/05(日) 17:41:23
すみませんが少々お力添えをいただけますでしょうか。

コンパイラはVC8で, cl code.cppとコンパイルしています。

現在とある画像ファイル形式(パレット方式、\0をランレングス圧縮)を
BMPに変換するコードを書いているのですが、

byte *cdata = new byte[ihead.length];

ifs.read(reinterpret_cast<char*>(cdata),ihead.length);

if(!ifs){
  cout << "file read failed" << endl;
  return 0;
}
string data = Decode(cdata,ihead); // \0をデコード

delete[] cdata;

この流れで ihead.length==655 にもかかわらず、
ifs.tellp() で読み込みバイト数を調べると、 7000 バイトも読み込んでいるようなのです。
Decode 内で cdata を全て表示させて、ファイルと比較してみたところ、
読み込み位置が 639 バイト目から突然 4000 バイト以上後方にジャンプしていました。

seekg したわけでもないのに read 中にファイル読み込み位置がずれることはあるんでしょうか。


560 名前:デフォルトの名無しさん :2006/03/05(日) 17:42:10
>>554
operator new / deleteのオーバーライドで
ヒープオブジェクトの一覧を作っちゃうとか。

まあ、そこまでするのもあれだけど。

561 名前:デフォルトの名無しさん :2006/03/05(日) 17:44:16
>>554
おとなしいところで、フラグを使うとか。

typedef pair<bool/* dynamic? */, int *> flag_ptr;
list<flag_ptr> List;

// 静的な変数を追加
int a=0;
List.push_back(flag_ptr(false, &a));

// 動的な変数を追加
int* b = new int(0);
List.push_back(flag_ptr(true, b));

// 全開放
list<flag_ptr>::iterator itr;
for (itr=List.begin(); itr!=List.end(); itr++) {
 if (itr->first)
  delete itr->second;
}

List.clear();


562 名前:デフォルトの名無しさん :2006/03/05(日) 17:44:53
>>559
バイナリモードで開いてないとか

563 名前:デフォルトの名無しさん :2006/03/05(日) 17:45:36
>>560
Effective C++だとそれだったな。
>>559
画像ファイル等等の話は余計じゃね?


564 名前:559 :2006/03/05(日) 17:50:03
>>562
お早い返信ありがとうございます。
std::ios::binaryを指定したら、嘘のように成功しました。
お騒がせしました。

>>563
お恥ずかしながら、原因がまったく見当がつかなかったので……。
今思うと処理の内容は関係なかったですね。申し訳ありませんでした。


565 名前:デフォルトの名無しさん :2006/03/05(日) 18:02:44


VisualStudio.NET ATL/WTL で開発しています。

バイナリから、JScriptの関数を呼びだすコードを書いております。
関数の呼び出しはできるのですが、JScript上の関数に引数を渡さなければいけない
場合に、どのように渡せばよいかわからないことがあります。

現在はまっているのは、JscriptのArray型です。
SAFEARRAY で CComVariantに渡してみましたが、

JScript上の関数内で、Arrayのlengthプロパティを使用できませんと
言われてしまいます。

この場合は、どのように渡せばよいのでしょうか?
また、 参考になるようなページはありませんでしょうか?

JScriptの関数呼び出しには、Invokeを使用しています。

よろしくおねがいします。

566 名前:デフォルトの名無しさん :2006/03/05(日) 18:33:23
なんでスレ違いに気がつかないかな。
http://pc8.2ch.net/test/read.cgi/tech/1134388951/

567 名前:565 :2006/03/05(日) 19:30:23
すみません。 ATL/WTL スレに書いてきます。

568 名前:デフォルトの名無しさん :2006/03/05(日) 21:37:45
ある class A があります
この class を引数で受け取る関数があります

void func( const set< A >& va );

この関数の中で、それぞれのAのインスタンス用に一時的な記録領域を設けたいんです。
引数にはconstで受け取りますから、class定義に含めることは出来ません。
解法として2つ考えたんですが、どっちもベストな方法には思えません。
皆さんならどう実装しますか?

1. mapを使う
map< A*, A_Temp > tempMap;
A_Temp at = *temp.find( &*va.begin() ).first;

2. class A に作業領域を含める
class A{
public:
void* pTemp;
...};

A_Temp at = (A_Temp*)va.begin()->pTemp;

569 名前:デフォルトの名無しさん :2006/03/05(日) 21:48:49
>>568
func内で完結するデータなら1。
Aのインスタンスのある限り必要なデータなら2。

1だとしたらポインタでなくconst_iteratorをキーにすればよいと思う。

570 名前:デフォルトの名無しさん :2006/03/05(日) 21:52:38
>Aのインスタンス用に一時的な記録領域
この意味がわからないんだが。具体的な例きぼん。

571 名前:デフォルトの名無しさん :2006/03/05(日) 22:12:35
>>569
例えば、funcの中で、AとTempAの情報を受け取るfunc1を呼ぶとすると
func1の定義は以下のようになってしまい、なんだか複雑さが伝播してしまいます。
元々の設計が悪いのでしょうか?

void func1( const set< A >& va, map< A*, A_Temp >& tempMap );

>>570
何でもいいんですが、例えばプリンタの情報を収めるクラスがあるとします。

class Printer;

void main(){

Printer p;

// ユーザがPrinterオブジェクトに対しいろいろな操作を行う
p.set_XXX();
p.method_XXX();

// ・Printerの集合を受け取るfunc関数があるが
// この関数は、Printerに対し直接的な変更を加える訳ではないので
// const属性で受け取りたい
// ・内部では、ソートなど集合に対し操作を行うので
// 個々のインスタンスに関連付けされた領域が必要
set< Printer* > setp;
setp.insert( &p );
func( setp );

};
 


572 名前:デフォルトの名無しさん :2006/03/05(日) 23:08:28
class PrinterWithSomeInfo{
public:
PrinterWithSomeInfo(const Printer *printer) : printer_(printer) {}
const Printer *getPrinter() const {return printer_;}

private:
const Printer *printer_;

[その他必要ないろいろ]
};
のsetを渡すとか。


573 名前:デフォルトの名無しさん :2006/03/05(日) 23:33:56
void func(const set<A>& va);
じゃなくて
void func(set<const A>& va);
にしたいって話?

574 名前:デフォルトの名無しさん :2006/03/05(日) 23:53:55
>>572
それでいってみます。
ありがとうございます。

>>573
そうですね、
その他いろいろ間違ってます。
こういう適当な性格なんで、PGには向いてないです。

575 名前:デフォルトの名無しさん :2006/03/05(日) 23:54:59
ソートしたいだけなら、それでおkな気がするね。


576 名前:デフォルトの名無しさん :2006/03/06(月) 00:02:47
すみません。
試す前に聞いておきたいのですが、

テンプレートな、可変引数の関数というのは作れるのでしょうか?

template <typename T>
void func(T t, ...)
{

577 名前:デフォルトの名無しさん :2006/03/06(月) 00:03:39
>>576
それ、そのまんまでなにも問題はありませんが、なにか?

578 名前:デフォルトの名無しさん :2006/03/06(月) 00:04:33
> 試す前に聞いておきたいのですが、

シネヨ

579 名前:576 :2006/03/06(月) 00:04:40
>>577
作れるのですか。
ありがとうございます。早速試します。

580 名前:デフォルトの名無しさん :2006/03/06(月) 00:10:00
(゚д゚)

581 名前:デフォルトの名無しさん :2006/03/06(月) 00:15:09
(゚ д ゚)

582 名前:デフォルトの名無しさん :2006/03/06(月) 00:16:23
ヘッダファイルで

template<typename T>
class A {
void func(const T& );
}

のように宣言したメソッドfuncをcppファイルで実装しようとするとうまくいかないんだけど、
そもそもできないものだったりします?

template<T>
void A<T>::func(const T& ){}
だと、外部からコールしたときに
外部参照が未解決だとコンパイラに怒られてしまう。


583 名前:デフォルトの名無しさん :2006/03/06(月) 00:18:45
他でも使うtemplateは全部ヘッダに書きなされ

584 名前:デフォルトの名無しさん :2006/03/06(月) 00:20:26
>>582
標準仕様に、完璧に準拠したコンパイラならいける。

つまり、exportキーワードを使えばいい。
まあ、VCもGCCもサポートしていないわけだが。

585 名前:デフォルトの名無しさん :2006/03/06(月) 00:25:41
>>583-584
ありがとうございます。
大人しく全部ヘッダに書きます。


586 名前:デフォルトの名無しさん :2006/03/06(月) 00:51:11
>>585
テンプレート引数に渡す型が予め分かってるなら
明示的実体化という手もある
例えばintとdoubleで実体化するのであればcppファイルに

template class A <int>;
template class A <double>;

と書いておく


587 名前:デフォルトの名無しさん :2006/03/06(月) 00:52:13
自分のゲームプログラムなんですが
templateの使いすぎなのか
デバッグビルドだと重くて、まったく試運転出来ないのですが
そういうものですか?
VisualC++7.1 リリースビルドで30FPSなものが、デバッグだと0FPSになります。

588 名前:デフォルトの名無しさん :2006/03/06(月) 01:08:34
templateは関係ないよ、コンパイル時に全部展開されるから。



589 名前:デフォルトの名無しさん :2006/03/06(月) 01:42:40
>>588
それを期待して inline 重ねまくったコードが
デバッグビルドでボロボロになるんだよ。

590 名前:デフォルトの名無しさん :2006/03/06(月) 01:48:04
templateってデバッグビルドだと実行時解釈される事あるの?

591 名前:デフォルトの名無しさん :2006/03/06(月) 02:03:50
>>590
それはないが589はinline展開について言ってるのでは?


592 名前:デフォルトの名無しさん :2006/03/06(月) 06:42:10
なんで急にinline展開について言うの?

593 名前:デフォルトの名無しさん :2006/03/06(月) 07:39:45
>>582
ヘッダファイルからcppファイルをインクルードしれ。
最初は違和感あるかもしれんけど、
template の時だけはこのスタイルがベスト。

594 名前:デフォルトの名無しさん :2006/03/06(月) 07:43:37
きんもーっ

595 名前:デフォルトの名無しさん :2006/03/06(月) 10:54:03
インライン関数みたいな感覚でヘッダに実装したほうが自然じゃね?

596 名前:デフォルトの名無しさん :2006/03/06(月) 11:00:39
漏れもヘッダに入れるのが普通だと思う

597 名前:デフォルトの名無しさん :2006/03/06(月) 11:23:07
俺もそう思う

コンパイルして使うものは *.cpp コンパイルしないで使うものは *.hpp ってしてる

598 名前:デフォルトの名無しさん :2006/03/06(月) 11:52:48
同じく。
別ファイルに分けたいときは
拡張子はcppじゃなくhppにしてる。

599 名前:デフォルトの名無しさん :2006/03/06(月) 11:54:33
int func()
{
   while(1)
   {
      /* 処理 */
      if (条件) return 1;
   }
   return 0;
}

この条件で抜けるとネストが深くなるとか、そういった問題は起きないのでしょうか?
break;で抜けるのしか見たことがないので不安です。

600 名前:デフォルトの名無しさん :2006/03/06(月) 11:59:59
>>599
無問題

ネストが深くなるってどんな意味で使ってる?

601 名前:599 :2006/03/06(月) 12:05:46
>>600
ありがとうございます。

>ネストが深くなるってどんな意味で使ってる?
繰り返しの中に繰り返しとかです。
もし return 1; で抜けていなければ、何回もこの関数が呼ばれてこの条件で抜ける度に
while(1){
   while(1){
      while(1){
         /*中略*/
      }
   }
}
みたいな感じに処理されてるのかと思ったんです。

昔HSPを使っていたときに、
repeat〜loopからちゃんと抜けずにgotoを使うとそういった現象に見舞われましたもので。

602 名前:デフォルトの名無しさん :2006/03/06(月) 12:31:20
[1] もし return 1; で抜けていなければ、
[2] 何回もこの関数が呼ばれてこの条件で抜ける度に

抜けていなければ、抜けるたびに……?


ネストが深くなる、というより、スタックの処理が適切になされるかという意味かな。

603 名前:デフォルトの名無しさん :2006/03/06(月) 14:06:35
>>601
「関数が呼ばれるたびに、whileが増えていく」ってことか?
ぶっちゃけありえない。

604 名前:デフォルトの名無しさん :2006/03/06(月) 14:08:37
>>601
悪いことは言わないから、HSPのことは、きれいさっぱり忘れろ。

605 名前:デフォルトの名無しさん :2006/03/06(月) 14:15:03
ようは、whileブロックの「終了処理(とでも言うべき何か)」がbreakによって行われるように錯覚していて。
returnでいきなり関数を抜けると、whileブロックの「終了処理」が行われずに関数処理が終わってしまう。
だから、次に同じブロックに処理が来たときに、前回の中途半端な状態が残っていて、おかしな動作に
なってしまうんじゃないか、てことだろ?

そういうアセンブラチックなことをしなくてすむのが高級言語なんだよ。
HSPはほんとうに低級なんですね。

606 名前:デフォルトの名無しさん :2006/03/06(月) 17:38:58
deleteにNULLを渡しても大丈夫と言いますが、
DirectXのユーティリティなどで、
#define SAFE_DELETE(p) { if(p) { delete (p); (p)=NULL; } }
と定義されているのは、何故なのでしょうか

607 名前:デフォルトの名無しさん :2006/03/06(月) 17:43:46
>>606
そのdefineと、NULLをdeleteするのとは、違うだろ〜。よく見なされ。


608 名前:デフォルトの名無しさん :2006/03/06(月) 18:34:09
>>607
いやいや、deleteにNULL渡してもOKなら
このマクロもifチェックいらないはずなのに何故、という話です

609 名前:デフォルトの名無しさん :2006/03/06(月) 18:42:54
冗長だからだろ

問題ないのと、コストがかからないのとは違う


610 名前:デフォルトの名無しさん :2006/03/06(月) 18:51:36
むしろif書いた方が冗長な気がするが

611 名前:デフォルトの名無しさん :2006/03/06(月) 19:09:32
SAFE_RELEASEと一貫性を保つため?

612 名前:デフォルトの名無しさん :2006/03/06(月) 19:10:34
DirectXのソースコードは超絶ウンコだから気をつけろ
そのifは必要ないし、inline+templateでも書けるところを
わざわざマクロを多用してるし、newが例外投げることすら
知らないし、C++初心者が書いてるようなレベルだ

613 名前:デフォルトの名無しさん :2006/03/06(月) 19:13:03
2重にdeleteしちゃったりしても、不具合でないようにしてるのかな

614 名前:デフォルトの名無しさん :2006/03/06(月) 19:21:55
単純に if(NULL) と delete NULL じゃ、delete NULL のほうがコストが
高いからじゃねーの?


615 名前:デフォルトの名無しさん :2006/03/06(月) 19:32:55
ひょっとしたらNULLをdeleteしたら落ちるんじゃないかとDXUTを書いた人たちが不安に思っていたにいっぴょ。

616 名前:デフォルトの名無しさん :2006/03/06(月) 19:38:35
NULLを渡されると落ちるような蛸なDebug用deleteを使われることを恐れてNULLチェックしているに一瓢。

617 名前:デフォルトの名無しさん :2006/03/06(月) 19:52:04
つか、昔の VC++ だと delete に NULL 渡すと落ちた気がする。

618 名前:デフォルトの名無しさん :2006/03/06(月) 19:56:44
昔のVCのnewはメモリ不足の例外は投げなかったな。

619 名前:デフォルトの名無しさん :2006/03/06(月) 19:58:42
VC6 までそうだったね。
自分で例外投げるようにハンドラすげ替えたりして。

620 名前:デフォルトの名無しさん :2006/03/06(月) 20:03:02
まあvc6はC++じゃないから仕方ない罠

621 名前:デフォルトの名無しさん :2006/03/06(月) 20:32:39
VC6が糞なのかそれにさっさと取って代わらないドトネトが糞なのか

622 名前:デフォルトの名無しさん :2006/03/06(月) 21:07:26
>>606
new の回数と delete の回数が一致してないと気持ち悪い、とか
new していないものを delete するのは気持ち悪い、とか。


623 名前:デフォルトの名無しさん :2006/03/06(月) 21:14:46
ところでさぁ、さっき思いついたんだけど、
C++のこと、これからは「しーぷらら」って呼ばない?

624 名前:デフォルトの名無しさん :2006/03/06(月) 21:18:46
>>622
newしてないものをdeleteしちゃまずいぢゃないか!


625 名前:デフォルトの名無しさん :2006/03/06(月) 21:34:59
>>623
断る

626 名前:デフォルトの名無しさん :2006/03/06(月) 21:41:18
そういえば、しーぷらぷら君ってどこ行ったの?

627 名前:デフォルトの名無しさん :2006/03/06(月) 21:47:17
しーぷらぷら君ってだれ?

628 名前:デフォルトの名無しさん :2006/03/06(月) 21:54:46
じゃぁ、「しぃぷらら」

629 名前:デフォルトの名無しさん :2006/03/06(月) 21:56:56
EYECOMに載ってたやつ。

630 名前:デフォルトの名無しさん :2006/03/06(月) 22:00:45
じゃ「ディズニーシー」

631 名前:デフォルトの名無しさん :2006/03/06(月) 22:02:37
「しーたすたす」でええやん

632 名前:デフォルトの名無しさん :2006/03/06(月) 22:07:30
時代は強い言語を求めているッ!!
C卐卐
シーダブルハーケンクロイツだッ!!

633 名前:デフォルトの名無しさん :2006/03/06(月) 22:07:43
「しぃぷららん」にしたほうが可愛くね?

634 名前:デフォルトの名無しさん :2006/03/06(月) 22:08:20
XとかZでよくね?

635 名前:デフォルトの名無しさん :2006/03/06(月) 22:17:27
「しぃぱふぱふ」

636 名前:デフォルトの名無しさん :2006/03/06(月) 22:19:20
「シー禿」

637 名前:デフォルトの名無しさん :2006/03/06(月) 22:20:48
「禿C」

638 名前:デフォルトの名無しさん :2006/03/06(月) 22:21:00
しーぱげぱげ

639 名前:デフォルトの名無しさん :2006/03/06(月) 22:22:39
しぃツルッパゲ

640 名前:デフォルトの名無しさん :2006/03/06(月) 22:26:30
つるピカハゲしぃくん

641 名前:デフォルトの名無しさん :2006/03/06(月) 22:26:42
しぃツルりん

642 名前:デフォルトの名無しさん :2006/03/06(月) 22:27:19
しーダメダメ

643 名前:デフォルトの名無しさん :2006/03/06(月) 22:28:02
今禿って言った香具師ちょっと来い(`_ゝ´)

644 名前:デフォルトの名無しさん :2006/03/06(月) 22:28:10
しーダメダメ

645 名前:デフォルトの名無しさん :2006/03/06(月) 22:28:44
メイドさんCC

646 名前:デフォルトの名無しさん :2006/03/06(月) 22:28:51
ちょwおまいらwwwww

647 名前:デフォルトの名無しさん :2006/03/06(月) 22:29:10
C
C++
C#
C##
C####

648 名前:デフォルトの名無しさん :2006/03/06(月) 22:29:56
>しーダメダメ
C言語できないやつに取れる

649 名前:デフォルトの名無しさん :2006/03/06(月) 22:31:03
>>648
test.cxx←テスト点シーダメダメって読んでた

650 名前:デフォルトの名無しさん :2006/03/06(月) 22:58:43
しーだめだめ相談室

びじゅある しーだめだめ

651 名前:デフォルトの名無しさん :2006/03/06(月) 23:38:53
しーぽんぽん

652 名前:デフォルトの名無しさん :2006/03/06(月) 23:44:55
>612
答え:DirectXはC言語でも扱えるように作られている

653 名前:デフォルトの名無しさん :2006/03/06(月) 23:53:29
>>652 お前アホだろ。

654 名前:デフォルトの名無しさん :2006/03/06(月) 23:56:40
まぁ「DirectXのソースコード」って表現が既に電波だな

655 名前:デフォルトの名無しさん :2006/03/07(火) 00:05:52
ヘッダはソースコードではありませんか?

656 名前:デフォルトの名無しさん :2006/03/07(火) 00:08:40
ありませんねぇ

657 名前:デフォルトの名無しさん :2006/03/07(火) 00:14:43
>>656
そんな言い切れるほどの根拠はないだろ。
ちなみにプリプロセッサディレクティブ #include の機能は
"Source file inclusion" と言われる。

658 名前:デフォルトの名無しさん :2006/03/07(火) 00:56:21
DirectXのヘッダーについて言うなら、>652はわりと正しい意見だと思う。
windows.hがいつまでたっても古臭いマクロとか#define定数とかに頼ってるのも、そう考えれば納得がいくな。

659 名前:デフォルトの名無しさん :2006/03/07(火) 01:23:43
Cとの互換性とかいい加減X8で切っちゃえば良かったのに。
いくらなんでももうCでDirectXプログラミングとか無いと思うんだが

660 名前:デフォルトの名無しさん :2006/03/07(火) 02:20:01
同感。 今時WindowプログラミングでC使うならbetter CとしてのC++を使えばいいし(一部特殊用途除く)。
DirectXをCで使う必然性って何よ?

661 名前:デフォルトの名無しさん :2006/03/07(火) 06:19:05
C丼

662 名前:デフォルトの名無しさん :2006/03/07(火) 07:08:00
SAFE_DELETE() の勘違いが C と関係あるわけないだろ。

663 名前:デフォルトの名無しさん :2006/03/07(火) 07:23:54
SAFE_DELETEはDXUTじゃなかったっけか?

664 名前:デフォルトの名無しさん :2006/03/07(火) 07:43:34
最適化のパフォーマンスは C と C++ どっちが上げやすいのか?

665 名前:デフォルトの名無しさん :2006/03/07(火) 07:47:20
たすたすと呼称
『Cで書いてんの?』
『いや たすたす。』


666 名前:デフォルトの名無しさん :2006/03/07(火) 07:54:32
C + _ +)

667 名前:デフォルトの名無しさん :2006/03/07(火) 09:00:30
Cくさかんむり

668 名前:デフォルトの名無しさん :2006/03/07(火) 09:08:16
expectedの解説と使い方?を教えてください。

669 名前:デフォルトの名無しさん :2006/03/07(火) 09:54:43
explicitではなくて?

670 名前:デフォルトの名無しさん :2006/03/07(火) 12:02:05
Cチョメチョメ

671 名前:デフォルトの名無しさん :2006/03/07(火) 12:21:21
Cpp == Cpunipuniヾ(o゚ω゚o)ノ゙

672 名前:デフォルトの名無しさん :2006/03/07(火) 13:39:04
>>662
>617でFAっぽくないか?

673 名前:デフォルトの名無しさん :2006/03/07(火) 15:01:29
>>613
が正解。
だからdelete (p); (p) = NULL;だけでもよいが、不安になる人がいるのでifを付けている。


674 名前:デフォルトの名無しさん :2006/03/07(火) 15:45:38
かえって危ない。
#define SAFE_DELETE(p) do { delete (p); (p)=NULL; } while (0)
と書き換えれ。

675 名前:デフォルトの名無しさん :2006/03/07(火) 15:49:42
クラス化や operator という正攻法をさしおいてトリッキーなマクロ置換に走る奴のコードが
自分には回ってきて欲しくないんだが・・・

676 名前:デフォルトの名無しさん :2006/03/07(火) 16:10:06
今からCしか使えないコンパイラに移ることも無いだろうし。
template<typename T>
void safe_delete(T*& p)
{
delete p;
p=0;
}

677 名前:デフォルトの名無しさん :2006/03/07(火) 16:28:37 ?
std::fstreamから1bitずつ読み込みたいんですがどうしたらいいですか?

678 名前:デフォルトの名無しさん :2006/03/07(火) 16:33:44
>>676
throw() もよろしく
ついでにsafe_delete_arrayとsafe_deleterとsafe_array_deleterも

679 名前:デフォルトの名無しさん :2006/03/07(火) 16:49:26
>>676

template<typename T>
void safe_delete(T*& p)
{
typedef refuse_incomplete[sizeof(T)];
delete p;
p=0;
}


680 名前:679 :2006/03/07(火) 17:23:21
間違えた……

template<typename T>
void safe_delete(T*& p)
{
typedef char refuse_incomplete[sizeof(T)];
delete p;
p=0;
}


681 名前:デフォルトの名無しさん :2006/03/07(火) 17:28:53
>>679

template<typename T> 
void safe_delete(T*& p) 

checked_delete(p);
p = 0;


ってこと?


682 名前:デフォルトの名無しさん :2006/03/07(火) 17:36:15
こちらでよろしいでしょうか?
フレーム処理でちょっとてこずってます。
さまざまなサイトを参考にして、
メッセージループでフレーム制御をやってるのですが、
どうもうまく行きません。なぜかキーボードのキーを叩くと
アニメーションが停まってしまいます。
半日くらいgoogleほっつき回ったのですが、原因はついに分からず。
どなたか知恵を貸していただけないでしょうか?
一応ソースコードをアップロードしておきます。
環境はWinXP、VS.NET theSpoke Premiumです。
ttp://gamdev.org/up/img/4892.zip


683 名前:デフォルトの名無しさん :2006/03/07(火) 17:40:21
せっかくtheSpokeで買ったならtheSpoke.netで聞けよ・・・

684 名前:679 :2006/03/07(火) 17:42:56
>>681
はい

685 名前:デフォルトの名無しさん :2006/03/07(火) 18:40:00
>>677
バイト単位で読み込んでからビットに刻む

686 名前:デフォルトの名無しさん :2006/03/07(火) 19:49:28
質問:VS2003上で動作しているか調べる方法はありますか?
わたくしはVisualStudio2003 VC++を使っております。
DebugかReleaseかはDebugを使っています。
現在VS上でプログラムを実行してるのか、できたEXEを直接動かしてるのか
プログラムで判断することはできますか????
GetCurrentDirectory()を使ってカレントフォルダを表示させるプログラムを作りました。
VS2003上でF5を押すときとは、カレントフォルダの最後に\Debugがつかないで
直接EXEを実行させるとそれがつくという違いがあるのはわかったのですが、
別な方法で正しくVS上で動作させているかプログラムで判別する方法はある
のでしょうか?

687 名前:デフォルトの名無しさん :2006/03/07(火) 19:59:34
>>686
日本語でOK
後、1も読めない文盲は氏ね

688 名前:デフォルトの名無しさん :2006/03/07(火) 20:40:44
はじめましてこんにちは。
質問があります。C++でCGIのプログラムは終わって、テスト鯖でのコンパイル→実行→テストも終わったのですが、いざ、これを無料鯖に載せて公開しようとしたところ・・・SSHの使えない鯖で、コンパイルできません。
鯖環境がどういうものか書いていない鯖なもので、ウィンドウズかBSD系でのコンパイル済みファイルをアップしても動作しない為、鯖は別環境と推定されます・・・。
っが、なんとか簡単に鯖でコンパイルすることは可能でしょうか?
他のプログラムを使う事もできるのですが、個人的に、C/C++が好きということもあり、できる限り上記の方法での解決をしたいと思っております。
ちなみに、以前、どこかでそのようなスクリプトを見た事があるのですが、どうも思い出せません。
CGIファイルに・・・スクリプトで・・・G++をECHOで呼び込んで・・・・ってのはわかってるのですが・・。自分の知識の範囲外です。
お手数とは思いますがよろしくお願いします。
(ウェブプログラミングはPerl、PHP、JSP等の方が良いとわかっていても、C/C++やJavaなどのオブジェクト指向系(あくまで系)の方がいいっすb

689 名前:デフォルトの名無しさん :2006/03/07(火) 20:49:43 ?
>>688
#/bin/sh
echo Content-type: text/plain
echo
make hoge

690 名前:デフォルトの名無しさん :2006/03/07(火) 21:01:42
>>688はsystem()も知らないのか?

691 名前:デフォルトの名無しさん :2006/03/07(火) 21:02:09
>>688
さっそく回答ありがとうございます!
これです!昔見たやつです!!
早速、試させていただきます。ありがとうございましたb

692 名前:デフォルトの名無しさん :2006/03/07(火) 21:13:17
オブジェクト指向系の言語が使いたくて
スクリプト言語を使いたいなら、
Ruby や Python を鯖でコンパイルするといいよ。
容量圧迫するけど。

693 名前:デフォルトの名無しさん :2006/03/07(火) 21:18:37

クラスがメンバー変数として配列を持っていた場合、どうやって初期化すれば良いのでしょうか?

class Class
{
public:
int array[10];
}

Class:: Class () : /* ここでarrayを初期化したい */
{
}

;

694 名前:682 :2006/03/07(火) 21:18:38
>>683
じゃ、そちらで聞きなおしてきます。失礼しました。

695 名前:デフォルトの名無しさん :2006/03/07(火) 21:48:39
>>693
ムリ
コンストラクタの中で初期化。

696 名前:デフォルトの名無しさん :2006/03/07(火) 21:51:03
>>693
コンストラクタ内で初期化代入するしか。
Class::Class() {
static const int arrayInits[] = {0, 1, 2, 3, 4,};
std::copy(arrayInits, arrayInits + sizeof(arrayInits) / sizeof(*arrayInits), array);
}


697 名前:デフォルトの名無しさん :2006/03/07(火) 22:31:24
>>686
カレントフォルダは好きに変えられる。
たとえばショートカットを作れば、ショートカットのプロパティで設定できる。

もしもEXEの存在するフォルダを知りたいのであれば、
EXEへのパスを取得し、それを加工してEXEファイルのあるフォルダへのパスを取り出すようにすべき。

(書き終わってからスレ違いだと気づく_| ̄|○)

698 名前:デフォルトの名無しさん :2006/03/07(火) 22:48:03
>>686
実行時に渡すパラメータを決めるオプションがあるから、
自分で何かパラメータ渡すように設定しておいて、
そのパラメータがあるかどうかで判定すれば良さげ。

直接動かす場合でもそのパラメータ渡せば誤認させられるけど、
どうせ Debug バージョンでしか有効じゃない処理だろうから、
そのくらいいい加減でもいいっしょ。

699 名前:デフォルトの名無しさん :2006/03/08(水) 00:31:06
>>695-696 初期化と代入を以下略

700 名前:デフォルトの名無しさん :2006/03/08(水) 02:05:10
以上略

701 名前:デフォルトの名無しさん :2006/03/08(水) 03:57:45
テンプレートを使ったクラスや関数をライブラリ化しようと思っています。
テンプレートクラスは下記のような記述で明示的なインスタンス化ができたのですが、
template class Hoge<Moge>;
テンプレート関数の場合は、明示的なインスタンス化はできないのでしょうか?

環境は、VS2005です。

702 名前:デフォルトの名無しさん :2006/03/08(水) 04:17:30
どういうとき必要なのかは知らんが、
似たようにしてできない?
あるいは template の後に <> を書くか。

703 名前:デフォルトの名無しさん :2006/03/08(水) 04:17:33
>>701
template<class T>
void func(const T &) {
...
}

void func<int>(const int &);

たしか、こんなんでいけたと思う。

704 名前:デフォルトの名無しさん :2006/03/08(水) 05:20:45
>>701
template<class T>
void func(const T &) {
...
}
template void func (const int &);


705 名前:デフォルトの名無しさん :2006/03/08(水) 05:36:44
typenameつかおうね

706 名前:デフォルトの名無しさん :2006/03/08(水) 05:48:26
>>705
どんな風に?


707 名前:701 :2006/03/08(水) 06:08:49
>>702-706
レスありがとうございます。
参考にさせて頂いて、手探りでいじってた所、
↓これで、一応コンパイルは通りました。
template void func<int>(const int&);

708 名前:デフォルトの名無しさん :2006/03/08(水) 06:20:57
typenameを使うべきところは見当たりませんがwww

709 名前:デフォルトの名無しさん :2006/03/08(水) 08:12:43
template<class T>をtemplate<typename T>と書けということではないかと思う。

710 名前:デフォルトの名無しさん :2006/03/08(水) 09:13:35
どっちでも同じじゃん。
まあ、俺は typename のが好きだけど。
template <typename> class T とかだと
typename 使えないけどね。

711 名前:デフォルトの名無しさん :2006/03/08(水) 09:16:53
>>710
ん?なんだその構文?

712 名前:デフォルトの名無しさん :2006/03/08(水) 09:46:24
>>711
テンプレート・テンプレート・パラメータ

713 名前:デフォルトの名無しさん :2006/03/08(水) 09:59:20
>>711
テンプレート引数にテンプレートを渡すためのもの。
template<typename T>
class Foo {};

template<template<typename U> class T>
class Hoge
{
  T<int> Bar;
};

Hoge<Foo> ahya;

Uは使わないから710のように省略できる。

714 名前:デフォルトの名無しさん :2006/03/08(水) 10:05:12
「引数に渡す」ってのは、変な表現のような気がする
普通「引数」というと「実引数」のことじゃね?

715 名前:デフォルトの名無しさん :2006/03/08(水) 10:18:01
>普通「引数」というと「実引数」のことじゃね?

実と仮のどちらかがデフォってことはない
あくまで「不明」もしくは周りの文脈から推定するのみ

716 名前:デフォルトの名無しさん :2006/03/08(水) 11:17:46
モダンは確か「テンプレート引数」っつってたと思う


717 名前:デフォルトの名無しさん :2006/03/08(水) 13:37:29
>実と仮のどちらかがデフォってことはない
>あくまで「不明」もしくは周りの文脈から推定するのみ

過去の経緯からそうなってしまった、ってのは理解ってるんだが……
一つの文章の中で argument と parameter をどちらも「引数」と表現するのはやめてほしいなあ

718 名前:デフォルトの名無しさん :2006/03/08(水) 13:54:25
「仮引数に渡す」という表現でもおかしいんじゃないか?
「テンプレートにテンプレートを(引数として)渡す」だろ。

719 名前:デフォルトの名無しさん :2006/03/08(水) 14:05:01
確かに、送り側から受け側まで含んだ系全体を指すニュアンスで「引数」というケースはあるな

720 名前:デフォルトの名無しさん :2006/03/08(水) 16:31:23
>>686 の父です
697,698さんどうも情報ありがとうです。
やりたいことは、関連してプログラムに使用したいファイルがあって
プログラムからみて相対パスで実行させようとして、
@プログラムはC:\AAA\PROGRAM1\debug\PROGRAM1.EXEで
A関連ファイルはC:\AAA\hogehoge\hogehoge.txt
のときに相対パスを使ってVS上かどうかで相対パスが
"..\hogehoge\hogehoge.txt"と"..\..\hogehoge\hogehoge.txt"
の2通りでてきてしまうのですが、なんとなくカレントフォルダを
現在実行しているプログラムの存在するフォルダに変更してしまえば
相対フォルダも同一になりそうな気がするので、たぶん問題解決です。
どうもありがとうございます。

721 名前:デフォルトの名無しさん :2006/03/08(水) 17:09:17
>>720
甘いな。ツーか、スレ違い。

722 名前:デフォルトの名無しさん :2006/03/08(水) 19:22:56
boost::enable_shared_from_this クラステンプレートは面白いな。
何の変哲もないポインタから、shared_ptr が生成される仕組みは
単純だけど、目から鱗って感じ。


723 名前:デフォルトの名無しさん :2006/03/08(水) 20:40:16
ソース読んだけど全然理解できん。

724 名前:デフォルトの名無しさん :2006/03/09(木) 00:38:48
読んでみたけど・・・
どういった場面で使うのかわからん
_internal_weak_thisがどこで初期化されてんのかよくわからん
あと、const T を T const と書いてもいいことを知りますた。

725 名前:デフォルトの名無しさん :2006/03/09(木) 00:53:35
>>724
Tがポインタだった場合に備えてじゃない?
とソースを読まずに言ってみる

726 名前:デフォルトの名無しさん :2006/03/09(木) 00:58:32
おお!なるほど。
あと、boostの前スレにenable_shared_from_thisあったね。
でもそれ見てもわからんかったので寝ます。おやすみ。

727 名前:デフォルトの名無しさん :2006/03/09(木) 01:05:35
>>725-726
T がポインタでも const T と T const は同じだよ。

728 名前:デフォルトの名無しさん :2006/03/09(木) 01:06:44
>>727
そうか、スマソ(´・ω・`)

729 名前:デフォルトの名無しさん :2006/03/09(木) 01:29:15
>>724
>どういった場面で使うのかわからん
http://www.boost.org/libs/smart_ptr/sp_techniques.html#from_this

>_internal_weak_thisがどこで初期化されてんのかよくわからん
boost::shared_ptr の側に boost::enable_shared_from_this 用のコードがあります.
(boost::shared_ptr が保持しようとしているポインタのクラスが
boost::enable_shared_from_this から派生しているものなら
_internal_weak_this を初期化する)

730 名前:デフォルトの名無しさん :2006/03/09(木) 01:33:25
デフォルトコンストラクタ A()
とコンストラクタA(a, b, c)
という2種類のコンストラクタを持つクラスを定義し、
それを継承したクラス class B : public A
のデフォルトコンストラクタB(), B(a, b, c)
があるとします。B(a, b, c)が呼ばれたら A(a, b, c)
が呼ばれるようにできますか?明示的に B(a,b,c)
の中で呼ぶしか無いでしょうか?


731 名前:デフォルトの名無しさん :2006/03/09(木) 01:37:46
B(int a, int b, int c) : A(a, b, c) {
// B(a, b, c)の処理...
}

732 名前:デフォルトの名無しさん :2006/03/09(木) 03:06:07
各種の operator にも名前空間というモノがあるんでしょうか?例えば

namespace N {
class A {
     略
    friend std::ostream& operator<<(std::ostream&, const A&);
     略
};//class A
}//namespace N

のように宣言した場合、この operator<< は正確には N::operator<<
ということになるのでしょうか。するとその実際処理を定義する場合にも
N::operator<< として定義するべきなのでしょうか?

そもそも std::cout << "aiueo\n"; の時の operator<< は
::operator<< なのか std::operator<< なのか・・・
ちょっと混乱しています。

733 名前:デフォルトの名無しさん :2006/03/09(木) 03:11:57
>>732
もちろん、演算子も名前空間の中に入る。

こういう風に書くとわかりやすいかも。
やっていることは同じコード。

std::cout << "hello,world" ;
std::operator << (std::cout, "hello,world") ;

まあ、実際に使うときは、ADL、Koening Lookupなどと呼ばれている仕組みにより、
名前空間を明示しなくても呼び出せるんだけど。

734 名前:デフォルトの名無しさん :2006/03/09(木) 03:27:13
>>733 ありがとうございます。
std::cout << "aiueo\n"; の時の << は
std::operator<< だったんですね。
その点は疑問が氷解しました。

>>722 の friend にした operator<< は、N::operator<< なのでしょうか?
というのは、class A のインスタンス a を std::cout << a; のように
ストリームに流すときの << もやはり std::operator<< なので、
friend 指定の時に

namespace N {
class A {
     略
    friend std::ostream& std::operator<<(std::ostream&, const A&);
     略
};//class A
}//namespace N

のように operator<< の前に std:: を付けてみると、
std::operator<< should have been declared inside 'std'
とコンパイラに怒られます。そこで何も名前空間を指定せずに
>>722 のように宣言したはいいものの、その定義では
どう書くべきなのか分かりません。 N::operator<< なのでしょうか?

735 名前:デフォルトの名無しさん :2006/03/09(木) 03:27:46
すみません、上のレスで >>722 と書いていたのは
>>732 の誤りでした。

736 名前:732=734 :2006/03/09(木) 03:39:20
>>732 で friend 指定した operator<< は
フルネームでは N::operator<< ですね。
*.cpp ファイルで定義する際にも N::operator<< で行けました。
今まで N::operator<< はクラス定義のヘッダファイル中に
直接書いていたので、いざ定義と宣言を分離しようとすると
困ってしまっていました。

737 名前:デフォルトの名無しさん :2006/03/09(木) 04:15:22
Koenig Lookupにも限界があり、std::ostream_iteratorに
自前のクラスやstd::pairなんかを食わせると、標準に正しく準拠した
コンパイラではエラーになる。

operator<< を std名前空間に入れないとだめだからだが、標準C++
はstd名前空間をいじってはいけない事になっている。

738 名前:732=734 :2006/03/09(木) 04:22:44
>>737 このあたりは Visual C++ と g++ で挙動が違い、
悩むこともしばしばでした。さらに同じ g++ でも
バージョンによって挙動が違うこともあるので余計に。

739 名前:デフォルトの名無しさん :2006/03/09(木) 08:03:46
>>737
自前のクラスなら operator をクラスと同じ名前空間で宣言すれば大丈夫。
std::pair はやっぱり無理。

740 名前:デフォルトの名無しさん :2006/03/09(木) 08:16:00
>>738
friend のルールは複雑でそういう問題も発生するし、
元々がなるべく使わないで済ませたほうがいいものなんで
public な入出力メンバ関数を作っておいて、 operator では
それらを呼び出すだけにするのがいいと思う。

ちなみに gcc だと 3.4, 4.0, 4.1 と毎度 friend 周りで挙動の変更が入っている。

741 名前:デフォルトの名無しさん :2006/03/09(木) 08:30:25
>>734
ちなみにstd::cout << "aiueo\n";の<<は
std::basic_ostream::operator <<のメンバ。
基本型とマニピュレータに対するoperator <<はstd::basic_ostreamのメンバ。

742 名前:デフォルトの名無しさん :2006/03/09(木) 09:39:27
えー、標準C++だとfinallyが無い(gccには__finallyも無い)ので
普通はスタック上のオブジェクトのデストラクタで代用する。
これは、メモリ/ファイル/コネクション等なら普通に使えるし
大抵はいろいろな処理をまとめてclassとして扱うので抵抗は無いのだけれど
これがロックとかだと、若干使いにくい気がする。

というのは、まず、ロックのためにclassを定義するというのもなんか嫌だし
unlockするタイミングを確定させるためにわざわざブロックを作って
その先頭にロックオブジェクトの宣言だけが現れる(操作がソース上に現れない)
という形になって、美しくない(気がする)。

で、operator bool()が必ずfalseを返すこんなclassと#defineマクロを使って
Synchronized(x) { } を擬似的に作ってみたのだけれど、まずいところあるかな?

class synchronizer {
 LockObject& lock;
 explicit synchronizer(LockObject& lock) : lock(lock) {
  lock.lock();
 }
 ~synchronizer() {
  lock.unlock();
 }
 operator bool() const {
  return false;
 }
};
#define Synchronized(x) if (synchronizer ___locker = synchronizer(x)) ; else

743 名前:デフォルトの名無しさん :2006/03/09(木) 09:50:00
>>742

JLib2 ( http://www.codeproject.com/library/jlib.asp ) に、
ほとんど同じコードがあったな。こっちは operator bool が常に true を返してたけど。
ただ、注意書きのところに、

// used to be "#define synchronized(x) if ( jlib::lang::Lock l_o__c_k(x) )",
// up to the C++ standard, this seems to be incorrect, it can only be
// accepted by MSVC. See C++ Language Specification, A5.

とか書いてあったから、いいかどうかは微妙なところ。

744 名前:デフォルトの名無しさん :2006/03/09(木) 09:57:48
>>742
結局ロックのためにブロック作ってるのは変わらないし
ロックオブジェクトを先頭に置くのが美しくない?とかってのも
単に見慣れてるかどうかでは?
{
ScopedLock<LockObject> lock;
...
}
みたいなので十分分かるとは思うな
言語が synchronized構文とかサポートしてるのならともかく
オレ流マクロで構文モドキを作るのは余計説明しにくいような

745 名前:デフォルトの名無しさん :2006/03/09(木) 09:57:55
あー、やっぱり、俺が考えつく程度のことは
当然誰か他の人も思いついてるんだよな。

どこが引っかかるかは、よく読んでから考えてみる。
とりあえず、ifの()内の変数宣言は、大昔のコンパイラは対応してないし。

746 名前:デフォルトの名無しさん :2006/03/09(木) 15:09:25
>>729
おー、template特殊化でコンパイル時に型判断してるんですね。
template恐るべしですな。

747 名前:デフォルトの名無しさん :2006/03/09(木) 16:17:47
VC7.1で、意味はありませんが、こんなコードがありまして

boost::bind(std::less<int>(), _1, 2)(x) ;

さらにこうすると、コンパイルできません。

boost::not1(
    boost::bind(std::less<int>(), _1, 2)
  )(x) ;

これならOKのようです。

boost::bind(
    boost:not2(std::less<int>()), _1, 2
  )(x) ;


これなら通るのですが。

std::not1(
    std::bind2nd(std::less<int>(), 2)
  )(x) ;



748 名前:747 :2006/03/09(木) 16:19:32
boostスレに行くべきだったかな……。

749 名前:デフォルトの名無しさん :2006/03/10(金) 00:05:24
#include "boost/lambda/lambda.hpp"
#include "boost/lambda/bind.hpp"

(!bind( std::less<int>(), boost::lambda::_1, 2))(x)

750 名前:747 :2006/03/10(金) 00:54:56
>>749
おお、boost::lambdaすごい。
これは面白い。

STLのbind1sとかbind2ndとか、キモすぎで、
今まで使おうとは思わなかったんですよ。


■過去ログ置き場に戻る■ 1- 前250 次250 最新50
DAT2HTML 0.33f Converted.