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


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

C++相談室 part41
501 名前:デフォルトの名無しさん :2005/07/26(火) 20:46:55
>>500
規格の文法上不可能だから。
ISO/IEC 14882:1998 Annex A Grammar summaryより

for ( for-init-statement condition(opt) ; expression(opt) ) statement

for-init-statement:
    expression-statement
    simple-declaration
expression-statement:
    expression(opt) ;
simple-declaration:
    decl-specifier-seq(opt) init-declarator-list(opt) ;
decl-specifier-seq:
    decl-specifier-seq(opt) decl-specifier
decl-specifier:
    storage-class-specifier
    type-specifier
    function-specifier
    friend
    typedef
init-declarator-list:
    init-declarator
    init-declarator-list , init-declarator
init-declarator:
    declarator initializer(opt)

502 名前:493 :2005/07/26(火) 21:04:07
for ( a = 0, b = 0; a < 10; a++, b++ )
↑はgcc拡張だったぽ・・
通常規約上だめなのかも・・ちなみにVCだめ
gccばっかつかってたためか標準でおkかとおもてた
orz


503 名前:デフォルトの名無しさん :2005/07/26(火) 21:04:49
>>501
オブジェクトの定義を囲う括弧が実行文でなくなる制限についての関連事項はどこだ?

504 名前:デフォルトの名無しさん :2005/07/26(火) 21:12:40
関数の名前のつけかたなのですが
namespace
で細かい分類をするのって薦められるやりかたなのでしょうか?

こんな感じです

MyLib::SubsDataA::sub1(){ .. }

MyLib::SubsDataB::sub1(){ .. }

MyLib::SubsDataC::sub1(){ .. }

505 名前:デフォルトの名無しさん :2005/07/26(火) 21:14:01
>503
それを>501はそのまんま書いているわけなんだけど……。
もしかして規格書の文法記述読めない?

506 名前:デフォルトの名無しさん :2005/07/26(火) 21:18:49
>>503
for-init-statementの内のsimple-declarationでは無理として(見ての通り)、
expression-statementの方のことを言っているのなら、expression-statementの
文法を実際に見てみれば、expression-statementの中ではオブジェクトの定義が
出来ないことは分かる。

507 名前:501 :2005/07/26(火) 21:24:28
>>503
for-init-statementの内のsimple-declarationでは無理として(見ての通り)、
expression-statementの方のことを言っているのなら、expression-statementの
文法を実際に見てみれば、expression-statementの中ではオブジェクトの定義が
出来ないことは分かる。

508 名前:501 :2005/07/26(火) 21:27:55
>>503
for-init-statementの内のsimple-declarationでは無理として(見ての通り)、
expression-statementの方のことを言っているのなら、expression-statementの
文法を実際に見てみれば、expression-statementの中ではオブジェクトの定義が
出来ないことは分かる。

509 名前:501 :2005/07/26(火) 21:30:02
>>503
for-init-statementの内のsimple-declarationでは無理として(見ての通り)、
expression-statementの方のことを言っているのなら、expression-statementの
文法を実際に見てみれば、expression-statementの中ではオブジェクトの定義が
出来ないことは分かる。

510 名前:デフォルトの名無しさん :2005/07/26(火) 21:30:21
読めないから503みたいな事書いたんだろうね

511 名前:デフォルトの名無しさん :2005/07/26(火) 21:33:30
>>502
VCとCWで拡張なしで普通に通ったよ?
int main()
{
    int a, b;
    for (a = 0, b = 0; a < 10; a++, b++){}
}

512 名前:デフォルトの名無しさん :2005/07/26(火) 21:42:32
>>506
全然わかんねえ
何だその説明は?

513 名前:デフォルトの名無しさん :2005/07/26(火) 21:53:34
読めないなら素直にそう言えよ……

514 名前:デフォルトの名無しさん :2005/07/26(火) 21:58:45
>>506
全然わかんねえ
何だその説明は?

515 名前:デフォルトの名無しさん :2005/07/26(火) 22:04:37
自分の発言の読者の知識をどのように想定しているんだ?

516 名前:デフォルトの名無しさん :2005/07/26(火) 22:09:36
>>511
カンマ演算子自体はC時代から普通に使えるよな

517 名前:501 :2005/07/26(火) 22:12:36
人大杉だったのか…多重書き込みスマソ

518 名前:デフォルトの名無しさん :2005/07/26(火) 22:14:50
>511
それ(a=0, b=0)は宣言ではなくてexpressionだから。

えー、pc8鯖が強烈に重いので、多重注意しておくれ。

519 名前:デフォルトの名無しさん :2005/07/26(火) 22:20:53
>515
C++相談室で回答者やる程度にはC++と規格書の読み方に関する知識がある人間じゃない?

520 名前:511 :2005/07/26(火) 22:34:36
>>516
俺が書きたかったのは、>>502がおかしいということ。

521 名前:511 :2005/07/26(火) 23:03:00
>>518だった。

522 名前:デフォルトの名無しさん :2005/07/26(火) 23:15:07
なんで書き込めないんだ

523 名前:デフォルトの名無しさん :2005/07/27(水) 00:53:12
ある程度復活したようで。

524 名前:デフォルトの名無しさん :2005/07/27(水) 02:53:19
"C++はメモリがいくら使われるか分かる"らしいんですけど,
必要なメモリ量=実行ファイルの大きさ
で合ってます??くだらない質問ですいません。

525 名前:デフォルトの名無しさん :2005/07/27(水) 03:06:22
>>524
初めから終わりまで全く違います。

526 名前:デフォルトの名無しさん :2005/07/27(水) 03:22:34
とりあえずここは合ってる
>くだらない質問

527 名前:デフォルトの名無しさん :2005/07/27(水) 03:24:44
>>525
そのようですね。

528 名前:デフォルトの名無しさん :2005/07/27(水) 03:25:14
>>524
むしろCの方がどのくらいメモリを使うかは分かりやすいかと。
あまりそういう細かいことを知らなくても人の作った部品をうまく
組み合わせて全体を作るためのオブジェクト指向でもあるわけだし。

529 名前:デフォルトの名無しさん :2005/07/27(水) 04:05:06
構造体のメンバにstd::vectorを入れることは出来ますか?
こういう感じの。
struct A
{
int x;
int y;
std::vector<int> vect;
};

530 名前:デフォルトの名無しさん :2005/07/27(水) 04:07:45
>>529 まずやってみて、問題があったなら問題点を相談しろ。

531 名前:デフォルトの名無しさん :2005/07/27(水) 04:08:31
>>529
何がやりたいのか意味が分からん

532 名前:デフォルトの名無しさん :2005/07/27(水) 04:10:01
>>529
それは激しく環境依存。

533 名前:デフォルトの名無しさん :2005/07/27(水) 04:11:25
コンパイルできるかならできる
memcpyとかでは使えない

534 名前:デフォルトの名無しさん :2005/07/27(水) 04:12:25
可変データを扱う場合はclassを使うべき
コピーコンストラクタを持たせるべき

535 名前:デフォルトの名無しさん :2005/07/27(水) 04:30:49
>>532
いったいどこが?

536 名前:デフォルトの名無しさん :2005/07/27(水) 04:56:15
現実的には、C++の構造体=デフォルトのアクセス制限がpublicなclassだから、
structの中にstd::vectorを入れることはできるし、std::vectorを使うことが直接的な問題は引き起こさない。

ただし、セオリーとして、std::vectorを使うときはコンストラクタでだいたいの大きさを指定する:
A() : vect(1000) {} // A::vectはほとんどのケースで1000程度の要素数を持つと予想されるとき
これはパフォーマンスのためと、そのクラスがどの程度のデータを扱うことを想定しているかのヒントのため。

>>534
コピーコンストラクタは、ポインタをメンバに持つときに定義するべきでは?
std::vectorなら、コンパイラが暗黙に定義するコピーコンストラクタで問題ないはず。


537 名前:デフォルトの名無しさん :2005/07/27(水) 06:38:37
>>519
全然わかんねえ
何だその説明は?

538 名前:デフォルトの名無しさん :2005/07/27(水) 06:58:01
std::vectorのようにコンストラクタを持つデータを構造体の中に入れちゃったら
それはクラスになっちゃうのでクラスの性質がよくわからない人はやっちゃダメです。

539 名前:デフォルトの名無しさん :2005/07/27(水) 07:29:05
クラスになると言うより、PODでなくなると言う方が適切だと思う。

540 名前:デフォルトの名無しさん :2005/07/27(水) 09:41:33
>>536
ん? そういうヒントのためにはvector::reserveを使うべきでは?
いや、最初から1000の要素が必要ならそれでも良いけど。


541 名前:デフォルトの名無しさん :2005/07/27(水) 11:17:38
>>534 そんなルールはありません。
>>536 そんなセオリーもありません。プログラムの都合にあわせて好きにすればいいはずです。
>>538 C++での「クラス」と「構造体」に性質の違いはありません。

542 名前:デフォルトの名無しさん :2005/07/27(水) 11:19:09
もううんざりするほどバカが多いね。
なにこの板。

543 名前:デフォルトの名無しさん :2005/07/27(水) 12:08:41
C++での「クラス」と「構造体」の違いなのか、他のなんというかワカラン概念での「クラス」と「構造体」なのか
そこがハッキリしてないな。

544 名前:デフォルトの名無しさん :2005/07/27(水) 12:11:19
>>543
それぐらい知ってますよ
C++でいう構造体とクラスは本質的には同じ物で、何も書かなかった時にデフォルトでpublicかprivateになるという違いがあるだけでしょう?

545 名前:デフォルトの名無しさん :2005/07/27(水) 12:52:38
>>544
じゃあ何が聞きたいんだよ
人間初心者はお断りだぞ

546 名前:デフォルトの名無しさん :2005/07/27(水) 13:18:41
コピーコンストラクタとoperator=は必ず書く。
これでモーマンコタイ

547 名前:デフォルトの名無しさん :2005/07/27(水) 13:38:57
>>544
漏れが危惧したのは、質問者がいう「構造体」とは何かということだった。
ふつうC++プログラマであれば、structとclassに本質的な違いを設けないし、
それゆえstructであっても「クラス」と表現すると思ったからだ(妄想かもシレンが)。
ここはC++スレだが、明らかにC言語の質問も結構書き込まれるからな。
std::vectorをメンバに持たせたとき、「C言語の構造体」にできるすべての操作が保証されるか?
という質問に見えた。
おそらくそれで他の回答者もmemcpyが使えない(PODでないため)とか、
クラスの性質を知っておけとかのレスをつけたんだろう。

548 名前:デフォルトの名無しさん :2005/07/27(水) 14:13:08
>>546
ハァ?

549 名前:デフォルトの名無しさん :2005/07/27(水) 14:20:33
>>548
だから、
コピーコンストラクタとoperator=は必ず書く。
これでモーマンコタイ

550 名前:デフォルトの名無しさん :2005/07/27(水) 14:23:00
>>549
どんなときに必ず書くんですか?


551 名前:デフォルトの名無しさん :2005/07/27(水) 14:29:19
特に必要が無ければ書かないなあ。デフォで各メンバのoperator=が呼ばれるし。

552 名前:デフォルトの名無しさん :2005/07/27(水) 14:48:36
普段書いとくと
書き忘れがなくなるっしょ。

553 名前:デフォルトの名無しさん :2005/07/27(水) 15:11:12
>>552
書いておけば書き忘れはなくなるだろうけど、中身が正しい保証は無いよね。
メンバを増やしたときにそのコピーを忘れるとかしないのかなぁ。


554 名前:デフォルトの名無しさん :2005/07/27(水) 15:25:41
現在大学でC言語を一通り取得した学生です。
現在の状況としては。
簡単な住所録アプリケーション
1、検索、データの追加、削除、修正。
2、単純選択法によるソート機能(降順、昇順)
3、UNIX(Soralis)環境での、カレントディレクトリの
datファイルの表示、印刷機能
を実装したものを作れるような状態です。
この後、Windows環境でのC++を勉強していきたいと思っているのですが
どのような参考書を選ぶべきか迷っています。
どなたか、参考に教えていただけないでしょうか?

555 名前:デフォルトの名無しさん :2005/07/27(水) 15:31:09
>>554
スレ違い

556 名前:デフォルトの名無しさん :2005/07/27(水) 15:32:43
>>553
確かに
「寿命管理しなきゃいけないポインタがあるのにコピーコンストラクタを書き忘れる」
という大きなポカをするような人なら、

「メンバを1つコピーし忘れる」
なんていうマイナーなポカはその10倍くらいやってもおかしくないな・・・

557 名前:デフォルトの名無しさん :2005/07/27(水) 15:35:17
>>555
C++に関する質問のスレだったので
こういった、質問をしてもいいのか
と思ったのですが、スミマセン

558 名前:デフォルトの名無しさん :2005/07/27(水) 16:10:41
ファイルサイズをバイト単位で取得するにはどうしたらいいでしょうか?

559 名前:デフォルトの名無しさん :2005/07/27(水) 16:28:34
>>558

BYTE getFileSize(UNKNOWN_SIZE file_size)
{
return static_cast<BYTE>(file_size);
}

560 名前:デフォルトの名無しさん :2005/07/27(水) 16:30:43
>>558
たぶんseekg()で末尾に移動してtellg()
istreamの場合。


561 名前:デフォルトの名無しさん :2005/07/27(水) 16:33:56
>>554 まずCとC++は別言語。次にWindows環境でのフレームワークによって参考書は違う。
まず、Windows環境で、どんなプログラミングスタイルを取るか考えろ。
そして開発環境についての質問は他のスレッドへ。(ここで扱うのは標準C++であってVC++でもgccでもない)

>>558
inline size_t filesize(ifstream& fin)
{
 size_t current = fin.tellg();
 fin.seekg(0, ios::end);
 size_t size = fin.tellg();
 fin.seekg(current);
 return size;
};


562 名前:デフォルトの名無しさん :2005/07/27(水) 16:36:22
そこはg++って言ってやれよ

563 名前:デフォルトの名無しさん :2005/07/27(水) 19:49:49
>>558
テキストモードだと
seek()、tell()ではだめ
つか、素直にstat()使っとけ
標準じゃないけど、使えるだろ

564 名前:デフォルトの名無しさん :2005/07/27(水) 19:58:37
「ファイルサイズ」を求めるのに、どうして EOT 等を検索する必要があるんだ?

565 名前:デフォルトの名無しさん :2005/07/27(水) 20:03:12
2GBを超えるファイルサイズを取得するできうる限り汎用的な方法は?

566 名前:デフォルトの名無しさん :2005/07/27(水) 20:09:34
wxWidgets

567 名前:デフォルトの名無しさん :2005/07/27(水) 20:09:44
EOT まで 1byte ずつ数えても、それが「ファイルサイズ」である保証は?

568 名前:デフォルトの名無しさん :2005/07/27(水) 20:13:07
使ったことはないけどBoost::Filesystem

569 名前:デフォルトの名無しさん :2005/07/27(水) 20:24:01
>>568
boost::intmax_tは64bitとは限らないんじゃないか

570 名前:デフォルトの名無しさん :2005/07/27(水) 20:28:26
>>564 ファイルサイズを直接求める関数は標準ライブラリに用意されていない。
>>567 全くない。戻り値はpos_typeでしかない。


571 名前:デフォルトの名無しさん :2005/07/27(水) 20:39:42
>>570
じゃ、スレ違いって答えろよアホ

572 名前:デフォルトの名無しさん :2005/07/27(水) 21:51:03
>>565
size_tが2GB超に対応していれば561の方法。

573 名前:デフォルトの名無しさん :2005/07/27(水) 22:01:05
size_tはunsigned 32bit整数という環境が多いんじゃないかな

574 名前:デフォルトの名無しさん :2005/07/27(水) 22:46:04
今、ファイル分割結合のソフトを作っているのですが、
バイナリデータでファイル読み込みして一度それをChar型に格納するにあたり、
わりと大きなサイズのファイルでも格納できるようには動的にとればいいのですか?

意味あるんでしょうか?
初心者で申し訳ないっす。

575 名前:デフォルトの名無しさん :2005/07/27(水) 22:50:42
>>574
うむ。
動的にとるほうが、一度に確保できるサイズは大きい。

576 名前:デフォルトの名無しさん :2005/07/27(水) 22:53:18
上の574は558でファイルサイズの取得関数を聞いていたものですが、
あの後、調べててfileno(*fp)とfilelength(long *)と<io.h>のインクルードで
出来ました。間違ってました?


577 名前:デフォルトの名無しさん :2005/07/27(水) 22:56:18
>>576
できたならそれでいいじゃないか。
ただし、そいつは非標準なのでこのスレの範囲外。

578 名前:デフォルトの名無しさん :2005/07/27(水) 22:56:23
>>575
やはりそうですか。
動的なとりかたとしては、
#include<stdlib.h>で
char *data=(char *)malloc)(sizeof(char)*1000000
とかでよろしいのですか?
もっといい方法あります?

579 名前:デフォルトの名無しさん :2005/07/27(水) 22:58:58
>>578
new char[1000000]とかあるいはstd::vector<char>の方が一般的だと思う。

580 名前:デフォルトの名無しさん :2005/07/27(水) 23:01:48
windowsならば「動的にとるから大きな領域取れる」というよりも、
「ヒープにとるから大きな領域取れる」が正しいのでは?

581 名前:デフォルトの名無しさん :2005/07/27(水) 23:02:57
>>579
あっnewって聞いたことあります!なるほど!

それもfreeでメモリ開放は必要ですか?

582 名前:581 :2005/07/27(水) 23:04:56
そんなの自分で調べろって感じですよね。。。失礼しました〜

583 名前:デフォルトの名無しさん :2005/07/27(水) 23:05:05
freeじゃなくてdeleteです

584 名前:デフォルトの名無しさん :2005/07/27(水) 23:10:03
deleteではなくdelete[]です

585 名前:デフォルトの名無しさん :2005/07/27(水) 23:13:07
>>574
静的に取って味噌。キーワードはstatic。

586 名前:574 :2005/07/27(水) 23:21:39
>>585
えっ静的にとったらどんなファイルサイズでも対応できるようには
ならなくないすか?

でも味噌ってことは、静的にとるメリットがあるってことか


587 名前:デフォルトの名無しさん :2005/07/27(水) 23:25:20
>>586
> えっ静的にとったらどんなファイルサイズでも対応できるようには
> ならなくないすか?
大きな領域を取りたいと書いてあった(>>574)からそう書いた。
ホントに動的にとりたいのなら、動的にとるしかないではないか。

588 名前:デフォルトの名無しさん :2005/07/27(水) 23:27:31
>>586
動的にメモリを確保したところでどんなファイルサイズでも対応(一括で収まるって意味?)できるようになるとは限らない。


589 名前:デフォルトの名無しさん :2005/07/27(水) 23:38:12
>>581
std::vectorならその手間も要らない。

590 名前:デフォルトの名無しさん :2005/07/27(水) 23:47:53
ファイルの分割結合なら、ほんとはいちいちバッファに入れる必要も無いけどな。
やるんなら>>585のとおり、staticである程度確保しておいて、一気に読み込む方法だろうな。

591 名前:デフォルトの名無しさん :2005/07/27(水) 23:51:31
>>574
>>575
>>578
この辺りの流れから動的に領域を取るほうが、大きな領域を取れると
勘違いしているふしが見られる。 >>586
その誤解を解くために >>585 があることを理解すべし。

592 名前:デフォルトの名無しさん :2005/07/28(木) 01:30:42
大先生がいっぱい居る様だから、俺が口挟むことじゃないけど
NEWとMALLOCの違いって知ってるかい?
メンバ変数だけ捕獲させるなら麻呂でいいけど、メンバ関数捕獲するなら、要は、捕獲したメモリにクラス入れるとして、そのクラスに::が
あったらNEW使わないと・・・、中でどうなるかは知らない・・・、どうなるの?
それから、「動的」確保の罠って知ってる?
動的に確保して、ポインタにポインタを突っ込むとどうなるか?w
長いコードだときっとやらかす、目立wたないところできっとマラカス、でデスマらかすw
STATIC?それは性的メモリ確保っていうか、初期化のタイミングの違いってだけの認識で、単なる変数定義だと思うけど?

593 名前:デフォルトの名無しさん :2005/07/28(木) 01:34:39
静的確保はGlobalAlloc,Globallockのセットでしょ、安定的に・・・
でかいブツなら仮想メモリも使いやすいしね

594 名前:デフォルトの名無しさん :2005/07/28(木) 01:58:41
>>593
標準にGlobalAlloc,Globallockなんて無い

595 名前:デフォルトの名無しさん :2005/07/28(木) 02:08:22
>>592 もういい。しゃべるな。

596 名前:デフォルトの名無しさん :2005/07/28(木) 02:25:41
ADLを嫌って修飾名で関数を呼ぶことがあると思いますが
無名名前空間内の関数はどう修飾するのがベストでしょうか?

597 名前:デフォルトの名無しさん :2005/07/28(木) 02:34:54
>>595
その台詞は、592が死にそうなシチュエーションですね

598 名前:デフォルトの名無しさん :2005/07/28(木) 03:00:29
無名名前空間内って何?
::のことか?

599 名前:デフォルトの名無しさん :2005/07/28(木) 03:08:49
プププ

600 名前:デフォルトの名無しさん :2005/07/28(木) 04:47:02
アホばっかだな

601 名前:デフォルトの名無しさん :2005/07/28(木) 06:00:19
検索したらすぐわかったわ。
せっかく勝ち誇ってたのにすまんね。

602 名前:デフォルトの名無しさん :2005/07/28(木) 06:11:06
検索する前に知っていようぜ……。

603 名前:デフォルトの名無しさん :2005/07/28(木) 08:35:54
>>593
でかいでかいというのだからVirtualAllocだろ。
ちょこっとだけでWin32ならHeapAlloc。
GlobalAllocはクリップボードなど特殊用途。

すれ違いスマソ

604 名前:デフォルトの名無しさん :2005/07/28(木) 11:27:11
>>592
捕獲?

605 名前:デフォルトの名無しさん :2005/07/28(木) 13:34:22
>>574
UN*Xならmmap()
WindowsならCreateFileMapping & MapViewOfFile()

606 名前:デフォルトの名無しさん :2005/07/28(木) 13:43:05
http://www.atmarkit.co.jp/fwin2k/insiderseye/20050727x64ap/x64ap_01.html
「64bit時代のWindowsアプリケーション開発」

やっぱり、サーバとかCADみたいなやつ向けという論調だな。そりゃそーだが。


607 名前:606 :2005/07/28(木) 13:44:24
うほ、スレ間違えた(汗)
64bitプログラミングに書いたつもりだった


608 名前:デフォルトの名無しさん :2005/07/28(木) 14:14:50
クラス内でusingするってどういうこと?

609 名前:デフォルトの名無しさん :2005/07/28(木) 14:22:36
>>608
class B
{
public:
    void f();
    void g();
};
class D : private B
{
public:
    using B::f;
};

D obj;
obj.f(); //OK
obj.g(); //NG

こういう風に継承時のアクセス制御を書き換えたいときに。

610 名前:デフォルトの名無しさん :2005/07/28(木) 17:45:43
クラスB, Dを次のように定義
struct B {
template <class T> void f(const T& t) { cout << "T" << endl; }
virtual void f(const B& b) { cout << "B" << endl; }
};
struct D : public B {};

ここで、
B b; D d1, d2;
とすると、
d1.f(0); // (int)0 -> templateの方が選択される
d1.f(b); // B -> f(B)の方が選択される
d1.f(d2); // D -> templateの方が選択される
となります。ここで、
d1.f(static_cast<B>(d2)); // B -> f(B)の方が選択される
のように明示的にキャストせず、派生クラスの場合には
d1.f(d2);だけでf(B)が選択されるようにするには
どうすればいいですか?


611 名前:デフォルトの名無しさん :2005/07/28(木) 17:55:40
>>610
struct D : public B {
  void f(D const& d) { B::f(static_cast<B>(d)); }
};

612 名前:デフォルトの名無しさん :2005/07/28(木) 17:58:19
キャストは参照にした方がいいよ


613 名前:デフォルトの名無しさん :2005/07/28(木) 22:43:00
574じゃないけどちょっと気になって
static char a[500000];をつけてコンパイルしてみた。
予想と違った。実行ファイルのサイズは変化無し。
static char a[500000]={"a"};と初期化してみた。
予想どおり500kバイト増えた(と思われる)。

614 名前:デフォルトの名無しさん :2005/07/29(金) 01:08:54
>>613
処理系依存

615 名前:デフォルトの名無しさん :2005/07/29(金) 01:50:40
>>613
staticな配列の中身がゼロでも、実行時に初期化する処理系と、あらかじめDATA
として持っておき、転送する処理系がある。コンパイルオプションで切り替えられる物
もある。

616 名前:デフォルトの名無しさん :2005/07/29(金) 03:13:59
test

617 名前:デフォルトの名無しさん :2005/07/29(金) 06:52:35
templateクラスでstatic変数を扱いたいのですが可能でしょうか
もし可能ならば、.cppファイルの方でそのstatic変数を確保する際の、記述方法を教えて頂けないでしょうか

618 名前:617 :2005/07/29(金) 07:00:50
書き込んだ直後に見つかる法則、お騒がせ
ttp://www.tietew.jp/cppll/archive/8420

619 名前:デフォルトの名無しさん :2005/07/30(土) 17:08:10
class Aの内部でさらにclass Bを定義した場合
Aのメンバー変数にBからアクセスできません。
どうすればアクセスできますでしょうか?
class A{
int m_value;
class B{ void do(){std::cout << m_value } }
};
error C2327: m_value : 型名、スタティック、または列挙子ではありません。
といわれます

620 名前:デフォルトの名無しさん :2005/07/30(土) 17:19:44
>>619
それはA内部でBを宣言したと言うだけなので、AのインスタンスとBのインスタンスには何の関連もない。
アクセスするためにはAのインスタンスへの参照をBに渡すか、適切なI/Fを設けることになる。

621 名前:デフォルトの名無しさん :2005/07/30(土) 17:22:36
>>619
参考までに何言語使ってた?


622 名前:デフォルトの名無しさん :2005/07/30(土) 17:39:13
>619
よーく考えてみろ。

B hoge;
hoge.do();

なんてコード書かれたらどうする気だ?
どこにm_valueがあるのかと小一時間(ry

623 名前:デフォルトの名無しさん :2005/07/31(日) 11:00:26
nested classは非直感的という気はするけどな。Cつかってた人には常識なのかもしれんけど。
B hoge;は無効になり、Bのインスタンスの生成やアクセスはAにしかできず(private扱い)、
かつ内側のクラスは外側のクラスのメンバにアクセスできるというのがよかった。
コンパイラがAのインスタンスへの参照を暗黙で書いてくれればいいのに。
(virtualみたいなキーワードで書いてくれるようになる、でもいい)
この考えはやはり変なんだろうな

624 名前:デフォルトの名無しさん :2005/07/31(日) 12:46:53
俺は単にそのクラスの中でしか使わないクラス、という意味でよく使うから勝手に外のクラスへの参照を持たれると困るな。


625 名前:デフォルトの名無しさん :2005/07/31(日) 14:11:57
C++.netでテキストファイルを出力する際に、自動的にナンバリングするようにしたい
のですが、どのように行えばよろしいでしょうか。
イメージとしては、出力ファイルが
hoge1.txt
hoge2.txt
hoge3.txt
  :
  :
といった感じです。どうかよろしくお願いします。

626 名前:デフォルトの名無しさん :2005/07/31(日) 14:20:21
>>625 まず自分でやってみてから、わからないところを相談しろ。

627 名前:デフォルトの名無しさん :2005/07/31(日) 14:21:24
std::string get_filename(std::string prefix, int n, std::string suffix)
{
std::stringstream ss;
ss << prefix << n << suffix;
return ss.str();
}

int i = 1;
while (first != last) {
std::ofstream fout(get_filename("hoge", i, ".txt").c_str());
//
fout.close();
++i;
}
または
sprintf("hoge%d.txt", i);
桁数を揃えたければ%0?dなりsetfill('0') << setw(?)なりすればよい。

628 名前:デフォルトの名無しさん :2005/07/31(日) 14:52:00
>>625
自動でナンバリングなら専用のクラス作ればいいだろ

629 名前:デフォルトの名無しさん :2005/07/31(日) 15:01:25
>>628 ハァ?

630 名前:デフォルトの名無しさん :2005/07/31(日) 17:39:34
こういったアルゴリズム以前のプログラミング感覚みたいなもんはどこに回したらいいのやら。

631 名前:デフォルトの名無しさん :2005/07/31(日) 18:44:21
ああ、自動でナンバリングって、引数にカウンタ指定するとかじゃだめなんだ。
それだと>>627はダメだな。

privateメンバにカウンタを持たせて、ファイルに出力するときにそのカウンタ使ったら?


632 名前:デフォルトの名無しさん :2005/07/31(日) 20:05:36
いや、既に存在するhoge[0-9]+\.txtのファイルを調べて、
最大の番号+1のファイル名を求めたいということかもしれんぞw


633 名前:デフォルトの名無しさん :2005/07/31(日) 23:44:39
>>632
作ってあげれば?

634 名前:デフォルトの名無しさん :2005/07/31(日) 23:57:25
boost::filesystemでも使え。そうすれば少しでも環境依存性は抑えられる。

635 名前:デフォルトの名無しさん :2005/08/01(月) 02:22:49
>>634
MBCSのパスにもワイド文字のパスにも対応してないから、日本語絶望的。

636 名前:デフォルトの名無しさん :2005/08/01(月) 03:09:43
>>635
日本語使うな。

637 名前:デフォルトの名無しさん :2005/08/01(月) 12:59:00
pointer = NULL
は値がはいっていないことをはっきりさせるために
使うのが本来の使い方でしょうか?



638 名前:デフォルトの名無しさん :2005/08/01(月) 13:05:34
>>637
ポインターをどうしても生で使いたいのならそうでしょう。
「入ってない」というか、「有効でない」ですが。

639 名前:デフォルトの名無しさん :2005/08/01(月) 13:32:26
あるデータdataOrgを変換したデータdataConverted
が必要になったときだけ計算するようにしたい。
class Cdata{
public
DataClass dataOrg;
DataClassConverted *pdataConverted;
void callConverted();
};
dataConvertedのコンストラクターがcallConverted()を最初に呼ばれたときのみ実行されて
2回目からはpdataConvertedのメンバー変数(最初に呼ばれたときに計算された結果)が帰ってくるようにしたい。
DataClassConvertedをどう設計すればいいんだろう.

640 名前:606 :2005/08/01(月) 14:09:43
>>639
その日本語の説明そのまま実装すればいいんでないの?

void/*voidで何を返すんだ*/ Cdata::callConverted() {
if (this->pdataConverted == NULL)
this->pdataConverted = new DataClassConverted(this->dataOrg);
return this->pdataConverted->メンバー変数;
}


641 名前:639 :2005/08/01(月) 15:04:03
>>640
やっぱりNULLはそういう意味で使うんだ

642 名前:デフォルトの名無しさん :2005/08/01(月) 15:23:50
pdataConvertedの初期化を忘れずにね。

643 名前:デフォルトの名無しさん :2005/08/01(月) 15:24:50
>>641
CDataクラス内にbDataConvertedみたいな初期化フラグを付けるって手もあるけどね
この場合はポインタを直接見た方がスマートかな

644 名前:デフォルトの名無しさん :2005/08/01(月) 17:12:38
state patternって手もあるけどな

・callConvertedを面罵関数ポインタにして、初期状態で指す先の関数は
変換処理を行ってcallConvertedを次の関数に書き換え、変換済みデータを返す。
・次の関数は変換済みデータを返すだけ。

645 名前:デフォルトの名無しさん :2005/08/01(月) 23:06:30
>>637
C++ではNULLよりも0推奨。
NULLを(void *)0にできなくなったから、
オーバーロード解決時に思わぬことが起こりえる。

646 名前:デフォルトの名無しさん :2005/08/02(火) 13:34:57
Linux環境で、C++を使ったwaveファイル編集ソフトを作る予定なのですが
何かオススメの参考書はありませんか?

録音済みのwaveファイルを取り込んでから
・ノイズ除去
・再生速度の変更(低速再生)
・ボリューム調節
などを行い、再度waveとして出力する予定です。

647 名前:デフォルトの名無しさん :2005/08/02(火) 14:44:43
>>646
二重三重にスレ違い。
ここは環境依存スレではないし書籍スレでもない。
処で、waveファイルって何のこと?
もしかして:.wav

648 名前:デフォルトの名無しさん :2005/08/02(火) 14:54:39
自信たっぷりな647の3、4行目で、こっちが赤面したくなったわい

649 名前:646 :2005/08/02(火) 15:20:55
そうですね。スレ違い申し訳ありません。
適当に他のスレで聞いてみたいと思います。

あと、waveファイル云々はどのように解釈すればよいのですか?
間違ったことは申し上げていない と思っているのですが・・・

650 名前:デフォルトの名無しさん :2005/08/02(火) 15:23:13
>649
>647が痛々しいだけだから無視していいと思うよ。

651 名前:デフォルトの名無しさん :2005/08/02(火) 15:27:44
「waveファイル」で検索すると、概ねWindowsAudioFormatのことのようだ。
しかし、それをwaveファイルというのは正しそうで正しくないのかも知れず。
かと言って、それを論うのはスレ違いなことこの上ないので続けたいなら他所へ行け。

652 名前:デフォルトの名無しさん :2005/08/02(火) 15:31:59
>>651
あきらめろ

653 名前:デフォルトの名無しさん :2005/08/02(火) 15:32:40
>>647がどう思ってこれを書いたのか、興味があるので
説明して欲しいんだが、出てきてはくれんかな?
恥かいちゃったんでもう出てこれないか…

654 名前:デフォルトの名無しさん :2005/08/02(火) 15:52:07
作りたいだけなら、書籍よりwebでサーチした方がいいよ。
というのも、書籍だとまず数学的準備から始まって、数学的証明で終わる。
その中に時々本当にやりたいことについて説明した数式が入ってる。
基礎を押さえて勉強したいとか、信号処理の研究をしたいとかならいざしらず
単にプログラムが書ければよければ信号処理 fft wavelet等でgoogleおすすめ


655 名前:デフォルトの名無しさん :2005/08/02(火) 20:37:37
C言語からC++に乗り換えようと思って
独習C++って本を買おうと思ってます。

C言語については
基礎的な事はある程度できると思いますが
使いこなせていない状況です。

こんなヘッポコレベルの私でも独習C++を理解することができて
また、C++を使いこなすことができますか?

656 名前:デフォルトの名無しさん :2005/08/02(火) 20:40:12
うん

657 名前:デフォルトの名無しさん :2005/08/02(火) 20:41:22
わかりました
早速アメゾネで注文してきます。

658 名前:デフォルトの名無しさん :2005/08/02(火) 20:44:36
運の間違いじゃないか?

659 名前:デフォルトの名無しさん :2005/08/02(火) 20:45:37
>>658さんの発言で迷いました。
どなたか 最後の決断をたのみます。

660 名前:デフォルトの名無しさん :2005/08/02(火) 20:47:13
647 晒しage

661 名前:デフォルトの名無しさん :2005/08/02(火) 20:56:35
何がしたいかにも寄るけど・・・

Cが「使いこなせてない」と感じる理由が、最近のソフトやフレームワークが
C++ で書かれていることが多いから、ということなら C++ に移行する意味はある。

そうではなく、C で書かれた様々なもののソースを観てもピンとこないというのなら、
C++ に移行したところで何がどうなるとも思えないので VB や C# や Mathmatica
や perl など適当に優しげなものに移行すべきかと思う。

662 名前:デフォルトの名無しさん :2005/08/02(火) 21:05:46
>>661さん
とてもよい、アドヴァイスありがとうございます。
私はゲームプログラマーを志望しているのですが
ゲームについてのアルゴリズムを
ゲームのアルゴリズムについて書かれている本やウェブサイトで学んでいます。

私C++に移行したいと思った理由は
C++を元に解説をしている書物などがあるからです。

というわけで アマゾネで注文することを決めました。

663 名前:デフォルトの名無しさん :2005/08/02(火) 21:09:10
どちらの国の方ですか?

664 名前:デフォルトの名無しさん :2005/08/02(火) 21:13:16
特定ロケールに依存するなタコ

665 名前:デフォルトの名無しさん :2005/08/02(火) 21:14:13
ごめんなさい、私は言葉が不自由な人間なので
翻訳ソフトで翻訳されたような 日本語でしたね

日本人なので、安心してください>>663さん

666 名前:デフォルトの名無しさん :2005/08/02(火) 21:28:53
>>646
sox
audacity
ソフトだとこのあたりが参考になると思う


667 名前:デフォルトの名無しさん :2005/08/02(火) 21:29:56
>>663
日本人だからと言って日本語が話せるとは限らない。


668 名前:デフォルトの名無しさん :2005/08/03(水) 02:23:58
結局>646に関しては、
音声データだと思っている香具師と、
波形データと思っている香具師と、
意図的に混乱させている香具師と、
その他の悪乗りがレスしているものの
本人が出てこないもんだから決着つかない罠。

669 名前:デフォルトの名無しさん :2005/08/03(水) 05:49:15
わざわざ難しく解釈して悦に入っている香具師が一人いるだけの希ガス

670 名前:デフォルトの名無しさん :2005/08/03(水) 11:50:10
悦にっていうか、このままじゃ自分だけが馬鹿ってことで決着しちゃうから、
何とか「真相は闇の中」的オチに持っていこうとしてるんでしょう。彼が。

671 名前:デフォルトの名無しさん :2005/08/03(水) 11:57:21
結局、音声データファイルをWAVEファイルと言ってたって落ちでよさそうですが。

672 名前:デフォルトの名無しさん :2005/08/03(水) 12:54:26
671=647?

673 名前:639 :2005/08/03(水) 14:51:14
結局こんな風にした。CGiveValueMethodFunctorはFunctorでなくて関数ポインターにしたかったけど、なぜかコンストラクターが関数ポインターを受け取らないのでFunctorにした
template <class CValue,class CGiveValueMethodFunctor>
class CValueWithGivenFlag
{
public:
bool given;
CValue value_;
CGiveValueMethodFunctor giveMethod_;
CValueWithGivenFlag(CGiveValueMethodFunctor &giveMethod):giveMethod_(giveMethod), given(false){}
CValueWithGivenFlag(CValue &valueInput, CGiveValueMethodFunctor &giveMethod): giveMethod_(giveMethod), given(true), value_(valueInput){}
CValue & value(){
if(given){
return value_;
}else{
giveMethod_(value_, given);
return value_;
}
}
void putValue(CValue &v)
{
given=true;
value_=v;
}
};

674 名前:デフォルトの名無しさん :2005/08/03(水) 16:15:06
struct B { int member; };
std::ostream& operator<< (std::ostream& os, const B& b) { return os << b.member; }
これで、
B b; std::cout << b << std::endl;
が通る。

このベースクラスBを派生すると
struct D : public B {};
D d; std::cout << d << std::endl; // エラー
コンパイルできない。

ベースクラス用のoperator<<()を呼び出すような実装をするとき、
std::ostream& operator<< (std::ostream& os, const D& d) { この部分; }
に何を書けばいいのか教えてください。


675 名前:デフォルトの名無しさん :2005/08/03(水) 16:35:30
>>674
std::ostream& operator<< (std::ostream& os, const D& d){ return os << static_cast <const B&> (d); }


676 名前:デフォルトの名無しさん :2005/08/03(水) 17:53:36
>>674
つ〜か、VC7.1ならそのままで普通に通るんだが。

677 名前:デフォルトの名無しさん :2005/08/03(水) 17:57:50
>>675
そう書いててダメだったのでわからなかったんですが

すげースンマセン! クラス設計変えて、継承をやめてました!
どおりでinvalid static_castエラーのはずだわー
うへえー(´д`;)

678 名前:675 :2005/08/03(水) 18:03:28
>>676
あっほんとだ


679 名前:デフォルトの名無しさん :2005/08/03(水) 19:53:28
誰も聞いてないと思うが、その継承をやめたクラスはダライアスでいうとステージHあたりです。
多重継承はまぞくておもしろいです。

680 名前:デフォルトの名無しさん :2005/08/03(水) 20:03:21
ダライアス継承?
あれはマゾどころか魔窟だ。

681 名前:デフォルトの名無しさん :2005/08/03(水) 20:13:01
クジラとタツノコを多重継承したやつと戦ってみたい

682 名前:デフォルトの名無しさん :2005/08/03(水) 22:15:46
>>673
なんでそんなことに?
>640のほうがはるかにマシに見えるんだが。

683 名前:デフォルトの名無しさん :2005/08/04(木) 00:49:52
そういや、ダライアス継承実装したサンプルってどこかにある?

684 名前:デフォルトの名無しさん :2005/08/04(木) 13:00:57
>>683
そんなにしてほしいのか?

struct A { A() {} virtual ~A() {} };
struct B : public A { B() {} virtual ~B() {} };
struct C : public A { C() {} virtual ~C() {} };
struct D : public B { D() {} virtual ~D() {} };
struct E : public B, public C { E() {} virtual ~E() {} };
struct F : public C { F() {} virtual ~F() {} };
struct G : public D, public E { G() {} virtual ~G() {} };
struct H : public E, public F { H() {} virtual ~H() {} };
struct I : public G, public H { I() {} virtual ~I() {} };

動くかどうか検証はしていない。ご利用は計画的に。

685 名前:デフォルトの名無しさん :2005/08/04(木) 13:17:02
>>684
ダライアス継承は仮想継承にしてなんぼだろうが。

686 名前:デフォルトの名無しさん :2005/08/04(木) 15:23:14
>>685
あとは たのむ

687 名前:デフォルトの名無しさん :2005/08/04(木) 19:49:35
>>684
A::~A() が virtual になっているなら空の B::~B() を手動で定義しなくてよい

688 名前:デフォルトの名無しさん :2005/08/04(木) 22:32:20
>>687
そうなのか?てっきり全部ばらばらの働きをするデストラクタも含めて継承して
この例だとIか、あの最後の奴を継承したときどうなるかってことだと思ってたんだが。
685とあわせて全然修行不足だな。すまん。

689 名前:デフォルトの名無しさん :2005/08/04(木) 22:56:17
動的に確保して値を代入した5次元の配列2つをあるクラスに渡すには
どうすれば?
int a[s][t][u][v][w]
int b[s][t][u][v][w]
という配列に値は入っています。
クラス (ここをどうするか)
{コンストラクタで代入はできますか}

690 名前:デフォルトの名無しさん :2005/08/04(木) 23:02:19
unko::unko((int (*manko)[s][t][u][v])) : chinko(manko) { }

691 名前:デフォルトの名無しさん :2005/08/04(木) 23:20:30
TEST::TEST(int (*kontena)[s][t][u][v])) :kontena2( kontena)
{
}
よくわかりません。解説お願いします。
これでa,b2つの配列ともクラスに渡せて、そのクラスの中で配列に入っている値を得ることが
できますか?
TEST::TEST(int 何か,int 何か){}のようなものを予想していました。

692 名前:デフォルトの名無しさん :2005/08/04(木) 23:22:24
>>691
次元を減らして考えてみろ。

693 名前:デフォルトの名無しさん :2005/08/04(木) 23:25:25
TEST::TEST(int a1[][t][u][v][w],int a2[][t][u][v][w])
{}
こういうことでしょうか?

694 名前:デフォルトの名無しさん :2005/08/04(木) 23:28:12
ありゃりゃ、括弧が2重になってるやん
あーあ俺もいいかげん焼き回ったな

695 名前:デフォルトの名無しさん :2005/08/04(木) 23:29:48
>>693
そう思ったら、聞く前にまず試してみる

696 名前:デフォルトの名無しさん :2005/08/04(木) 23:32:03
だめみたいです。
内部で新たに5次元配列を宣言して渡すという形にしたほうがいい?
動的配列だからその方法もわかりません。

697 名前:デフォルトの名無しさん :2005/08/04(木) 23:38:53
>>696
何がどうダメだったのか、分かるか?

698 名前:デフォルトの名無しさん :2005/08/04(木) 23:43:19
配列が渡ってないようです。
TEST::TEST(int a1[][t][u][v][w],int a2[][t][u][v][w])
{ここになにか}
そりゃ入れないとだめですね。

3次元動的配列をクラスに渡す場合はどうやるのでしょうか?それを応用して考えてみようを思います。
配列の渡しわからねーー。

699 名前:デフォルトの名無しさん :2005/08/04(木) 23:49:05
n次元動的配列って(1次元になるまで多重に)ループで
ひとつ低い次元の配列を要素サイズ分確保してループで埋めて作るやつかね?
そんなの自動で渡る方法なんかないっしょ。
クラス作ってコピーコンストラクタも提供でもせんと

700 名前:デフォルトの名無しさん :2005/08/04(木) 23:51:08
>>699
そうです。自動で渡る方法ないんですか?

701 名前:デフォルトの名無しさん :2005/08/05(金) 00:08:20
動的に確保したんだろ?
TEST::TEST(int***** a1,int***** a2)
これじゃまずいか

702 名前:デフォルトの名無しさん :2005/08/05(金) 00:14:33
その方法わかるんやけど、どうやって配列の値を受け取るかわかる?
こんな風にクラスのある内部関数で
int temp =a1[2][2][4][5][7];


703 名前:デフォルトの名無しさん :2005/08/05(金) 00:30:31
TEST::TEST(int***** a1,int***** a2,int s, int t, int u, int v, int w)

妥協

704 名前:デフォルトの名無しさん :2005/08/05(金) 01:16:34
つかvector使えば?


705 名前:デフォルトの名無しさん :2005/08/05(金) 01:31:13
>>689
コンストラクタで組み込み配列型メンバの初期化は制御できない。全部デフォルトの初期化になる。
つまり無理。

706 名前:デフォルトの名無しさん :2005/08/05(金) 04:07:11
>>691
配列を渡したいのか、配列へのポインタを渡すだけで良いのかによって変わる。
2次元で考えると:

class X {
int **_x, **_y;
public:
X(int **x, int **y) : _x(x), _y(y) {}
};

自分なら、配列や配列へのポインタは扱わず、多次元配列のクラスを使う。
既存品ならBoost.Multiarrayかな。
でも5次元に特化した配列クラスなら1時間もあれば書けるでしょ。
そのクラスのインスタンスを、受け取りたい関数に渡す。

void f(CMultiArray *X, CMultiArray *Y) {}
CMultiArray *A = new CMultiArray(s, t, u, v, w);
CMultiArray *B = new CMultiArray(s, t, u, v, w);
f(A, B);

または、その5次元配列がなんらかの処理とセットで使われるなら、
それらをまとめてひとつのクラスにする。

ハッキリ言って5次元配列とかnewのループまわして作るのめんどいので
配列自体をカプセル化した方が良いよ。

707 名前:デフォルトの名無しさん :2005/08/05(金) 10:37:28
コンストラクタ初期化子で
基底クラスの初期化の前に
派生クラスのオブジェクトを初期化することはできないのでしょうか?


708 名前:デフォルトの名無しさん :2005/08/05(金) 10:39:24
無理。設計を見直しましょう。

709 名前:デフォルトの名無しさん :2005/08/05(金) 10:40:50
>>707
boost::base_from_memberを使えばできる。
http://www.kmonos.net/alang/boost/classes/base_from_member.html

710 名前:707 :2005/08/05(金) 11:19:39
>>708,709
ありがとうございます。
先に派生クラスのメンバを持つクラスを継承しておけば初期化できるんですね。



711 名前:デフォルトの名無しさん :2005/08/05(金) 12:51:35
>>707
そもそも、派生クラスのオブジェクトに依存する基底クラスって設計がおかしい気がするのだが……

712 名前:デフォルトの名無しさん :2005/08/05(金) 13:39:57
doxygenより楽にドキュメント作る方法ないんでしょうか?
Visual Studioに便利がツールが添付されてたりとか・・・

713 名前:デフォルトの名無しさん :2005/08/05(金) 13:42:26
class Base {
  Base(){
    ((Ext*)this)->init();
    this->i = 0;
  }
};
class Ext {
    init();
};
これでひとつ。

714 名前:デフォルトの名無しさん :2005/08/05(金) 17:05:24
>>712
VBCommenter 参考にしてプラグインを”自作”。
ただし C++ 用の CodeDOM は実装されていないので、
気合でパーサ書いて、実装しないとダメかも。


715 名前:デフォルトの名無しさん :2005/08/06(土) 00:52:20
C++でsetjmp(),longjmp()を使ったら例外処理とか
まともに動く保証は無い?

716 名前:デフォルトの名無しさん :2005/08/06(土) 01:05:05
18.7.4 の意味を正確に掴め兼ねるが多分、意訳すると
「catch 句の中へ飛ぶような使い方はするなボケ」で、
それ以外は規格的には大丈夫っぽい。

解釈が間違ってたら誰かふぉろーよろしく。

717 名前:デフォルトの名無しさん :2005/08/06(土) 01:38:38
まぁ、基本的にはC++でsetjmp/longjmp使うぐらいなら例外で処理しとけ。

718 名前:デフォルトの名無しさん :2005/08/06(土) 07:50:32
>>715-716
同じ流れを例外で行えばデストラクタが呼ばれるとき、longjmpを行うと未定義と書いてある。
JIS X3014 18.7

719 名前:デフォルトの名無しさん :2005/08/06(土) 12:50:25
>>718
あー、"解体"ってのがデストラクタのことか。
俺も JIS X3014 を見てたんだけど、
ISO/IEC 14882 のほうがやっぱり読みやすいね。

720 名前:デフォルトの名無しさん :2005/08/06(土) 15:37:27
随伴って何のことかと思ったよ

721 名前:デフォルトの名無しさん :2005/08/06(土) 16:53:54
外部ファイルから読み取った値で,クラスのstatic const メンバー変数を初期化したいのです。
たくさんの(50くらいの)メンバーをこの方法で初期化するため,ファイルを読み込むクラスも作りました。⇒LoadFile
この方法ではうまく初期化できなかったので,別の方針をお尋ねしたいのですが…。
一度mapに全部ファイルの内容を流し込んでしまう方法も考えましたが,流し込む時点ではメンバーの型が
分からないので困っています。(外部ファイルに例えば「L=3」と書いてあっても,mapに追加する時点では
int, double, charのどれに利用するのか分からない)


#include <iostream>
#include "LoadFile.h"
using namespace std;

class Hoge {
   static const int L;
   static const double X;
public:
   int getL() const { return L; }
   double getM() const { return X; }
};

LoadFile fl("test.dat");   //ファイル名を渡すとそこから読み込んでくれるようにしました
/*fl.func();*/   //メソッドはいじれない
const int Hoge::L = 2;
/*const int Hoge::M = fl.getDouble("X");*/   //メソッドはいじれない

int main() {
   Hoge hoge;
   cout << hoge.getL() << endl;
/*  cout << hoge.getX() << endl;*/
   return 0;
}

722 名前:デフォルトの名無しさん :2005/08/06(土) 16:58:38
実行時に動的に初期化することはできません。

723 名前:デフォルトの名無しさん :2005/08/06(土) 17:07:05
>>721
なんで static const になってんの?
Hoge のインターフェースを見ると、メンバに LoadFile 持てばいいだけに見えるけど。

724 名前:デフォルトの名無しさん :2005/08/06(土) 17:09:01
class について質問です。

class A {.....};

int main() { A a[20160]; }

とするとエラーが出ます。
自分で定義したクラスの配列には、制限があるのでしょうか。お願いします。

725 名前:デフォルトの名無しさん :2005/08/06(土) 17:10:03
>>724 エラーが出るならエラーメッセージ貼れ。

726 名前:デフォルトの名無しさん :2005/08/06(土) 17:11:48
デフォルトコンストラクタがないと予想

727 名前:724 :2005/08/06(土) 17:16:30
SIGSEGV です。メモリのアクセス違反でしょうか。
取りあえずコンストラクタ作ってみます。リアルタイムでサンクス。

728 名前:デフォルトの名無しさん :2005/08/06(土) 17:18:55
int main(){
  char c[4ギガ]
}

729 名前:?V?Q?S :2005/08/06(土) 17:30:50
class A のサイズ576ですた(泣。

730 名前:721 :2005/08/06(土) 17:43:17
お二方,どうもありがとうございます。

>>722
そうですか…orz

>>723
staticなのは,Hogeのオブジェクト(複数)間で共通の定数だからですが,
定数なのでconstをつけようとして,おかしくなってきました。
もともとメンバーにLoadFileがあったので,staticだけにする方向で行きます。

731 名前:デフォルトの名無しさん :2005/08/06(土) 21:35:36
他の関数からは見えないけどサブルーチンからだけは見える変数って作れる?

関数{
  変数宣言
  サブルーチン呼び出し


サブルーチン{
  呼び出し元の変数使用


みたいに

732 名前:デフォルトの名無しさん :2005/08/06(土) 21:46:08
またきた・・・

733 名前:デフォルトの名無しさん :2005/08/06(土) 21:46:13
>>731
無理。
そういうのはインタプリタ言語じゃないと難しいと思う。

734 名前:デフォルトの名無しさん :2005/08/06(土) 21:49:28
>>731
サブルーチン内のstatic変数とかじゃダメなん?

735 名前:デフォルトの名無しさん :2005/08/06(土) 21:55:21
サブルーチンって懐かしい言葉だな

736 名前:デフォルトの名無しさん :2005/08/06(土) 22:00:16
>>731 関数とサブルーチンの違いは何なの?

737 名前:デフォルトの名無しさん :2005/08/06(土) 22:01:41
つか引数でわたしゃいいんじゃねーの?

738 名前:デフォルトの名無しさん :2005/08/06(土) 22:06:51
まず考えるのは引数で参照(or ポインタ)渡しじゃないの?

739 名前:デフォルトの名無しさん :2005/08/06(土) 22:19:07
スタックさかのぼるとか
「サブルーチンからだけは見える」は実現できないけど

740 名前:デフォルトの名無しさん :2005/08/06(土) 22:32:22
>>731
擬似的に
void func() {
    struct {
        int internal;
        void routine() {
            hoge(internal);
        }
    } sub;
    sub.routine();
}

741 名前:デフォルトの名無しさん :2005/08/06(土) 22:55:13
>>733-740
マルチすまん
なんか難しそうなことはわかった
素直に参照渡し使うことにする

742 名前:デフォルトの名無しさん :2005/08/07(日) 05:13:56
struct A
{
  A* hello()
  {
    std;;cout _<< "Hello" << std::endl;
  }
  A* operator->()
  {
    std::cout << "A::oprator->()" << std::endl;
    return this;
  }
  A* operator[](const std::string& s)
  {
    std::cout << "A::operator[]()" << std::endl;
    return this;
  }
  A* operator()()
  {
    std::cout << "A::operator()()" << std::endl;
    return this;
  }
};
int main()
{
  A a;
  a->hello()   //OK
  a->();       //error
  a->["hello"];  //error
}
operator->でA*を返してるはずなのにエラーになったりならなかったり
どういうことでしょうか? vc7.1です

743 名前:デフォルトの名無しさん :2005/08/07(日) 05:31:12
>>742
a.operator->();
a.operator()();

744 名前:デフォルトの名無しさん :2005/08/07(日) 05:34:56
>>742
なんでコピペしないで手で写してるの?


745 名前:デフォルトの名無しさん :2005/08/07(日) 09:17:25
>>742
operator []()は普通参照を返すけど。

746 名前:デフォルトの名無しさん :2005/08/07(日) 11:22:49
なんでこう的外れなレスばっか出てくるんだろう。

747 名前:デフォルトの名無しさん :2005/08/07(日) 11:45:24
夏休みだから。

748 名前:デフォルトの名無しさん :2005/08/07(日) 11:51:08
>>742
->の後にはメンバがなければならない。
[]や()はたとえオーバーロードしていようと演算子だから->の後には続けられない。

749 名前:デフォルトの名無しさん :2005/08/07(日) 12:17:37
>>748
"operator"も書けば呼べなくもない

750 名前:デフォルトの名無しさん :2005/08/07(日) 13:37:16
a->operator[]("hello");


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