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


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

C++相談室 part9
501 名前:デフォルトの名無しさん :02/08/01 19:53
Developper Studioは探しても見つかりません。
Developer Studioを探して下さい。

502 名前:499 :02/08/01 20:44
解決しました.

RECT *root;

void Draw(void)
{
RECT *p = new RECT;
p->top = 0;
p->left = 0;
p->bottom =100;
p->right =100;
root = p;
}
とする事で代入できました.
ポインタを使ってしかメンバには代入できないのですね.
Cでは
RECT myrect;
のように構造体myrectを宣言すれば myrect.メンバ名
もしくは、myrectを指すポインタ->メンバ名
でアクセスできたのと思うのですが.
newもしくはmallocを使ってポインタの指す構造体を直接作らないと
いけないんですねえ.
間違いがあれば指摘お願いします.

503 名前:デフォルトの名無しさん :02/08/01 23:37
&a で渡して、A(*)[10] 型で受け取るようにしたらどうだろう。
要素数を間違えて渡したらコンパイル時に型不一致で引っかかって
くれる。

504 名前:デフォルトの名無しさん :02/08/02 00:15
>>499>>502
いってることがよくわからないんだけど…。
RECTみたいな単純な構造体メンバへのアクセスって別にCもC++もかわらないよ?

505 名前:デフォルトの名無しさん :02/08/02 00:23
メンバ関数のポインタを使ってメンバ関数を呼び出そうとしているのですが、
class Base {
 void Function();
void Main();
 void (Base::*funcPtr)();
};
void Base::Main() {
 funcPtr = &Base::Function;
 (*funcPtr)(); // ここでエラー
}
としても
error C2171: '*' : 'void (__thiscall Base::* )(void)' のオペランドが無効です。
error C2064: 関数ポインタとして評価されない式を使って、関数を呼び出そうとしました。
とエラーが出てしまいます。
メンバ関数を呼び出す際は何か特別な構文などが必要なのでしょうか?

506 名前:デフォルトの名無しさん :02/08/02 00:29
>505
(Base::funcPtr)();
とか

507 名前:デフォルトの名無しさん :02/08/02 00:29
>>505
インスタンスを与えればよい。

class Base {
void Function();
void Main();
void (Base::*funcPtr)();
};
void Base::Main() {
Base b;
funcPtr = &Base::Function;
(b.*funcPtr)();
}

508 名前:デフォルトの名無しさん :02/08/02 00:30
>>506
コンパイル通らないっすよ。

509 名前:デフォルトの名無しさん :02/08/02 00:33
(this->Base::*funcPtr)()

510 名前:506 :02/08/02 00:35
>508
コンパイルは通った。リンクで引っかかるんだろ
つか、厨でした。逝ってきます

511 名前:デフォルトの名無しさん :02/08/02 00:37
>>510
うーんコンパイラによるような。
BCC5.6だとコンパイルエラー。「メンバポインタの不正な使用」だとさ。
>>509
なるほど。その手があったか。

512 名前:506 :02/08/02 00:41
むう......うちのgccだと509がコンパイルエラーになる......何故?

513 名前:デフォルトの名無しさん :02/08/02 00:47
>>505

class Base {
void Function();
void Main();
void (Base::*funcPtr)();
};
void Base::Main() {
funcPtr = &Base::Function;
(this->*funcPtr)();
}

514 名前:11 :02/08/02 00:49
>>512
わざわざ指定するなら当然
(this->*Base::funcPtr)()

515 名前:506 :02/08/02 00:54
>513
>514
Oh!イケたよ!(コンパイルだけしか試してないが)
せんきゅう!
しかしなんでthis->が要るのかな?

516 名前:デフォルトの名無しさん :02/08/02 00:54
「->*」「.*」が演算子なんだよな?

>>514 意味わかんない。

517 名前:デフォルトの名無しさん :02/08/02 00:57
「->*」「.*」が演算子なんだよな?

ちゃう

518 名前:513 :02/08/02 00:59
Function宣言しかしてないやん…。。。
なんでリンク時にエラー吐くのかと思ったYO!

thisが必要なのは、関数ポインタは暗黙のthisが使われないとかなんとか。

519 名前:506 :02/08/02 01:00
>517
ん?あってるっしょ?「->*」「.*」で単独の演算子として優先順位と結合性が定義されてるみたいよ?

520 名前:11 :02/08/02 01:01
>>516
>>506>>509で困ってるようだったから

>「->*」「.*」が演算子なんだよな?

そう

521 名前:506 :02/08/02 01:02
>518==513
そうなのれすか。ややこしいなあ

522 名前:デフォルトの名無しさん :02/08/02 01:03
メンバ関数へのポインタは通常の関数のポインタとは意味が違って、
単なるオフセットなのだそうだ。
だからインスタンスなりthisなりの実体を渡さないとコンパイルでき
ないのでは。

523 名前:505 :02/08/02 01:03
>>506-518
ありがとうございます。
funcPtr = &Base::Function;
でいかにして現在のオブジェクトのメンバであるかを表すのか
ということを考えていたのですが、ご指摘の通りthisポインタで
指定するということで解決することが出来ました。
本当にありがとうございました。

524 名前:506 :02/08/02 01:14
>522
???だったらメンバ変数と一緒じゃない???
あれ?なんか激しく勘違いしてるのかな?ごめ、もっとC++勉強してきます.....

525 名前:デフォルトの名無しさん :02/08/02 01:17
>>522 ダウト

526 名前:505 :02/08/02 01:19
>>519
>>522
この関連記事だけで知らないことが2つも。
とても勉強になります。

そこまで詳しくC++の内側まで書いてある本は
どのような物があるのでしょうか?

527 名前:デフォルトの名無しさん :02/08/02 01:21
>>526
>>5

528 名前:11 :02/08/02 01:23
virtualな関数へのポインタはどういう実装が考えられる?

529 名前:デフォルトの名無しさん :02/08/02 01:29
>>528 意味わかんない。

530 名前:506 :02/08/02 01:31
>528
フツーにインスタンスごとに関数ポインタ保持、じゃダメですかね?
ところでメンバ関数ってインスタンスごとに生成されたりしないよね?それともこの時点で間違ってる?

531 名前:11 :02/08/02 01:33
うっひゃ〜〜〜〜〜
メンバ関数ポインタは12byteもあるのか。
上のほうでウソ書いちゃったな。ごめん

>>529
こういうのどう解決してるのかな〜と思って
#include <iostream>

struct A { virtual void f(void) { std::cout << "A" << std::endl ;}} ;
struct B : A { void f(void) { std::cout << "B" << std::endl ;}} ;

int main() {
A a, *p ;
B b ;
void (A::*f)(void) = &A::f ;

p = &a ;(p->*f)() ;
p = &b ;(p->*f)() ;
return 0 ;
}


532 名前: :02/08/02 01:41
>>531
> メンバ関数ポインタは12byteもあるのか。

実装によるだろ。VC++は4byteだし。

> こういうのどう解決してるのかな〜と思って

VC++の場合だと、void A::__call_f() {f();} のような関数を
勝手に作るみたいだ。

533 名前:デフォルトの名無しさん :02/08/02 01:48
>>531
仮想関数の場合、BCCでコンパイルしてTurbo Debuggerで中身を
覗いてみたら、インスタンスの生成時にメンバ関数へのアドレスを
保持しているみたい。

534 名前:デフォルトの名無しさん :02/08/02 01:50
struct cls {
 int f();
 int f() const;
};
cls c;
main() {
 c.f(); /***/
}

/***/のところでconstのほうを呼ぶ方法ありますか?

535 名前:11 :02/08/02 01:53
>>532
>実装によるだろ
ハハハ、そんな当然のこと書かんでもいいって

>void A::__call_f() {f();}
なるほどね〜。それは簡単だ

>>533
仮想関数テーブルのこと?

536 名前:デフォルトの名無しさん :02/08/02 01:56
>>534
struct cls {
void f() { cout << "f()" << endl; }
void f() const { cout << "f() const" << endl; }
};

cls c;
const cls cc;

int main() {
c.f();
cc.f();
}

537 名前:デフォルトの名無しさん :02/08/02 01:57
>>535
ははあ、これが仮想関数テーブルなのでしょうか。Aのインスタンスには
一つ、Bのインスタンスには二つのアドレスを代入しています。

538 名前: :02/08/02 02:07
>>534
static_cast<const cls&>(c).f();

539 名前:534 :02/08/02 02:09
>>536
ねた?非constオブジェクトから呼ぶには?

540 名前:デフォルトの名無しさん :02/08/02 02:09
>>538>>539
struct cls {
void f() { cout << "f()" << endl; }
void f() const { cout << "f() const" << endl; }
};

cls c;
const cls cc;

int main() {
c.f();
const_cast<const cls &>(c).f();
}

でもよいようだ。

541 名前:デフォルトの名無しさん :02/08/02 02:10
const_castじゃないの?

542 名前:534 :02/08/02 02:11
>>538
やはりキャストかconstとして他の関数に渡すしかない?

543 名前:デフォルトの名無しさん :02/08/02 02:11
>>537
なんかよくわからんな。bccは

>>534
じゃあ、私もねたを一つ
(c.*(int(cls::*)()const)&cls::f)();

544 名前:デフォルトの名無しさん :02/08/02 02:12
初めてconst_castの使い方がわかったよ。

int main() {
c.f();
const_cast<const cls &>(c).f();
cc.f();
const_cast<cls &>(cc).f();
}

545 名前:デフォルトの名無しさん :02/08/02 02:14
>>543
多分、BをAにダウンキャストした時にAのメンバ関数が正しく呼ばれる
ようにアドレスを二つ代入しておく必要があるのでしょう。

それと、そのキャストすごいですね。

546 名前:デフォルトの名無しさん :02/08/02 02:15
>>534
int f(); のほうを別の名前にしてください。

同じ名前なのに自然に使い分けれないって状態が問題だと思うんだけど、どうよ。


547 名前:534 :02/08/02 02:19
>>546
実際は
iterator begin();と
const_iterator begin() const;
なのよ・・・。

548 名前:デフォルトの名無しさん :02/08/02 02:20
>>546
これは関数の多重定義になっているみたいですね。呼び出す
インスタンスがconst型かそうでないかで呼び出す関数が変わる
ようです。

549 名前:デフォルトの名無しさん :02/08/02 02:21
iteratorからconst_iteratorへの変換は必ず存在するはずだが

550 名前:デフォルトの名無しさん :02/08/02 02:26
>>549
Effective STLのP114、第4章に、そのような内容の事が書かれています。

551 名前:デフォルトの名無しさん :02/08/02 02:30
>>534
というわけで、なぜconst_iteratorがほしいのか、
もうちょっと状況を説明してみて欲しいのです。

552 名前:534 :02/08/02 02:32
>>549-550
サンクス、しらなんだ。
自作のhash_mapだったので・・・。

553 名前:デフォルトの名無しさん :02/08/02 02:34
>>551
const型のコンテナにinsertやeraseを適用できるとまずいからでは?

554 名前:デフォルトの名無しさん :02/08/02 02:47
>>553
コンテナがconstなら、もとからconst_iteratorしか取り出せない。
ん?const型のコンテナって、container<const T>って話?
そんなコンテナ作れるの?

555 名前:デフォルトの名無しさん :02/08/02 02:50
>>554
もとい、コンテナをconst型であるかのように取り扱うと言い直します。
container<const T>は無理です。

556 名前:デフォルトの名無しさん :02/08/02 04:38
valarrayってどう?

557 名前:デフォルトの名無しさん :02/08/02 04:49
>>556
そう言われてみれば、使ったこと一度もないな。何に使えるんだっけ。

558 名前:デフォルトの名無しさん :02/08/02 05:18
>>557
valarray<int> a; で a+=2; とやると、aのすべての要素に +=2 を
してくれるらしい。

559 名前:デフォルトの名無しさん :02/08/02 10:40
>>558
面白そう。かけ算とかは簡単に出来るのかな?
行列として。

560 名前:デフォルトの名無しさん :02/08/02 16:49
valarrayで行列の積って具体的にいい記述の仕方あるのかね?

561 名前:デフォルトの名無しさん :02/08/02 17:40
例外処理のコストを気にしますか?

562 名前:デフォルトの名無しさん :02/08/02 17:48
>>561
コストが問題になるときだけ気にします。

563 名前:デフォルトの名無しさん :02/08/02 17:51
ほとんどの場合、気にならない。

564 名前:デフォルトの名無しさん :02/08/02 17:53
>>562
コンストラクタ内での例外を避けるために、コンストラクタは静的な
初期化しかさせずにCreate()とか戻り値を返せる普通のメンバで
リソース等の動的な獲得をするのって、設計的に良くないですかね?

565 名前:デフォルトの名無しさん :02/08/02 19:28
valarrayのslice, gsliceの使い方がよくわかりません。

これらを使うと、多次元配列として扱えるようになるらしいのですが。

566 名前:デフォルトの名無しさん :02/08/02 22:20
おまえらちゃんと例外をキャッチしてますか?

567 名前:デフォルトの名無しさん :02/08/02 22:26
sageでなくてもOK・・・?
ビルドした実行ファイルのアイコンを任意のものへ変更したいです。
リソースファイルは作成出来ます。
その後はどうすれば・・?
ソースファイルと同一ディレクトリに置いてビルドしても反映されないのですが・・・
参照出来るログは「アイコン」で検索しました。
MSのVC++を使用しています。

568 名前:デフォルトの名無しさん :02/08/02 22:28
>>567
スレ違い

569 名前:デフォルトの名無しさん :02/08/02 22:29
>>568
なぜ・・?

570 名前:デフォルトの名無しさん :02/08/02 22:33
>>566
してない。異常終了してから考える。

571 名前:デフォルトの名無しさん :02/08/02 22:34
>>566
投げない。

572 名前:デフォルトの名無しさん :02/08/02 22:36
>>564
ストラウストラップ御大の言葉、「リソースの獲得は初期化」って言葉は知らんのかな?

コンストラクタでリソースを獲得して、デストラクタで解放する。そうすることで、
オブジェクトの生存期間とリソースの生存期間が一致するから、
リソースリークを減らせる。Create()で獲得してDestroy()で解放するような
機構だと、そのオブジェクトの機能を使う前にCreate()を行うことをプログラマが
保証しなくちゃならん(さらに、終了前にDestroy()を行うことも)けど、コンストラクタと
デストラクタなら、コンパイラが自働的に保証してくれる。

例外を避けるためにコンストラクタでリソース獲得をしないってのは、はっきり言って
本末転倒。コンストラクタでエラー報告をするために例外はある、ってのはさすがに
言い過ぎだろうけど、コンストラクタの例外を避けることのメリットはほとんど無いぞ。

って、ここまで書いて気づいたが、>>564はそれを知った上で、敢えて質問してるのか……?
だとしたら、俺個人としては、例外が使えないコンパイラで仕事をしなけりゃならん、
という状況でしか、そう言う設計はしない。


>>566
栞「たまにしか出ないから、例外って言うんですよ」
まあネタは置いといて。bad_allocはほったらかしかなぁ。bad_allocが来ても、
メモリがない状況でどんな対処すりゃいいのかわからんし。それ以外の例外は
キャッチして処理してるけど。

573 名前:デフォルトの名無しさん :02/08/02 23:12
例外に何を投げる?
空っぽのクラス?
文字列?
enum?

574 名前:デフォルトの名無しさん :02/08/03 00:09
std::runtime_errorか、それの派生クラス

575 名前:反goto原理主義者 :02/08/03 00:45
大域脱出に例外送出を使うのはアリですか?

try {
 while (hoge) {
  while (fuga) {
   if (monyu) {
    throw false;
   }
  }
 }
}
catch (bool) {}

576 名前:デフォルトの名無しさん :02/08/03 00:45
>>575
いやぁぁぁ!

577 名前:デフォルトの名無しさん :02/08/03 00:45
>>575
多分速度が遅い。gotoの方がいいと思う。

578 名前:デフォルトの名無しさん :02/08/03 01:18
>>575
文脈で決める

579 名前:デフォルトの名無しさん :02/08/03 01:22
>>564
漏れは、とりあえずコンストラクトは完了させる。コンストラクタの中で
エラーが発生したときはエラーフラグを立てて以降の処理を中断する。
インスタンスを生成したあとにエラーフラグをチェックして、エラーなら
即 delete。デストラクタでは、コンストラクタで構築が完了したものに
ついてのみ破棄。

580 名前:デフォルトの名無しさん :02/08/03 02:24
bcc5.6で浮動小数演算オーバーフローすると
プログラムが止まるんだけど普通?
(処理は戻ってこないし何のエラーも表示されない)

581 名前:デフォルトの名無しさん :02/08/03 02:57
>>580
スレッドがクラッシュするぞ。

#include <iostream>
#include <exception>
using namespace std;

int main()
{
double d = 0.0;

try {
while (true) {
d += 1e308;
cout << d << ' ';
}
}
catch (const exception &err) {
cout << "overflow occured." << endl;
}
}

582 名前:デフォルトの名無しさん :02/08/03 05:05
COMの質問になります。環境はVC6.0で、C++初心者です。

http://www8.plala.or.jp/nitoyon/download/iwebbrowser2.lzh
このソースを基に、IEコンポーネントではなくShockwaveFlashコンポーネントを使用したいのです。
CComPtr<IShockwaveFlash>と出来れば良いのですが、IShockwaveFlashの定義は無いんですね。

それで、このIShockwaveFlashの定義はどうすれば良いのでしょうか?
自分で適当に定義してしなければならないんでしょうか・・。
COMについてよく理解出来ていないのですが、どうか御教授お願いします。(__)


あと、これは良く分からずにやってみたのですが。
typedef int (*flash_play) (int);

longpunkIE[256];
(flash_play)( ( 4 * 28 ) + &punkIE); //メソッド28番が playメソッド
なんて、直接メソッドのポインタを指定すれば動くかナァ、と思ったのですが
やはりそう上手い具合にはいかなくて強制終了が出ちゃいますでした。(;゚∀゚;)
というか、本人がナニをやっているのかよく分かっていなくてアレなのですが・・。

もしよろしければ、このvtableを用いたやり方?も御指導頂ければありがたいです。

583 名前:582 :02/08/03 05:13
ああう。下のソース、間違えてるはタブも省略されちゃう罠で・・すいません。

こちらと読み替えてください。(__)
typedef int (*flash_play) (int);

flash_play   play ;
long      punkIE[256];

play = (flash_play)( ( 4 * 28 )+ &punkIE);
(play)(&play);

(・ω・`)

584 名前:デフォルトの名無しさん :02/08/03 09:10
このスレでいいのかわかりませんが、

Lapack++ をWindows環境にインストールしたいのですが
どうすればいいのでしょう?
Unix環境でのインストール方法ならNETに書かれているのですが。

コンパイラとしてはBorlandのフリーのを使ってます

585 名前:デフォルトの名無しさん :02/08/03 09:27
>>584
ソースをDLして中身を見てみたが、特に変なことさえしてなければ、
各ディレクトリのmakefileをBCC用に書き換えれば行けそうだ。

586 名前:デフォルトの名無しさん :02/08/03 09:32
>>583
俺もわからないです(_ _)

587 名前:デフォルトの名無しさん :02/08/03 12:37
>>585
makefileを書き換えるってどういうことっすか?
その名のファイルが存在することは承知してます


588 名前:デフォルトの名無しさん :02/08/03 12:51
>>582
COMの基礎とvtableのVC++での実装を勉強するか、
あるいはCOMを「単に使う側」としての使い方を勉強するか
どっちかをまずやれ

589 名前:デフォルトの名無しさん :02/08/03 13:12
>>582 多少遅くなるけどIDispatchから呼び出すか、
IShockwaveFlashをIDLから作れ

なお、スレ違い発言だが、初心者なら VC6を無理に使うより VBか Delphiで呼ぶ方がいいだろう
VBならIDispatchから Delphiなら両方の方法を使って呼び出せる

590 名前:デフォルトの名無しさん :02/08/03 13:41
>>581
やっぱりそうか。エラーメッセージが出ないから
バグがどこにあるか分からなくて困ったよ

591 名前:デフォルトの名無しさん :02/08/03 16:36
>>587
元々のmakefileがLinuxを想定して書かれているので、例えば
オブジェクトファイル名の拡張子が .o で終わるなど、このまま
ではWindowsでコンパイルできない。

またシェルコマンドとして rm が使われていたり、出力ファイル名
として a.out が使われていたりする。これらを .obj や del など
で置き換える必要がある。

ということ。

それから、Linuxのシステムコールを使っているファイルがある
ので、それも Windows用に書き換える必要あり。

592 名前:デフォルトの名無しさん :02/08/03 16:42
浮動小数点数の文字列変換について。
Windowsでは_gcvt()などがありますが、
UNIX系ではなにがあるんでしょうか?


593 名前:デフォルトの名無しさん :02/08/03 16:54
sprintf














逝ってきます

594 名前:デフォルトの名無しさん :02/08/03 17:51
>>593
それだとstdio.hをインクルードしないといけないですよね。
iostream.hとstdio.hを一緒にインクルードすると実行速度が
落ちるというような話を聞いたのですが本当でしょうか?

595 名前:デフォルトの名無しさん :02/08/03 17:52
#include <sstream>
std::ostringstream ostr;
ostr<<"おっぱい:\t"<<3.14;
cout<<ostr.str()<<endl;

596 名前:デフォルトの名無しさん :02/08/03 18:01
>>595
VC6.0でコンパイルしたら、
error C2679: 二項演算子 '<<' : 型 'class std::basic_string<char,struct std::char_traits
<char>,class std::allocator<char> >' の右オペランドを扱う演算子は定義されていません。
(または変換できません)(新しい動作;
というエラーがでました。


597 名前:デフォルトの名無しさん :02/08/03 19:05
>>591
レスありがとうございます
なんとなくわかりましたが現在の知識では
どうにもなりそうにありません

このへん読んどけみたいなHPとかありますか?
たびたびすいません

598 名前:デフォルトの名無しさん :02/08/03 19:27
テンプレートに関して質問があります。
以下の文がg++(2.95)ではコンパイルが通らないのですが(VC.NET+STLport4.5.3はOK)、
何が悪いのでしょうか?エラーメッセージには
'template parameters not used in partial specialization'
とありますが…。

template<typename T, typename U>
struct Base {
 template<typename V> struct traits {};
 struct traits<T> { typedef T value_type; };
 struct traits<U> { typedef U value_type; };
};


599 名前:デフォルトの名無しさん :02/08/03 21:03
VC++6で通ったYO!

600 名前:598 :02/08/03 21:22
>>599
いや…そこをg++でなんとか…。


601 名前:デフォルトの名無しさん :02/08/03 22:06
何がしたいのかイマイチ分からん

602 名前:デフォルトの名無しさん :02/08/03 22:27
traits<typename T>

603 名前:598 :02/08/03 23:02
>>601
Baseクラスが持つ2つのコンテナを統一的なインターフェースで
処理する関数を書きたいのです。つまり

//---------------
template<typename T, typename U>
struct Base {
 std::vector<T> mTList;
 std::vector<U> mUList;

 template<typename V> struct traits {};
 struct traits<T> { typedef MyIterator<T> iterator; };
 struct traits<U> { typedef MyIterator<U> iterator; };

 MyIterator<T> begin(T) { return mTList.begin(); }
 MyIterator<T> end(T) { return mTList.end(); }
 MyIterator<U> begin(U) { return mUList.begin(); }
 MyIterator<U> end(U) { return mUList.end(); }

 template<typename V, typename W)
 void func(void) {
  for (traits<V>::iterator i=begin(V); i!=end(V); ++i) {
   W()(i); // 処理
  }
 }
};

Base<TypeA,TypeB> x;

x.func<TypeA,MyOperation>();
x.func<TypeB,MyOperation>();
//---------------

こんな感じで…。

>>602
4-5行目のstruct traits<T>をstruct traits<typename T>にせよということでしょうか?
文法エラーが出ました…。

604 名前:582 :02/08/04 00:37
>>588
>>599
様、どうもです。(__)

IDispatchは知らなかったです。
お蔭様でhttp://www.hcn.zaq.ne.jp/no-ji/reseach/990905.htmを発見しますた。
何か糸口が見えたような気がします。

VCですが、あるアプリケーション用のDLLを作っていたので、
どうにもそれに規定されていて、VCを使うしかなかったんです。
また、個人的なアプリケーションを作るときにDelphiを学んでみようと思います。

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

605 名前:デフォルトの名無しさん :02/08/04 00:53
>>604
そのページ結構痛い
http://www.hcn.zaq.ne.jp/no-ji/reseach/20011008.htm
>私の普段の頭の中はオブジェクト指向になっているのですが
とか。

606 名前:デフォルトの名無しさん :02/08/04 02:06
union AAA{
     struct INA{int a;INA(int val){a=val;}};
     INA ina;
     AAA(int a):ina(12){}
};
structなら通るのにunionだとエラーになるのはどうしてなのでしょうか?
さっぱりわかりません。

607 名前:デフォルトの名無しさん :02/08/04 02:09
>>606
なんでunionにしたいのかがわからん。

608 名前:デフォルトの名無しさん :02/08/04 02:17
ネタはsageでな

609 名前:デフォルトの名無しさん :02/08/04 02:19
>>606
そりゃ当然。共用体はメンバ関数を持つことはできない。

610 名前:デフォルトの名無しさん :02/08/04 02:28
>>609
union AAA{
    void func(){}
};
がダメだということですか??

ネタじゃないやい。・゚・(ノД`)・゚・。

611 名前:デフォルトの名無しさん :02/08/04 02:33
>>610
そうですダメです。

612 名前:デフォルトの名無しさん :02/08/04 02:36
>>610
これが限度
struct AAA{
union {
struct INA{int a;};
INA ina;
} ;
AAA(int a){ina.a=12;}
} ;


613 名前:デフォルトの名無しさん :02/08/04 02:39
union AAA{
void func(void){cout<<"union"<<endl;}
void func(int a){cout<<a<<endl;}
};
void main(){
AAA aaa;
aaa.func();
aaa.func(12);
}
エラーにならずに走るんですが・・・?ルール上ダメということなのですか?

614 名前:デフォルトの名無しさん :02/08/04 02:49
struct INA{int a;INA(int val){a=val;}};
これ(コンストラクタの宣言されたクラス)が
unionのデータメンバになれない。


615 名前:デフォルトの名無しさん :02/08/04 02:50
>>613
C++第3版§10.4.12によると、共用体はメンバ関数を持つことが
できるそうだ。但し静的なメンバは持つことができない。

コンストラクタやデストラクタまで持つことができるように書いて
ある。

616 名前:デフォルトの名無しさん :02/08/04 02:51
もとい。コンストラクタやデストラクタは持つことができない。

617 名前:デフォルトの名無しさん :02/08/04 02:51
>>606をclでコンパイルしたら
error C2620: union 'AAA' : メンバ 'ina' でデフォルト コンストラクタが用いられ
ています。
って。

618 名前:デフォルトの名無しさん :02/08/04 02:53
>>617
コンストラクタを取ったらコンパイル通らない?

619 名前:デフォルトの名無しさん :02/08/04 05:24
今のねたって、できたとして、誰か実際に使うの?

620 名前:デフォルトの名無しさん :02/08/04 08:55
共用体のメンバがデフォルトコンストラクタを持つことが出来ない

621 名前:デフォルトの名無しさん :02/08/04 09:09
>>572
でも、配列やコンテナに突っ込みたい時もあるから、
コンストラクタでもメンバ関数でも初期化出来るように
する方がいいと思う。Destroy()でなくデストラクタ
で解放する形で書くと、デフォルトコンストラクタでも
一定の初期化コード(ポインタに0を入れるとか)を実行
する必要が出て来て、多少の無駄は生じるけど。

622 名前:デフォルトの名無しさん :02/08/04 09:13
>>603
template<class V> struct traits { typedef MyIterator<V> iterator; };
で駄目な理由が分からん。

623 名前:デフォルトの名無しさん :02/08/04 10:01
同じ関数が使う場所(プログラムの中)によって
結果が異なるというバグに悩まされてます。
なにか原因は考えられますか?

構造体のポインタを受け取って、その構造体に
処理を施すvoid型関数なんですけど・・・。


624 名前:デフォルトの名無しさん :02/08/04 10:08
void型関数って何?
戻り値の型がvoidって事?

>使う場所によって 結果が異なる

どこかでスタックを壊している

625 名前:デフォルトの名無しさん :02/08/04 10:11
>>623
もらって来た構造体の中身によって、バグが顕在化したりしなかったり
するとか、グローバル変数の影響を受けているとか、単にヒープが
壊れているとか、気付かないうちにオーバーロードしているとか。

626 名前:デフォルトの名無しさん :02/08/04 10:31
>>624
そうです。戻り値の型がvoidってことです。
使い方が間違ってました、すみません。

>>624-625
どうやったらスタックとかヒープを壊せるんですか?
それってハード的なことではないのですよね。

グローバル変数については大丈夫だと思います。
オーバーロードについては調べてみます。


627 名前:デフォルトの名無しさん :02/08/04 10:45
>>625
スミマセン、この場合のオーバーロードって
どういう意味ですか?

628 名前:デフォルトの名無しさん :02/08/04 11:02
意図しない関数が呼ばれていること、ぐらいの意味ではないかなあ
メソッド名の隠蔽のルールは意外に複雑なので注意したほうがいいッスよ

629 名前:デフォルトの名無しさん :02/08/04 12:25
>>626
ポインタがらみのバグがあれば、メモリのどこかに変なデータが
書き込まれる。たいていデータを書き込むのはスタックかヒープ
だから(と言うかそれ以外の所に書き込むと大抵OSが異常終了させる)
「スタック|ヒープが壊れる」と表現する。

630 名前: :02/08/04 12:44
>>623
初期化していない変数を使ってるんだろ。

631 名前:デフォルトの名無しさん :02/08/04 15:10
あるいは配列の外にアクセスしてるとか、静的変数やグローバル変数を関数ないで
使ってるとか

632 名前:623 :02/08/04 15:48
みなさま、レスありがとうございます。

>静的変数やグローバル変数
静的変数は使ってません。グローバル変数は
const unsigned char を関数内部でいくつか使ってます。

ただいまいろいろ調査中です・・・。

633 名前:デフォルトの名無しさん :02/08/04 15:50
うう、すんません、ageちゃいました。

634 名前:デフォルトの名無しさん :02/08/04 20:09
どうでもいいが、C++ライクなキャストをしたことがない。

635 名前:デフォルトの名無しさん :02/08/04 20:14
(foo*)と(foo*)(void*)が違う値になったりするから、
恐くてCスタイルキャストは使えない。
まあsignedの取り外し程度なら安全だろうけど。

636 名前:デフォルトの名無しさん :02/08/04 22:01
static_cast<foo*>(bar)

static_cast<foo*>(static_cast<void*>(bar))

637 名前:デフォルトの名無しさん :02/08/04 23:24
>>635
まじですか?怖っ

638 名前:572 :02/08/04 23:58
>>621
『コンテナ』が、std::vectorやstd::listやらのことを指してるんなら、
こいつらは、標準の規定ではデフォルトコンストラクタを必要と
しなかったはずだよ。
配列の場合は、数が少ないなら Hoge array[] = {'a','b','c','d'};
って初期値を与えればいいだけだし、そもそも配列を使う状況なら、
たいていはvectorにしておけば代用可能だし。
コピーコンストラクタが初期化関数よりもコストがかかりすぎるのなら、
コンテナはインスタンスへのポインタを持つようにすればいいし。
その場合も、管理の手間を切り離すために、スマートポインタにして。

まあ、俺としては、『デフォルトコンストラクタ+初期化関数』
なんてのは不要(というか、やってはいけない設計)だと思ってるから、
こういうのを駆使して、デフォルトコンストラクタを使わなくてもいいように
してる。『コンパイラが保証してくれる』っていうメリットを、最大限に
享受したいから。

ん? 今ふと思ったけど、コンストラクタが2つ以上の引数をとる場合、
配列の初期化ってどうやるんだろう……? 誰か教えてちょ。

639 名前:デフォルトの名無しさん :02/08/05 00:10
>>638
std::vector<Foo> v(3);

// v[0], v[1], v[2] には何が入る?

640 名前:572 :02/08/05 13:34
>>639
それは、プログラマが「デフォルトコンストラクタでインスタンスを3つ生成してくれ」
ってコードを書いてるから必要になってるだけ。その場合はデフォルトコンストラクタを
用意しなきゃならないのは当たり前でしょ。プログラマの方から、そうしてくれと
頼んでるんだから。
vector自身は「デフォルトコンストラクタを持っておけ」なんて要求をしてはいない。
上のコードは、プログラマがその要求をしただけ。
(説明が下手でスマヌ。More Effective C++ の項目4を参考にしてくれ)

で、話を元に戻すけど。結局、俺が言いたいのは、>>621
>でも、配列やコンテナに突っ込みたい時もあるから、
>コンストラクタでもメンバ関数でも初期化出来るように
>する方がいいと思う。
に関する意見。この書き方だと、>>621は「後で誰か(本人も含めて)がこのクラスを配列や
コンテナに入れたがるかも知れないから、その為にデフォルトコンストラクタを用意しておくのが
良い設計なんじゃないか」ってことを言いたいんだと思うけど。
俺は、それは違うと思う。>>638で書いたとおり、配列もコンテナもデフォルトコンストラクタが
必要、と言うわけではない(←部分否定)。だから、配列やコンテナの事を考えてデフォルト
コンストラクタを用意しました、ってのは「クラスの良い設計」として意味のあるパラメータでは
ないと思う。
そうすると、
・引数つきコンストラクタで、コンパイラが初期化の保証してくれるクラス
・デフォルトコンストラクタ+初期化関数で、プログラマが初期化の保証をするクラス
では、上の方がいいんじゃないかと思うんだけど。どうよ?
(反論のネタとしては、>>561-564の「例外処理のコスト」あたりかなー)

641 名前:デフォルトの名無しさん :02/08/05 13:56
例外処理ってどんぐらい高いの

642 名前:デフォルトの名無しさん :02/08/05 14:06
上の方に大域脱出に thow を使うって例があったけど、
goto に比べて 100 倍以上重かった。

643 名前:デフォルトの名無しさん :02/08/05 14:14
そもそも例外ってどういう処理になっているの?

644 名前:デフォルトの名無しさん :02/08/05 14:33
goto

645 名前:デフォルトの名無しさん :02/08/05 14:52
Cにあるgetopt.hと同じようなものはC++にはある?
それともC++でもgetopt.hを使うのか?
自分で探してみても自作getopt.cppとかにしかヒット
しないんだよ。
なかったら自分で作るからいいんだけど。
誰か知ってる人いたら教えて。

646 名前:645 :02/08/05 14:55
書き忘れた、Linuxのgcc 2.9.5。

647 名前:デフォルトの名無しさん :02/08/05 15:39
コンストラクタで例外発生させると、発生後のオブジェクトの状態がわけ分からなくならない?

648 名前:デフォルトの名無しさん :02/08/05 15:46
>発生後のオブジェクトの状態がわけ分からなくならない?
そうならないように、例外が発生したら
それまでコンストラクタ中で確保したリソースを全て開放してから
死ぬように作っておかないといけない。


649 名前:デフォルトの名無しさん :02/08/05 15:53
Derive *d = new Derive();
で例外ったときに、単純にdelete dで後始末できるのかなあという疑問。
例外がBaseのコンストラクタで起きていて、Derive固有のメンバ変数が未初期化の状態だったりすると、
変な動作しそうじゃない? その回答も>>648に含まれているのかもしれないけど、よく分かんない。

650 名前:デフォルトの名無しさん :02/08/05 15:57
Derive() {
 try {
  リソース確保
 } catch ( ) {
  リソース解放
  throw
 }
}

こんな感じ?

651 名前:649 :02/08/05 16:15
「プログラミング言語C++(第3版)」を斜め読みしたところ、P430に例が載っていた。
基底クラス群の初期化の途中で例外が発生したら、
成功した分だけ暗黙にデストラクタが呼び出される(ように作る)
ってことで合ってる? なるほど・・・。

652 名前:デフォルトの名無しさん :02/08/05 16:16
>>644
それだけだと、

 スタックの巻き戻し(一時変数のデストラクタ呼び出し)
 対応する catch を見つける

なんつー処理ができない。もう少し面倒だよ。

653 名前:デフォルトの名無しさん :02/08/05 16:18
>>651
Yes

コンストラクタ中で例外が発生すると、対応するデストラクタが呼ばれないから、

 自前で try - catch を書く
 auto_ptr などのスマートポインタを使う
 メンバ変数の初期化を使う

いずれかで対応する。

654 名前:デフォルトの名無しさん :02/08/05 16:21
例外として(藁
newに失敗したインスタンスのdeleteは不要。

655 名前:デフォルトの名無しさん :02/08/06 01:05
標準のストリームクラスで、

istream.read(buffer, offset, streamsize) ではなく
istream.read(buffer, streamsize)

という形式になっている理由がわかりません。

ストリームの使用者は
ランダムアクセスよりも順次アクセスの頻度が高いと仮定して、
後者の性能を高めるためでしょうか?

656 名前:デフォルトの名無しさん :02/08/06 01:21
>>655
ランダムアクセスしまくりたいの?

657 名前:デフォルトの名無しさん :02/08/06 01:29
>>655
ランダムアクセス出来ないデバイスを抽象化しやすいようにするため

658 名前:デフォルトの名無しさん :02/08/06 05:45
もしよかったら、どなたかこの板で編み出されたVC6で通るtypelist.h等を
わけていただけませんか?

659 名前:質問小僧A :02/08/06 16:19
今C++勉強中で、ある程度ソースかけるようになりました。
簡単なリスト作成ツールなどをせこせこ作って自己満足してますw
で、今作成したプログラムはDOS窓で動くんです。
それをwindowsの窓で動くプログラムにしたいのですが、なにからはじめればいいでしょうか?
参考書、やり方などなんでもいいので、教えていただけないでしょうか?

660 名前:デフォルトの名無しさん :02/08/06 16:29
>>659
「猫でも」

661 名前:質問小僧A :02/08/06 16:36
>>660
そこは無論聞く前に見て、勉強しました。
ですが、いまいちしっくりこないというか、微妙な感じというか・・・


662 名前:デフォルトの名無しさん :02/08/06 16:38
>>659
C++BuilderかC++.NET買え。
それ以外の方法は効率が悪すぎる。

663 名前:デフォルトの名無しさん :02/08/06 16:38
所詮Winだから・・・・。

664 名前:デフォルトの名無しさん :02/08/06 16:44
>>659
環境ぐらい書かないとアドバイスしようがない。

665 名前:デフォルトの名無しさん :02/08/06 16:45
       /■ヽ
      (´Д`)
  (( ─━OO━─ ))
        ∪∪


666 名前:デフォルトの名無しさん :02/08/06 17:02
>>659

「プログラミングWindows」を読む。
それで難しいと感じたら、C++ Builderでやってみる。


667 名前:デフォルトの名無しさん :02/08/06 20:50
>>658
http://www.42ch.net/UploaderSmall/source/1028634544.zip
いちおう確認したけど、LokiPortの存在は知ってるよな?

668 名前:デフォルトの名無しさん :02/08/06 21:14
>>667
あれはVC6だめじゃないの?

669 名前:デフォルトの名無しさん :02/08/07 02:31
クラスの演算子のオーバーライド(ロード?)でリンカのエラーがでます

error LNK2005: "bool __cdecl operator<(double const &,class TestClass const &)" (??M@YA_NABNABVTestClass@@@Z)
はすでに foo.obj で定義されています

ヘッダファイルに直接以下のように書いているのですが、なにがダメなのでしょうか?

// 比較演算子(upper_boundで必要)
bool operator < ( const double &a, const TestClass &v )
{
  return v.x < a;
}

なぜか解りませんがinlineを付けるとエラーが出ませんでした。

670 名前:デフォルトの名無しさん :02/08/07 02:33
>>669
そのままinlineつけておけばいい

671 名前:669 :02/08/07 02:33
あ、普通に考えると定義だけヘッダに書いて、中身はcppでかくのかな?
でもinlineではエラーにならないのが解りません。

672 名前:デフォルトの名無しさん :02/08/07 02:35
>>671
ヘッダに実装を書いた場合、そのヘッダを複数回includeすると、
実体も複数できるからリンク時エラーになる。
inlineにすれば実際には関数を作らないのでエラーにならん

673 名前:デフォルトの名無しさん :02/08/07 02:37
>>670>>672
ああなるほど。言われてみればそうですね。
ありがとうございます。

674 名前:デフォルトの名無しさん :02/08/07 02:49
訂正:>>669
 ○ return a < v.x;
 × return v.x < a;


675 名前:デフォルトの名無しさん :02/08/07 05:45
画面を更新させるにはどうすればよいのでしょうか?
Sleepを使ったら文がいっきに表示されて困っています。

676 名前:デフォルトの名無しさん :02/08/07 07:04
画面を更新する命令を呼べよ

677 名前:デフォルトの名無しさん :02/08/07 07:47
画面を更新する命令ってなんですか?

678 名前:質問小僧A :02/08/07 09:55
>>662
買うお金が・・・

>>664
すいません。環境かいてませんでした(汗
開発環境はVisualC++6.0です。OSはWin2000とWin98です。

>>666
さっそくその本立ち読みしに大学までいってきます。
ところで・・・獣の数字・・・w

679 名前:デフォルトの名無しさん :02/08/07 12:34
>>678
学生だろ?アカデミックパックで安いものじゃん
そもそも今の学生って俺たちより余程金持ってるじゃん

680 名前:デフォルトの名無しさん :02/08/07 14:55
>>677
知らんよ。というか 675 が意味不明だから、補足しろと言ってるんじゃないの?

681 名前:デフォルトの名無しさん :02/08/07 16:53
>>667
ありがとう!

682 名前:質問小僧A :02/08/07 20:27
>>679
それは偏見なのでは・・・(汗
少なくとも私は貧乏生活です・・・
成人祝いに買って貰ったVisualStudioで頑張ってるんです。


683 名前:デフォルトの名無しさん :02/08/07 20:59
>>682
MFC使えばいいんじゃないか?
自分は良いサンプル集めて勉強してる。
ダイアログアプリなら簡単だよ。



684 名前:質問小僧A :02/08/07 21:12
>>683
その良いサンプルをできればおしえていただけませんか?
はっきりいってどこから手をつければいいのか・・・

685 名前:デフォルトの名無しさん :02/08/07 21:31
VC6にもサンプルついてると思うけど
自分は主にココにある物を参考にしてる。
http://www.codeproject.com/
http://www.codeguru.com/
CDialogだったらボタンとかリストとかを
ダイアログエディタでくっつけて、動作は自分で記述することになるよ。
MSDNにCButtonやCListBox,CListCtrlがあるからそのメンバ関数とかをみれば
使い方は分かる。



686 名前:デフォルトの名無しさん :02/08/07 23:13
age

687 名前:デフォルトの名無しさん :02/08/08 00:44
NT4.0でVisualC++6.0を使っています。
ネットワーク経由のメッセージを契機に、
特定プログラムを起動するサービス(NT4.0上で動作)を
作りたいと考えています。
NT4.0サービスを作成・インストールする部分がわからないのですが、
参考になる書籍など、ご存知でしたら教えてください。
MSDNを見ると、「ATL COM AppWizard を使う」とありましたので、
早速使ってみたのですが、どこに記述してよいやらわかりません。
よろしくお願いします。

688 名前: :02/08/08 00:57
>>687
サービスとCOMに何の関係が?

689 名前:デフォルトの名無しさん :02/08/08 02:13
>>688
あるじゃん。COM を使わずに直接 API 叩く方法もあるが、ふつーは COM の
形で実装するし、そのための Wizard も用意されてる。

690 名前:デフォルトの名無しさん :02/08/09 00:17
includeした先にある名前って
グローバルスコープ?ファイルスコープ?
どちらになる?

691 名前: :02/08/09 00:18
>>690
もうちょい具体的に

692 名前:デフォルトの名無しさん :02/08/09 00:19
>>690
意味がわからん。

693 名前:デフォルトの名無しさん :02/08/09 00:21
includeしてもスコープは何も変わらん

694 名前:デフォルトの名無しさん :02/08/09 00:21
ファイルスコープって??

695 名前: :02/08/09 00:22
>>694
そのファイルの中だけに限定されたスコープ

696 名前:デフォルトの名無しさん :02/08/09 00:24
my.hで
#include <stdio.h>
をするとここではprintfを使うものの
#include "my.h"
をしたときにprintfという名前を占有してほしくないとする
どうにもならない?
namespace使うとふるいヘッダでエラーが出ることがあるし

697 名前:デフォルトの名無しさん :02/08/09 00:25
プリプロセッサの出力は翻訳単位と言う(第三版から)

698 名前:デフォルトの名無しさん :02/08/09 00:26
>>696
private_my.hをつくれ。

699 名前: :02/08/09 00:27
>>696
ヘッダファイルの中からprintf()呼ぶ気か?

700 名前:デフォルトの名無しさん :02/08/09 00:30
printfは例えばで実際にはwindows.hなんだが
>>698
どういうこと?

701 名前:デフォルトの名無しさん :02/08/09 00:33
>>700
my.h内でincludeするのではなく、別にprivate_my.h等を作ってこっちで
includeすればいいじゃん。で、private_my.cpp等にprintfを必要を
必要とするモジュールを封じ込める

702 名前:デフォルトの名無しさん :02/08/09 00:36
>>701
テンプレートはどうにもならん?
exportがサポートされないとだめかな?

703 名前:デフォルトの名無しさん :02/08/09 00:43
>>702
なにがやの?

704 名前:デフォルトの名無しさん :02/08/09 00:47
膨大なdefineマクロと膨大な関数名

705 名前:デフォルトの名無しさん :02/08/09 00:49
>>704
マクロはともかく、標準関数は std ネームスペースに封じられてるから問題ない。
問題は Win32 API だけど、こいつはどうにもならんね……。

706 名前:デフォルトの名無しさん :02/08/09 00:56
defineやめてconstとinlineにして
::windowsに閉じ込めるバージョンがあればいいんだが

707 名前:デフォルトの名無しさん :02/08/09 00:58
namespace windows {

#include <windows.h>

}
は?

708 名前:デフォルトの名無しさん :02/08/09 01:08
>>707
そもそも KERNEL32.DLL とか USER32.DLL にある API の本体が、namespace
なし、extern "C" でコンパイルされておろうが。

709 名前:つまづきさん :02/08/09 01:13
これの意味を理解できるように教えてくだされ
for (sum=0, i=0; i<v.size(); i++)
vectorクラスでデータの総和をとる計算の一部なんだけどわからない(欝

710 名前:デフォルトの名無しさん :02/08/09 01:15
>>709
size()は要素数を返す。ってゆーかイテレータを使うだろ普通

711 名前:710 :02/08/09 01:17
ついでにaccumulateも

712 名前:デフォルトの名無しさん :02/08/09 01:18
>>710
むしろ std::accumulate を使うと思われ。

713 名前:デフォルトの名無しさん :02/08/09 01:23
やはりC++はCをやってからの方がいいな。
forを知らずにvectorとはこれいかに。

714 名前:つまづきさん :02/08/09 01:24
えっとまだ本を読んでる状態なんで・・・・
iがv.sizeより小さかったらi++と判断したらいいのかなぁ
この後にsum += v[i] が続いてるんだけど

715 名前:デフォルトの名無しさん :02/08/09 01:26
>>714
その部分も予め書きなよ。

716 名前:つまづきさん :02/08/09 01:27
すんません

717 名前:デフォルトの名無しさん :02/08/09 01:29
自分は
709のスタイルなんだが、
iterator使ったコーディングにするとどう違ってくるの?

718 名前:デフォルトの名無しさん :02/08/09 01:29
>>715
いってることは正しいが書かなくてもわかるな普通。
それよりforを知らないのが信じられない。

719 名前:つまづきさん :02/08/09 01:29
v[i]っていうのは何をさしてるんですか?

720 名前:デフォルトの名無しさん :02/08/09 01:30
for(std::vector<int>::const_iterator i = v.begin(); i != v.end(); ++i)
{
  sum += *i;
}
かな?

721 名前:デフォルトの名無しさん :02/08/09 01:31
>>719
キーワードは STL と vector だ。あとは「プログラミング言語 C++」を読め。

722 名前:デフォルトの名無しさん :02/08/09 01:34
>>717
sum=0;
for(vector<int>::iterator vi=v.begin();vi!=v.end();vi++)
sum+=*vi;
みたいな

723 名前:つまづきさん :02/08/09 01:37
using namespace std ;
void main ( )
{
 vector < int > v ;
 int i, data, sum ;

 cout << "数値以外の文字を入力して終了" << endl ;

 while ( cin.good ( ) ) {
cin >> data ;
if ( cin.good ( ) ) v.push_back ( data ) ;
}               

for ( sum = 0, i = 0 ; i < v.size ( ) ; i ++ ) {
sum += v[i] ;
cout << v[i] << " - " << sum << endl ;
}
}
できればforからの文を日本語で説明して欲しい


724 名前:デフォルトの名無しさん :02/08/09 01:47
>>723
さすがに C++ の「いろは」から解説を頼むのは、スレ違いだと思われ。とりあえず
本を読んで、最低限の知識を身につけてクレ。

725 名前:デフォルトの名無しさん :02/08/09 01:50
723は多分、STLのvectorを知らないんだと思われ。
STLの解説がある本をお勧めする。

726 名前:つまづきさん :02/08/09 01:53
>>724
そりゃそだね、とりあえずこれはとばして読み続けてみるよ
>>725
まだ本の最初のほうだからでてきてないのかも


727 名前:717 :02/08/09 02:14
コンテナのある部分の合計を取るような関数を作ったときに
iteratorで記述してれば、記述は大変だが、使うときに便利になる。

アルゴリズムの記述が、特定のポインタでなく、様々なコンテナに
適用できる点がiteratorのいいところということだと思った。



728 名前:デフォルトの名無しさん :02/08/09 02:21
>>727
さらに一歩進んで、template 関数 or 関数オブジェクトにしないと、あまり嬉しくないと
思うが。

729 名前:nns :02/08/09 12:14
連番ファイルに切られたファイル(使うのは連番MPEG2ストリームファイル)をビット単位でうまいこと読み書きできるクラスのサンプルどこかにありませんか?
一応作ってはいるんだが挫折しそう。

730 名前:デフォルトの名無しさん :02/08/09 12:30
std::stringをpublic継承させて機能を追加したクラス、
CStringを作りたいと思っています。

class CString :
  public std::string
{
public:
  // 追加機能いろいろ省略。
private:
  static void* operator new(size_t);
};

「仮想デストラクタのないクラスからpublic継承してはいけない」
というのはC++の常識らしいですが、こういう風にnewを自分で禁止しておけば、
ポインタからアクセスすることがなくなるので問題はないと思うのですが、
どうでしょうか? これでも、まだなにかやばい事が起こり得る抜け道って
ありますか?



731 名前:デフォルトの名無しさん :02/08/09 13:14
可変引数リストで質問なのですが、
sscanfを別の関数から呼びたいのですが、
どうやったら...の部分を渡せるのでしょうか?
sprintfの場合は、vsprintfでva_listを渡せばできるのですが、
sscanfにはvsscanfのようなものは見あたりません。

test(const char* buffer,const char* format,...)
{
//sscanf が呼びたい
va_list arg;
va_start(arg, format);
int i = sscanf(buffer,format,arg);//うまくいかない。
va_end(arg);
return i;
}
sscanf(const char*,const char*,...);


732 名前:デフォルトの名無しさん :02/08/09 13:14
>>730
newできないと残念だから、継承させないでstd::stringのインスタンスを
メンバに持たせたらどう?
ちょっとめんどくさくなるけど。

733 名前:デフォルトの名無しさん :02/08/09 13:26
>>731
ちなみにそれで何をするの?

734 名前:731 :02/08/09 14:00
>>733
スイマセン。よく調べてみたら、
sscanfはdoubleの変換ができないようなので
atoi,atof系を使わないとだめですね。

C++的には

double d;
std::stringstream a;
a << "123.456789";
a >> d;

735 名前:デフォルトの名無しさん :02/08/09 14:12
try {
6nbsp;int *ip = new int[-1];
}
catch (std::bad_alloc &a) {
 cerr<<"(・∀・)マンコー"<<endl;
}

736 名前:デフォルトの名無しさん :02/08/09 15:05
>>734
> sscanfはdoubleの変換ができないようなので

そんなことないでしょ?


737 名前:731 :02/08/09 15:32
>>736
MSDNの
scanf 関数の型フィールド文字に
e、E、f、g、G
はfloatのポインタと書いてある。

でもやっぱり、sscanf使えないと面倒だなぁ。(鬱


738 名前:デフォルトの名無しさん :02/08/09 15:41
>>737
MSDNをよく読んでみましょう。

739 名前:731 :02/08/09 17:12
>>738
ありがとう!!doubleやっぱり使えるんですね。
「printf 関数と wprintf 関数の書式指定フィールド」を参照してください。
とあるのにリンク先をクリックすると
scanf 系関数の書式指定フィールド
になっている罠
だったんだねぇ。

731の件は sscanf.cにソースがあり解決しました。

後一つだけ質問させてください。お願いします。
sscanfを Cでコンパイル(*.c)すると問題ないのですが、
C++でコンパイル(*.cpp)するとRUNTIMEエラーがでてしまうのですが、
どうしたら回避できるのでしょうか?
(浮動小数点の場合に起きています。)

#include<stdio.h>
int main()
{
double d;
sscanf("123.456","%f",&d);
}

740 名前:デフォルトの名無しさん :02/08/09 17:44
>>739
>sscanf("123.456","%f",&d);

sscanf("123.456","%lf",&d);


741 名前:731 :02/08/09 18:48
sscanfの前にsprintfを実行したら
floating-point support not loaded
とでていたのがそれ以後、不思議と直りました。
>>740 ありがとうざいました。

742 名前:デフォルトの名無しさん :02/08/09 18:48
>>730
CString* ps = new CString[1];

743 名前:730 :02/08/09 20:40
>>732
いや、メンバで持たせるのはちょっとやってみたんですが、stringが持ってる
関数を全部委譲させようとすると、かなりの量の作業が必要なので。
で、いくつか委譲作業をやってる途中で思ったのです。『public継承って、もともと
こういう面倒な記述をしなくていいようにするために出来たんじゃないの?』って。
そう思って冷静に考えたら、委譲の保守の労力と、ポインタ間接が一個増えることによる
効率の悪化、このふたつの変わりに得られるメリットが、string*経由のdeleteという
落とし穴を回避できる、ってのは、あんまりじゃないですか。
だから、なんとかpublic継承させたいんです。

>>742
おおっと。そうですね。たしかに、それも回避しておかないと。

744 名前:デフォルトの名無しさん :02/08/09 21:10
>>743
> で、いくつか委譲作業をやってる途中で思ったのです。『public継承って、もともと
> こういう面倒な記述をしなくていいようにするために出来たんじゃないの?』って。
いいえ。

745 名前:デフォルトの名無しさん :02/08/09 21:54
その手の用途にはprivate継承とusingを使うのが定石。
publicで済ませるのは、暗黙の型変換が考えられない場合
(traitsとかね)だけ。

746 名前:730 :02/08/09 22:51
>>744
いや、あの。どうせなら、どういう歴史的経緯があったのか、教えてくださいよ。知ってるんでしょ?

>>745
private継承とusing……? private継承でも、using宣言でCStringのスコープに
stringの各関数をインポートできる、ってことですか? もしそうなら、
ひとつのusing宣言でstringをまるごとインポートできればいいんですけど……。
ま、調べてみます。
ところで、
>publicで済ませるのは、暗黙の型変換が考えられない場合
ってのは、どういう意味ですか? 「暗黙の型変換はよくない」と
前提した上で、CStringからstringへの暗黙の型変換がいっぱい起こりうるから
public継承はやめとけよ、って意味でいいんでしょうか。

747 名前:744 :02/08/09 23:02
>>746
public 継承は実装の再利用ではなく、あくまで OOP のパラダイムを実現する
ための機能。あまり書き方は良くないんだが「プログラミング言語 C++」に記述
があるよ。

748 名前:デフォルトの名無しさん :02/08/09 23:51
>>746
なんでそんなことするの?
std::stringにどんな拡張をする計画なの?

749 名前:デフォルトの名無しさん :02/08/10 00:39
C++サードは色々なことが載ってて役に勃つ!
マンセー

750 名前:730 :02/08/10 00:42
>>747
ありがとですー。

>>748
// 最初に現れる指定文字位置を探す。日本語を含んだ文字列でも正常動作する。
int Find(char ch) const;

// 最初に現れる指定文字で分割できる部分文字列(左側)を返す。日本語含んでもOK。
CString FindLeft(char ch) const;

// 最初に現れる指定文字で分割できる部分文字列(右側)を返す。日本語含んでもOK。
CString FindRight(char ch) const;

// 文字列が "10" "-5" 等ならtrue。
bool IsDigit(void) const;

こんな感じです。



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