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


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

C++相談室 part19
501 名前:デフォルトの名無しさん :03/05/24 19:39
>>500
VC++は通らないので注意。
クラス定義の外で
static const int mona::ITTEYOSHI = -2614;
こう定義できる。
ただし、インクルードファイルに書くと多分多重定義で怒られるw

502 名前:デフォルトの名無しさん :03/05/24 19:40
>>501
だから正しいコンパイラなら通るんだって。
VCは標準への準拠度が低いだけ。

503 名前:デフォルトの名無しさん :03/05/24 19:40
VC7.1では通るんじゃない?

504 名前:デフォルトの名無しさん :03/05/24 19:54
>>501
クラス定義の外ならstaticいらんでしょ。
というかstaticつけるとエラーだぜ。

505 名前:デフォルトの名無しさん :03/05/24 20:13
>>502
だれもVCが正しいコンパイラとは言ってない。

506 名前:デフォルトの名無しさん :03/05/24 20:18
某島の信者の中の人も大変だな。

507 名前:デフォルトの名無しさん :03/05/24 20:23
>>495
整数定数ならな。
小数や配列(文字列)、ポインタは不可。
ヘッダファイルで直接定数を定義する場合も整数だけだから注意ナ。

何でこういう仕様になっているかというと、
整数定数の場合はアドレスを要求する必要がないからだ。
言い換えるなら、コード中に直接値を埋め込む事ができるからだ。

ポインタは論外として、
アセンブリ言語やってりゃ分かるが、
小数はコード中に直接値を埋め込む事ができないのが普通だし、
配列も定数を一要素だけ参照する分には問題ないが
変数でインデックスを指定するとどうにもならない。

ということだ。

508 名前:デフォルトの名無しさん :03/05/24 20:23
>>503
はい。VC++7.1では通ります。

509 名前:デフォルトの名無しさん :03/05/24 21:13
現行のVC++よりもマシとはいえ、某のコンパイラもまだまだ正しいものとは言えない。

510 名前:デフォルトの名無しさん :03/05/24 21:20
VC7.1でBCCはMSに準拠度で追い抜かれます。
g++,vc++,bccの中でlokiやboost::lambdaが通らないのはbccだけになります。

511 名前:デフォルトの名無しさん :03/05/24 21:23
その頃にはC++Builder7出てるんじゃない?何とも言えんけど。
それと、OpenWatcomとか火星とかは?

512 名前:デフォルトの名無しさん :03/05/24 21:24
>>511
MarsやWatcomは知名度からして負けてます。
g++,vc++,bccが今の3大C++コンパイラと言っていいでしょう。
iccなんて一部の数値計算分野でしか使われないでしょうし。

513 名前:デフォルトの名無しさん :03/05/24 21:27
>>511
VC7.1はもうすでに出てます
http://internet.watch.impress.co.jp/www/article/2003/0422/vstudio.htm

514 名前:デフォルトの名無しさん :03/05/24 21:35
C++インタプリタのCINTってどの程度動くものなんですか?
iostreamやSTLも普通に使えてクラスも定義できるんですか?

515 名前:Addicted to C++ ◆cpp/Sz/v02 :03/05/24 21:55
私のCodeWarriorが出てこないのはなぜ(ToT)

516 名前:デフォルトの名無しさん :03/05/24 22:16
コード戦死はかなり強力だよね。使ったこと無いけど。

517 名前:445 :03/05/25 01:28
自分で調べたよ。
fstream::~fstream()は基本的に例外を投げないようになってる。
fstream::close()は失敗でsetstate(failbit)する(マスクに応じて例外を投げる)。

つまり、閉じるときのエラーを逃さないようにするためには、
fstream::close()を明示的に呼ばなければならない。
デストラクタに任せてしまうと、閉じるときのエラーは検知できない。

明日からはfstream使った後は明示的にcloseしよう。

518 名前:デフォルトの名無しさん :03/05/25 01:47
CWはCWでクセがあるからなあ・・・

519 名前:デフォルトの名無しさん :03/05/25 01:56
CWってeclipseみたいなツールなの?

520 名前:デフォルトの名無しさん :03/05/25 02:17
CWはIDEとコンパイラのセットだけど
VS.NETとはまた違った趣があるね
使いやすいとは思わなかった

521 名前:デフォルトの名無しさん :03/05/25 02:27
>>517
がんがったね

522 名前:445 :03/05/25 02:40
>>521
もしかして常識だったのかもしれんが、
漏れはいままでfstream::close()を使ったことがなかった。

523 名前:デフォルトの名無しさん :03/05/25 15:18
すません。C++一ヶ月未満の超初心者です

struct p { int A; int B; double C; }

...

p *pp = new p;
p->A= x;
上記のように、ある構造体をnewで生成したのにデバグでアドレスを参照すると0x00000000になってしまいます
どうすればいいでしょうか?普通newすると新たなアドレスがセットされると思うのですが・・・
これって、newに失敗したってことなんでしょうか?

524 名前:デフォルトの名無しさん :03/05/25 15:24
デバグでアドレスを参照って、具体的にどうやったの?

525 名前:デフォルトの名無しさん :03/05/25 15:38
説明不足で申し訳ないです。
デバグモードで起動させるとそこの処理でエラーになるので
「なんでかなー」と見てみると、newされた変数(?)のポインタが0x0000000になっているので
再度、ブレークポイントを宣言場所にセットして確認しました。

newの命令後はその変数が0x0000000になってしまっているようです。
ウォッチと、変数のウインドウで確認しました。
ためしに別のプロジェクトでちょっとした構造体をnewで生成してみると
普通に新たに生成されたアドレスがセットされました。
どうやら、今使ってるプロジェクトのみに発生する問題のようです。
ちなみに、構造体は線形リスト形式で内部で2つの同一構造体のポインタを保持する形式になっています。

struct Node {
int id;
int data;
Node *prev, *next;
};
となっています。

526 名前:525 :03/05/25 15:39
文章変ですね。

デバグモードで起動させるとそこの処理でエラーになるので 「なんでかなー」と見てみると

エラーになるので「なんでかな」と思ってデバグモードで実行すると・・・です

527 名前:デフォルトの名無しさん :03/05/25 15:42
>>525
そこまでの情報ではせいぜいコンパイラは VC6かな、と
コンストラクタで何か起きてるんじゃないか、というぐらいしかわからん

528 名前:523 :03/05/25 15:45
>>527
せいぜいのVC6です。
コンストラクタでの問題ですか。むー困りました


529 名前:デフォルトの名無しさん :03/05/25 16:01
>>514
出来るよ。フリーなんだからちょっと使ってみればいいじゃん。
メンバーテンプレートも使えるし、それなりにそれなりかと。
でも、
#define INCLUDEFILE <includefile>
#include INCLUDEFILE
ってのが通らないから boost の config がinclude 出来ないんで
boost使うには結構 boost の方に手を入れる必要がある。

530 名前:デフォルトの名無しさん :03/05/25 16:01
最適化はOFFにしてるよねえ・・・

531 名前:デフォルトの名無しさん :03/05/25 16:11
>>528
もしコンストラクタは書いてないのならとりあえず除外して
(むー困りました、じゃあるのかないのか分からん)
他にあるとしたら
・ヒープ破壊されてたり。ヒープ検査関数をnewの前に呼んでみるとか
・他のメモリ破壊(スタック, レジスタなど)
・本当にメモリが足りないとか
・もしアロケータを自分で書いてるとしたらそこをチェック(笑)


532 名前:523 :03/05/25 17:16
すみません。ふて寝してました
よし、こーなったら原因をしっかり理解するまではやめないぞー!

さて、
>もしコンストラクタは書いてないのならとりあえず除外して
コンストラクタがかかれていないってのも微妙に分からないのですが
もちろん、線形リストはオブジェクトではあります。
初期に先頭ノードと最終ノードを生成していますが
今回の問題地点とはちょっと違います。

で、問題の場所は線形リストへのリスト追加用メンバです。
処理としては先の構造体を使って
node nをnewで作成。
最終ノードの次ノード(最終ノード->next)ポインタにnのポインタをセット
nの前ノード(n->prev)に最終ノードポインタをセット
dataに値をセット
という処理です。ここで、nがしっかり生成されないのでnの前ノードに最終ノードポインタをセット
でメモリ(?)エラーになります。
ヒープ破壊ってのは怖いですね。ヒープ検査関数ってどんなのか「超駄目初心者」の私には検討つきませんが
ちと、MSDNでも調べてやってみます。

533 名前:523 :03/05/25 17:19
>>530
最適化・・・えと、どこ見ればいいですかね
本当に何も知らないですみません。

534 名前:デフォルトの名無しさん :03/05/25 17:35
先頭/最終ノードを予め生成するタイプだったら、
最終ノードの直前に挿入するんでないの?

535 名前:デフォルトの名無しさん :03/05/25 18:03
えーと、先頭・最終は持っていません。ポインタ変数のみクラスで持っています
@(=初期ノードポインタ) prev NULL nextA
A prev @ next B
B prev A next C
C(=最終ノードポインタ) prev B next NULL
といった感じになってます。でさらに追加する場合
node *n= new nodeでまず、nを生成して
n->prev= (最終ノードポインタ);
n->next= NULL;
(最終ノードポインタ) = n;
私の(小さな)脳味噌だとこれで最終ノードにnというノードが追加されたと思うのですが・・・。

536 名前:デフォルトの名無しさん :03/05/25 18:05
>>523
えーと、状況把握ですけど、具体的にはppに0x00000000が代入されるってことだよね。
それで、
>>532
失敗するノードって後のほうかな?最初の1個2個はOKで30万個くらいで失敗するとか?

537 名前:523 :03/05/25 18:06
ところで、クラス内に別のクラスのポインタを保持しておくことは可能ですよね?
で、実はその先に宣言しているクラスポインタに対してコンストラクタでnew生成しています

で、途中で
delete [クラスポインタ変数] ←内容をクリアしたいのでいったん開放
[クラスポインタ変数]= new [class]  ←再度生成。
でその後、追加命令を出してるんですが、
これが原因くさいなーと思ってきました

538 名前:デフォルトの名無しさん :03/05/25 18:07
〜2ちゃんねらの予言〜
北朝鮮の現体制が崩壊したとき、いったい何が起きるか。
2ちゃんねらの一人として、あらかじめ予言しておきます。
1)にわか反体制運動家の出現
 それまで金正日体制に取り入ることができずに冷飯を食わされていた人間が、ある日突然
 「俺は独裁に反対したためにずっと睨まれていたんだ」と言い出します。まるで金正日の
 影響力が安全なレベルに下がるのを待っていたかのように、それまで名前も顔も存在も
 知られていなかった「反体制運動家」が雨後のタケノコのごとくあちこちから出現。
 体制崩壊の主要因が経済破綻だったにもかかわらず、まるで独裁政治を終焉に導いたのが
 自分の手柄であるかのように自慢げに振舞います。
2)みんな「俺は強制されていた」
 それまで金正日を将軍様と呼び、進んで独裁体制を支持していた人たちは、体制が後戻り
 できないところまで破綻したのを見抜くやいなや「自分は騙されていたんだ!」「強制されて
 いたんです!」と、自分たちも独裁政治の被害者であったことをアピールしはじめます。
 まるで恋人に騙された女子高生のようにつぶらな瞳をパチクリさせながら、「純真な自分」が
 意に反する支持を独裁者から強制されていたことを世界に向けて訴えます。
3)独裁体制が続いたのは日本のせいだ
 そして「にわか反体制運動家」と「騙されていた善良な人たち」は口をそろえてこう言い出します。
 「あんなひどい独裁体制が21世紀まで続いたのは、日本が経済支援をしたからだ!」
 「金正日体制を裏で支えたのは日本だ!」
 「北朝鮮に独裁国家があったのは、日本のせいだ!」
 「日本は復興を支援して当然だ!」
これ、絶対当たりますから、あちこちに貼っておくといいですよ(笑)。
そのときに「ああ、そんなことは日本では前からネットで予想されてましたよ。」
と言って微笑むためにも、ね

539 名前:523 :03/05/25 18:10
>>536
>えーと、状況把握ですけど、具体的にはppに0x00000000が代入されるってことだよね。
そうです。ppをnewで生成すると、中身が0x00000000のNULLで帰ってきます
デバグヒープで確認しました(newの中身見てても良く分かりませんでしたがw)

>失敗するノードって後のほうかな?最初の1個2個はOKで30万個くらいで失敗するとか?
それだったら、まだあきらめつくんですが。実は生成後1回目(つまりコンストラクタ)での
1つ目(初期ノード)は普通にnewで生成されるんですが、次に追加メンバ関数からnewしようとするとNULLで帰ってきます。

540 名前:523 :03/05/25 18:12
あー。。。同じ場所に普通にクラス宣言するとコンストラクタ上の1回目から
エラーが出てきますねー
ということは、それ以前の処理でヒープ領域を使い果たしてる!?
そんな馬鹿なーw


541 名前:デフォルトの名無しさん :03/05/25 18:16
>>539
> 実は生成後1回目(つまりコンストラクタ)での1つ目(初期ノード)は普通にnewで生成されるんですが、次に追加メンバ関数からnewしようとする
生成がコンストラクタだろ?生成後1回目がなんで「つまりコンストラクタ」なんだ?
生成後の1つめが初期ノードってのもおかしくないか?
「追加メンバ関数」ってなんだ?
わけわからん。
ソース晒せば?

542 名前:デフォルトの名無しさん :03/05/25 18:19
>>539
今のところの事情だと
struct Node{
int id;
int data;
Node *prev, *next;
};
int main(){
Node *n1 = new Node;
Node *n2 = new Node;
}
このn2に0が入ることになるけど、どう?

543 名前:デフォルトの名無しさん :03/05/25 18:26
生成はコンストラクタとはつながらないだろ。C++の基本だ

文章は変だが意味としては
クラス宣言後の1つ目の処理=コンストラクタ
で使ってるnewは問題ないって言ってるんだろうな

たしかに文章力無いなら、ソース晒すのが一番早い

544 名前:523 :03/05/25 18:29
うう。必要ない所削って晒そうかな・・・
削ってたら動いちゃったりして・・・
どうも、問題ある呼び出し場所からどんなnewを使っても必ず0で帰ってきます

545 名前:デフォルトの名無しさん :03/05/25 18:30
文章力あっても、本人の思惑とコードが全く別物ということがあるので、
ソースを晒さない限りわかるわけがない。

546 名前:デフォルトの名無しさん :03/05/25 18:34
>>544
つーかおまえさ。
そんなことは普通聞く前に最低限することだろ。
デバッグの心構えがなってなくないか?

547 名前:デフォルトの名無しさん :03/05/25 18:38
>>546
つーかおまえはスレきちんと嫁
>>523
>すません。C++一ヶ月未満の超初心者です


548 名前:デフォルトの名無しさん :03/05/25 18:41
ブレークポイント設定してデバッグしたりするスキルは十分あるんだからそれは言い訳にはならんだろ。

549 名前:デフォルトの名無しさん :03/05/25 18:42
>問題ある呼び出し場所からどんなnewを使っても必ず0で帰ってきます
内容を見てる限り、問題の個所よりも前で不正処理があると思う

どうでもいいが
削らないとデバグできない>>546に問題あると思うけど?
大掛かりなプログラムを1つも組んだこと無いだろ

550 名前:デフォルトの名無しさん :03/05/25 18:43
再現する最小限のコードをさらすこと。
バグ発見依頼するときには当然すべきことだよな。

551 名前:デフォルトの名無しさん :03/05/25 18:45
546だけど。
何ゆえ
> 削らないとデバグできない>>546に問題あると思うけど?
という結論が導き出されるのかは知らんが
523は事実削らないでデバッグできてねーんだから削るしかないだろ

552 名前:デフォルトの名無しさん :03/05/25 18:47
>>547
意味がわからん。削るっていうやり方はもう知ってるみたいだから
初心者とか関係ないと思うんだが。

553 名前:デフォルトの名無しさん :03/05/25 18:53
>>552
それもそーだね

(´-`).oO(ズイブンケズッテルナァ)

554 名前:デフォルトの名無しさん :03/05/25 18:55
実は
Node::Node()
{next = new Node;}
という落ちではなかろーか

555 名前:デフォルトの名無しさん :03/05/25 18:56
>>540
VC6みたいだから試しに #include <crtdbg.h>して
アプリの最初で
_CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_CHECK
_ALWAYS_DF );
をやるようにしてみると、ヒープ破壊が発生したらその次のメモリ確保か開放のタイミングで
デバッグ情報が出るはず。

556 名前:デフォルトの名無しさん :03/05/25 18:57
>>554
0すら返ってこないんじゃ・・・

557 名前:デフォルトの名無しさん :03/05/25 18:59
デバッガの表示が正しくないだけで問題は全然別の場所にあるって可能性は無いのか?

558 名前:デフォルトの名無しさん :03/05/25 19:00
>556
ヒープの確保に失敗した時点で、次のコンストラクタは呼ばれず、
一回目は正常終了する。むろん、充分スタックが在れば、の話

559 名前:デフォルトの名無しさん :03/05/25 19:06
相談するときは
ごちゃごちゃ言うより、ソース一行のほうが漏れは好きだナ。
曖昧な日本語の読解よりCのほうがすっきりしてるってことない?

560 名前:デフォルトの名無しさん :03/05/25 19:08
>>559
言葉の定義が全て明文化されるもんな。

561 名前:デフォルトの名無しさん :03/05/25 19:21
>>560
まさしく。ソースレベルなら実行してみれば
処理系特有のバグも発見できます。

562 名前:デフォルトの名無しさん :03/05/25 20:06
ソースまだかなー。
って、実は削ってる最中に原因見つかって事故解決しちゃってる罠の確率が高いのでは
初心者をまた一歩成長させましたな。

というか、バグは事故解決しましょう

563 名前:523 :03/05/25 20:47
自分で解決できないでごめんなさい。
でも、確かに削ってみるってのはデバグとしては有効な手段のようですね
本当に無知でごめんなさい

動く状態と動かない状態。どちらも確認できました・・・・が!
その違いは問題のクラスとはまったく関係ない場所でした。
しかも、クラスとは関係ない配列にデータ入れてるだけですし。

もはやまったく理解不能です。でもここまで来たら>>562さんが言うように
自分で解決させなければならないと思います。皆さん色々ありがとう。

564 名前:デフォルトの名無しさん :03/05/25 20:48
>>563
配列にデータ入れてるってのがメモリ破壊の典型的な原因行為なんだが。
その配列のために実際に確保されてるサイズを超えて書き込んだんじゃないの?

565 名前:デフォルトの名無しさん :03/05/25 22:22
>>564
どうやら、ヅボシです。
コンパイルエラーが発生しないことを良いことに
[struct] A= new [struct]で宣言した変数を
そのまま配列として扱ったのが問題だったようです。
どうも、VBでの癖が抜けなくて、配列を甘く見すぎていたようです。
まぬけすぎでしたね。すみませんでした

566 名前:デフォルトの名無しさん :03/05/25 22:53
>>565
VB→C++、か。
だいたんな選択だな。
C抜きで逝こうとは。
悪いことではないが。

567 名前:デフォルトの名無しさん :03/05/25 22:55
std::vector使うといいかも。
もっともサイズ超えて書き込むとだめなのは同じだけど(^^;
ただdeleteの手間省ける。(例外に対処するなら必要だろうし)


568 名前:デフォルトの名無しさん :03/05/25 23:00
あ、Cはかなり昔ですが基本程度は触ってました
でもあくまで入門レベルで終わってました。

やっぱり、VBの方が簡単という理由で使ってましたが
今作っているソフトがインタプリタではちと辛いのでVCに移行ということで
とりあえずC++の勉強に励んでます。

569 名前:523 :03/05/25 23:03
ついでに初歩的な質問なのですが
newで生成した変数に配列を突っ込むことは駄目なんですよね?
たとえば
pp *p_1= new pp と宣言しておきながら
p_2[10]の配列を
p_1= p_2
といった感じで。

570 名前:デフォルトの名無しさん :03/05/25 23:36
>>569
どういう意味でだめだと思ってるのかわからないけど、
ポインタ変数に配列を入れること自体は別にOK、ていうか常套。
p_1の値をどこかにとっておかないと後でdeleteできない、て言う意味ではだめ。

話は違うけど配列をnewで作りたいときは
p_1 = new [サイズ] pp;
解放は
delete [] p_1;//サイズは書かなくていい
もう知ってるかもしれんけど。

571 名前:デフォルトの名無しさん :03/05/25 23:40
>>569
pp * p_1 = new pp; // pp型のオブジェクトを作り、そのアドレスをp_1に入れる
pp p_2[10]; // pp型の要素数10の配列
p_1 = p_2; // p_1が差している先のオブジェクトは放置して、p_1はp_2を指すようにする

この結果は、p_1が先に差していたオブジェクトはどこからも参照されなくなり
メモリリーク状態になる。
またp_1が差しているのはp_2そのものなので
p_1[3]を書き替えると p_2[3]が書き換わる。

うーん、入門書読むべし

572 名前:デフォルトの名無しさん :03/05/25 23:50
本当にすみません。
親切にありがとう

つまり、ポインタの書き換えを安易に行うと痛い目にあうということですね。
というか、今もdeleteでエラってしまってるんですが・・・
どうやら、またnewで生成した配列関係が原因のようです
システムを破壊しそうなプログラムを組まないように注意しないといけないですね。

>>567さんが言っていたstd::vectorをちと見てみます。

573 名前:デフォルトの名無しさん :03/05/26 00:24
boostってライブラリのboost::shared_ptrやboost::scoped_ptrのあたりは便利、delete忘れが無くなる。
ttp://www.kmonos.net/alang/boost/classes/shared_ptr.html
ttp://www.kmonos.net/alang/boost/classes/scoped_ptr.html
開放する必要のあるリソースはデストラクタ使って開放しましょう。
一応std::auto_ptrもあるけど・・・


574 名前:デフォルトの名無しさん :03/05/26 00:31
C++一ヶ月の人に教えたら余計混乱するだけだと思われ・・・

575 名前:デフォルトの名無しさん :03/05/26 09:04
俺、boostのありがたみがわかったのは
C++の勉強初めて1年以上経ってからだったからなぁ。

576 名前:デフォルトの名無しさん :03/05/26 13:13
stream系クラスでは、たとえば

fstream in(filename);
if(!in) ...
と書くことができますよね。この if(!in) みたいナノを自分のクラスで実現したいのですがどう書いたらいいんですか?

577 名前:デフォルトの名無しさん :03/05/26 13:24
class FileListener {
virtual Opened() = 0;
}
class File {
File( const char* filename, FileListener* listener ) {
fstream in(filename);
if( ! in ) listener -> Opened();
}
}
>>576 ってことか?

578 名前:デフォルトの名無しさん :03/05/26 13:28
>>576
operator bool() const でも実装しとけばー

579 名前:デフォルトの名無しさん :03/05/26 13:39
>>576
if ( !in ) しか使う気がないなら
bool operator!()const

if ( in ) とか使いたいなら
>578か operator void*()const
ただしデメリットが大きめなのでおすすめできない。
(in + 1 とか void* p = in が通るようになる)


580 名前:デフォルトの名無しさん :03/05/26 21:34
んー、iostreamはよく考えられて作られてるけど、
クラスの見本としては最悪の部類に入るから
まねしないでいいよ

581 名前:デフォルトの名無しさん :03/05/26 23:34
C:\My Documents\c++\box\box.rc (55): error RC2135 : file not found: 0

こんなエラーが出たんですが、どういう意味なんでしょうか?


582 名前:デフォルトの名無しさん :03/05/26 23:40
ファイルがありません

583 名前:r :03/05/26 23:42
ファイルがないんじゃないの?
プロジェクト(?)にないファイルをincludeしてたりするんじゃない?
つーか、どんな処理系を使ったのかを書くと、漏れ以外の詳しい人が説明をくれるよ。
つーか、#include <0>とか#include "0"って書いてない?

584 名前:デフォルトの名無しさん :03/05/27 00:11
C++のクラスでVBのようなプロパティを実装するには
どうしたら出来ますかね?

オーバーロードとテンプレートを使えば汎用的に
実装できそうな気はするのですが…

Get〜Set〜はもう嫌だヽ( `Д´)ノウワァァァァン

585 名前:581 :03/05/27 00:23
えっと、使ってるのはVC++の6.0です。
box.rcファイルはちゃんと存在してます。
フォルダ内のファイルを変に動かしたりしたこともないはずなのですが……

586 名前:デフォルトの名無しさん :03/05/27 00:35
>>584
__declspec(property)

587 名前:584 :03/05/27 02:01
>>586さん
回答どうもですm(__)m
しかしそれはVC依存ですよね?
同様にBCB依存で__propertyとかもあるみたいですが、
私が知りたいのはC++の機能?を駆使しての実装なんです 汗)
(処理系に依存するのは何か嫌なので)

うぅ聞いてるくせに生意気言ってすいませんです(TT)

588 名前:デフォルトの名無しさん :03/05/27 02:24
class TMyClass
{
 int GetProp();
 void SetProp(int Value);
 class TProp
 {
  TMyClass *FThis;
 public:
  TPorp(TMyClass *This) : FThis(This) { }
  operator int () { return FThis.GetProp; }
  operator = (int Value) { FThis.SetProp(Value); }
 }
 friend TProp;
public:
 TProp Prop;
 TMyClass() : Prop(this) { }
}

こんな感じ?(コンパイルできるかどうかは確かめてません)
#ifdefで__propertyや__declspec(property)に切り替えられるようにしといた方がいいかも。

589 名前:デフォルトの名無しさん :03/05/27 02:38
class TMyClass
{
 int GetProp();
 void SetProp(int Value);
 struct TProp
 {
  TMyClass *This;
 public:
  TProp(TMyClass *This);
  operator int () { return This->GetProp(); }
  void operator = (int Value) { This->SetProp(Value); }
 };
 friend TProp;
public:
 TProp Prop;
 TMyClass() : Prop(this) { }
};

コンパイルできるようにして見た。

590 名前:デフォルトの名無しさん :03/05/27 03:02
もう寝たかな?まあいいか。勝手に続けてます。
ちょっと凝ってみた。

#ifdef __BORLANDC__
#define PROPERTY(T, N) __property T N = { read = get_##N, write = set_##N }
#define PROPERTY_INITIALIZATION(T, N) dummy_##N()
#define PROPERTY_IMPLEMENTATION(T, N) int dummy_##N[0]
#else
#define PROPERTY(T, N) property_##N N
#define PROPERTY_INITIALIZATION(T, N) N(this)
#define PROPERTY_IMPLEMENTATION(T, N) \
struct property_##N \
{ \
self_type *_this; \
public: \
property_##N(self_type *t) : _this(t) { } \
operator T () { return _this->Get##N(); } \
void operator = (T v) { _this->Set##N(v); } \
}; \
friend property_##N
#endif

591 名前:デフォルトの名無しさん :03/05/27 03:03
template<class T, typename V>
class property {
public:
typedef T class_type;
typedef V value_type;

typedef const value_type& (T::*get_func_type)(void) const;
typedef void (T::*set_func_type)(const value_type&);

public:
property(class_type* pthis, get_func_type gf, set_func_type sf)
: cls_ptr(pthis), get_func(gf), set_func(sf) { }

const value_type& get(void) const { return (cls_ptr->*get_func)(); }
property<class_type, value_type>& set(const value_type& v) { (cls_ptr->*get_func)(v); return *this; }
operator const value_type&() const { return (cls_ptr->*get_func)(); }
property<class_type, value_type>& operator =(const value_type& v)
{ (cls_ptr->*set_func)(v); return *this; }

private:
class_type* cls_ptr;
get_func_type get_func;
set_func_type set_func;
};

property<class name, value type> prop;
コンストラクタで
prop(this, &class::getter, &class::setter)

昔何処かでこんなヤツみたんだよなー。とりあえず動いた。
たまに使えないけど、エラーが出たときは()で囲めば大抵通るよ。
それでも通らないときはget,setを直接。

592 名前:デフォルトの名無しさん :03/05/27 03:04
↑の使用例

#include<iostream>

class TMyClass
{
int FProp;
int get_Prop() { return FProp; };
void set_Prop(int Value) { FProp = Value; };
typedef TMyClass self_type;
PROPERTY_IMPLEMENTATION(int, Prop);
public:
PROPERTY(int, Prop);
TMyClass() : PROPERTY_INITIALIZATION(int, Prop) { }
};

int main()
{
TMyClass o;
o.Prop = 1;
std::cout << o.Prop;
return 0;
}


593 名前:592 :03/05/27 03:05
ごめんなさい。>>592>>590
レス番号省略するとこういうことに(汗

594 名前:デフォルトの名無しさん :03/05/27 03:06
つか、
property<class_type, value_type>& set(const value_type& v) { (cls_ptr->*set_func)(v); return *this; }
だな。しかもインデントされてねぇ。

595 名前:591 :03/05/27 03:08
>>593
タイミング悪かったスマソw

596 名前:584 :03/05/27 03:33
>>592さん(588さんかな?)

すいません ちょいと手酌で酒飲んでました 汗)

すごい!!正直感動しました。
friendクラス、マクロ、テンプレートの集大成じゃないですか!!

改めて2chプログラム板の実力を見せ付けられた気がします
(むしろ592さんかなw)

ホントもうこのまんま頂戴させていただきます^^;
ありがとうございましたm(__)m

by いつかこんなコードをスラスラ書く事を夢見る584

597 名前:デフォルトの名無しさん :03/05/27 10:21
10年くらい前に似たようなのかいたな

excelのシートとかでメンバを管理しといて、
ボタン->VBAでヘッダとcppをはき出すようなのをつくっとくと幸せになれるかも


598 名前:デフォルトの名無しさん :03/05/27 10:58
↓みたいに書いてみた、処理系依存だけど、コンストラクタでの初期化はいらない。

#define property( result_t, class_t, Name ) \
class Name##_t{ \
class_t const* get_parent(void) const{ \
return reinterpret_cast< class_t const* >( reinterpret_cast< char const* >( this ) - \
( reinterpret_cast< char const* >( &static_cast< class_t* >( 0 )->Name ) - \
reinterpret_cast< char const* >( 0 ) ) ); } \
public: \
operator result_t(void) const{ return get_parent()->get_##Name(); } \
operator result_t(void){ return const_cast< class_t* >( get_parent() )->get_##Name(); } \
template< typename T > Name##_t const& operator=( T const& value ) const{ \
get_parent()->set_##Name( value ); return *this; } \
template< typename T > Name##_t& operator=( T const& value ){ \
const_cast< class_t* >( get_parent() )->set_##Name( value ); return *this; } \
} Name



599 名前:デフォルトの名無しさん :03/05/27 10:58
class A
{
public:
property( int, A, PropInt0 );
property( int, A, PropInt1 );
private:
int propInt0_;
int get_PropInt0(void) const{ puts( "get PropInt0" ); return propInt0_; }
void set_PropInt0( int value ){ puts( "set PropInt0" ); propInt0_ = value; }
int get_PropInt1(void) const{ puts( "get PropInt1" ); return 5; }
};

int main()
{
A a;
a.PropInt0 = 10;
printf( "%d\n", (int)a.PropInt0 );
//a.PropInt1 = 10; // Error: PropInt1 is readonly
printf( "%d\n", (int)a.PropInt1 );
}


600 名前:デフォルトの名無しさん :03/05/27 11:07
>>596
>ホントもうこのまんま頂戴させていただきます^^;

何に掲載するの? あなた、ライターか何か?

601 名前:デフォルトの名無しさん :03/05/27 11:54
>>600
>何に掲載するの? あなた、ライターか何か?

どこに掲載するって書いてあるの? あなた、電波か何か?

602 名前:デフォルトの名無しさん :03/05/27 13:05
>>581
やっぱ、55行目付近に何か変なこと書いてあるとしか思えん。

603 名前:デフォルトの名無しさん :03/05/27 14:00
enumについて質問なんですが、
enumで宣言した変数は、enumの値もしくはenumの型名でキャストした整数しか代入できないということはわかるのですが、
enum型ではないint型の変数になぜenum型の数値を(たとえばredとか)代入できるのでしょうか?

604 名前:_ :03/05/27 14:04
http://homepage.mac.com/hiroyuki43/jaz07.html

605 名前:デフォルトの名無しさん :03/05/27 14:23
>>603
便利だから

606 名前:デフォルトの名無しさん :03/05/27 14:26
>>603
enumが元々int型だから

607 名前:デフォルトの名無しさん :03/05/27 14:51
>>603
そういう仕様だからです。

http://www.kuzbass.ru/docs/ansi_iso_iec_14882_1998.pdf
7.2 の 8 を見るべし。

608 名前:デフォルトの名無しさん :03/05/27 17:05
void ShowMyBMP(HWND hWnd, HDC hdc)
{
HDC hmdc;
HBITMAP hBitmap;
BITMAP bmp;
HINSTANCE hInst;
int BMP_W, BMP_H;

hInst = (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE);
hBitmap = LoadBitmap(hInst, "IDB_BITMAP1");
GetObject(hBitmap, sizeof(BITMAP), &bmp);
BMP_W = (int)bmp.bmWidth;
BMP_H = (int)bmp.bmHeight;
hmdc = CreateCompatibleDC(hdc);
SelectObject(hmdc, hBitmap);
BitBlt(hdc, 0, 0, BMP_W, BMP_H, hmdc, 0, 0, SRCCOPY);
StretchBlt(hdc, 0, BMP_H, BMP_W / 2, BMP_H / 2, hmdc, 0, 0, BMP_W, BMP_H, SRCCOPY);
DeleteDC(hmdc);
DeleteObject(hBitmap);
return;
}

この関数を呼び出すとすごい勢いで凍り付きます。
IDB_BITMAP1はリソースエディタで作成したBMPです。
何が良くないんでしょうか?

609 名前:デフォルトの名無しさん :03/05/27 17:11
原因かどうかは知らんが、"IDB_BITMAP1" は明らかに間違ってるだろ。
しかしスレ違い。

610 名前:デフォルトの名無しさん :03/05/27 18:04
>>608
"IDB_BITMAP1" → IDB_BITMAP1 が気になる点。
あと、SelectObject する時は戻り値を保存しといて、
あとでそれを SelectObject するべし。
あと、hBitmap と hmdc が正常に得られてるかのエラーチェックくらいはすれ。

あと、すごい勢いでスレ違い。
C だし、環境依存の話題だし。

ついでに言うなら、BMP_H, BMP_W って変数名にするんだったら
型を const int にしなされ。
変数名は大文字では始めないのが普通。

>>609
リソースIDは文字列もいけるよ。
ただし、リソースIDを文字列にしてればだけど。

611 名前:デフォルトの名無しさん :03/05/27 18:13
c++でディレクトリ操作やファイル操作をするのに
何かクラスとかが用意されているのでしょうか?

いろいろとぐぐったのですが
VC++やBCBなど開発環境に依存するものばかりヒットしてしまいます。

それともcのファイル構造体を使用するのですか?


612 名前:デフォルトの名無しさん :03/05/27 18:17
>>611
ディレクトリ操作は標準ではサポートされていません。
ファイル操作には fstream, ifstream, ofstream が使えます。

613 名前:608 :03/05/27 18:43
>609,610
ありがとうございました、おかげで謎の一部は解けました。
しかしまだ正常に動かないので、C質問スレに逝ってきます

614 名前:デフォルトの名無しさん :03/05/27 19:16
複数の基本クラスの仮想関数を区別して実装したいのですが、
VC++で

class BaseA{ virtual void Hoge() = 0; };
class BaseB{ virtual void Hoge() = 0; };
__interface BaseC{ virtual void Hoge() = 0; };

class Derived : public BaseA, public BaseB, public BaseC
{
 virtual void BaseA::Hoge(){} // 出来る
 virtual void BaseB::Hoge();
 virtual void BaseC::Hoge();
};

void Derived::BaseB::Hoge(){} // 出来ない、error C2509 'Hoge' が宣言されていません。
void Derived::BaseC::Hoge(){} // 出来る

という風に、クラスの外で定義しようとするとエラーになります。
MS独自の__interfaceなら可能ですが、メンバを持てないので今回の場合使えません。
インラインにして別のメンバ関数にリダイレクトするなど回避方法が無いわけではないのですが、どうにも納得いかないので、もしどなたか解決方法をご存知でしたら教えてください。

615 名前:デフォルトの名無しさん :03/05/27 19:41
>>614
なんでもかんでも仮想関数にすればいいというものではない。

616 名前:デフォルトの名無しさん :03/05/27 19:56
>>615
それはもちろんそうなんですけれど。
今回は別にこれがネックになってプログラムが進められない、ということじゃなくて。
ただ、何ゆえこれがエラーになるのか、エラーにならない正しい方法が無いのかと思いまして。

617 名前:スレ違いだったらごめんなさい :03/05/27 20:00
c++から入る人用の本を探しています。
ちなみに、高校時代に「はじめてのC++」塚越一雄
を教本に勉強しようとしていたのですが
そんなに進む前に受験により中断を余儀なくされました。
また始めるに当たり、より良い物があれば、と思い質問しました。

618 名前:デフォルトの名無しさん :03/05/27 20:03
>>617
推薦書籍集 -Recommended Books For Programmer-
http://bookshelves.tripod.co.jp/
プログラム技術板倉庫
http://tito.fc2web.com/2ch/tech/index.html

推薦図書/必読書のためのスレッド PART 10
http://pc2.2ch.net/test/read.cgi/tech/1051496506/

619 名前:617 :03/05/27 20:10
>>618
ありがとうございます。

620 名前:デフォルトの名無しさん :03/05/27 20:13
素朴な疑問
あるクラスhogeの実装で
hoge fuga(10);
とやるとコピーコンストラクタが呼び出されるのはわかるけど
int x(10);
とやってもきちんとxに10が代入さる
コピーコンストラクタは組込み型にはない気がするけどなんでだろう
()演算子のオーバーロード?

621 名前:デフォルトの名無しさん :03/05/27 20:21
>>620
> hoge fuga(10);
> とやるとコピーコンストラクタが呼び出される
呼び出されるのは整数型引数のコンストラクタです。

> コピーコンストラクタは組込み型にはない気がするけど
ある。

622 名前:デフォルトの名無しさん :03/05/27 20:47
>>612
ありがとう
どうりでぐぐっても見つからない訳がわかりました。

623 名前:620 :03/05/27 20:51
>>621
intとかcharにコピーコンストラクタがあったとは知りませんでした
char *re("レスありがとうございました")
ってやろうとしたらさすがに無理でしたが

勉強になりました

624 名前:デフォルトの名無しさん :03/05/27 21:12
>>623
VC++はできたよ

625 名前:デフォルトの名無しさん :03/05/27 21:23
>>623
g++でもbccでもdmcでもできたーよ。

626 名前:デフォルトの名無しさん :03/05/27 22:41
一般にポインタ、整数、浮動小数点は暗黙のうちにboolに変換できます。
ただし、処理系によっては期待した結果になりません。
     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
と本に書いてあったのですが、これは例えば

int idt=100;

if(idt == true)
return 0;

のようなことを指しているのでしょうか?
それとも他にも処理系によっておかしな動作がすることがあるのでしょうか?

627 名前:デフォルトの名無しさん :03/05/27 23:22
> と本に書いてあったのですが

どの本?

628 名前:デフォルトの名無しさん :03/05/28 11:58
ていうか、ポインタや整数や浮動小数点をboolに変換してどういう結果を期待しろと?

629 名前:デフォルトの名無しさん :03/05/28 12:06
非0 == true
0 == false

630 名前:山崎渉 :03/05/28 12:37
     ∧_∧
ピュ.ー (  ^^ ) <これからも僕を応援して下さいね(^^)。
  =〔~∪ ̄ ̄〕
  = ◎――◎                      山崎渉

631 名前:デフォルトの名無しさん :03/05/28 16:12
プロの人ってどーやってウインドウズアプリ作ってんの?
VSUAL C++とかBORLANDC++とか使ってるの?
そんなの使ってるよーじゃやっぱプロとしてはやっていけないんですかー?

632 名前:デフォルトの名無しさん :03/05/28 18:48
コンパイラはそんな所

633 名前:デフォルトの名無しさん :03/05/28 18:48
でもすれ違いだね

634 名前:デフォルトの名無しさん :03/05/28 19:34
>>626
暗黙に bool に変換できる型はなかったと思うが。
あと、そいつらは制御文の制御式として使えるけど、
結果は処理系依存にはならない。
キャストした場合も同様。

その本、大丈夫?

635 名前:626 :03/05/28 19:37
はるひこの新C++言語入門ビギナー編だが
80何ページに描いてるよ

636 名前:デフォルトの名無しさん :03/05/28 19:43
林 晴比古キタ━━━━(゚∀゚)━━━━ッ!!

嫌な予感がしていたが! やっぱりそうかッ!!

637 名前:デフォルトの名無しさん :03/05/28 20:10
文字列リテラルのポインタがconstでなくてもいいのがいつも歯がゆい。



きっとアレだろうな、0e+15 とか、カスウ部が0でも指数部が非0の時、
trueになったりするんだろうな。

638 名前:デフォルトの名無しさん :03/05/28 21:56
そんなおまえにMLを薦める

639 名前:デフォルトの名無しさん :03/05/28 22:27
クラスを引数にとるようなメソッドがあった場合に、スタック上にはそのオブジェクトへの
ポインタだけが積まれるのでしょうか?
例えば、class Cがあった場合に、
  1. foo(C p);
  2. foo(C& p);
  3. foo(const C& p);
  4. foo(C* p);
で、各メソッドをコールした場合にコールスタックへ何がプッシュされますか?
1と3は一時オブジェクトが生成されるのかなぁ。


640 名前:デフォルトの名無しさん :03/05/28 22:35
> クラスを引数にとるようなメソッド

クラスは引数にとれません

641 名前:デフォルトの名無しさん :03/05/28 22:36
スタック経由するとは限らないわけだが
つーか自分で調べた方が早いだろ、そーいうのって。

642 名前:デフォルトの名無しさん :03/05/28 22:38
>>639
C型の値を引数として渡した場合は
一時オブジェクトがつくられるのは1.だけかと。

643 名前:デフォルトの名無しさん :03/05/28 23:00
サクッとアセンブリコードを出力させるべし。

644 名前:639 :03/05/28 23:02
助言ありがとう。理解できました。
g++で>>639の実験をしたら、2〜4は同じものが渡されてました。


645 名前:デフォルトの名無しさん :03/05/28 23:37
void mygetline(ifstream& file){
string s;
getline(file, s);
cout << s << endl;
}

みたいなコード書いたらエラーになりました。
理由のわかるかたいますでしょうか。
お願いします。

646 名前:645 :03/05/28 23:39
std::が抜けたとか、<string>、<fstream>をインクルードしてないとか、
そういうことではありません。

この1週間悩みっぱなしです。

647 名前:デフォルトの名無しさん :03/05/28 23:51
エラーメッセージも書けないような人は永遠に悩み続けてください。

648 名前:デフォルトの名無しさん :03/05/28 23:51
16桁の2進数を入力して、10進数に変換して
出力するプログラムを書いたのですが(とりあえずエラー処理は無しで)
コンパイル時に「不正な左オペランド%です」というエラーが出ます。
下から順にi+1番目の桁の値を取得し、2^iをかけたものを足し合わせているのですが…
原因をと対策を教えてください。お願いします

#include <iostream.h>
#include <math.h>

void main(void){
 int n, i, sum=0;

 cin >> n;

 for(i=0; i<16; i++)
  sum = sum + ( ( n / pow(10,i) ) % 10 ) * pow(2,i);
 
  cout << sum;
}

649 名前:645 :03/05/28 23:58
>>647
すみません。bcc32で、エラーメッセージは

エラー E2285 streamtest.cpp 8: 'getline<_CharT,_Traits,_Alloc>(ifstream,string)'
に一致するものが見つからない(関数 mygetline(ifstream &) )

ちなみに、ifstreamをistreamにすると動きます。
でも、ナマのgetlineはifstreamでもいけたはず。

650 名前:645 :03/05/29 00:00
#include <iostream>
#include <string>
#include <fstream>
using namespace std;

void mygetline(ifstream& file){
string s;
getline(file, s);
cout << s << endl;
}

main()
{
ifstream file("hogehoge.txt");
mygetline(file);
}

です。

651 名前:デフォルトの名無しさん :03/05/29 00:23
>>650
俺の環境(VC++7)ではコンパイルできた、実装依存の問題かも?
istreamで動くんなら、istreamにしてはどうだろう?それほどの支障はなさそうだし。

652 名前:デフォルトの名無しさん :03/05/29 00:26
>>648
本題だけに突っ込むと、
原因:%は整数型にしか使えないが、powの戻り値はdoubleなので、( n / pow(10,i) )もdoubleになるからエラー。
対策:pow(10,i) → static_cast< int >( pow(10,i) )

全体的には、いろいろまずい要素が満載で、基本からやり直すことをお勧めしたい。
そのプログラムが学習中のものなら、参考にしたモノを投げ捨てた方がいいと思われ。

653 名前:645 :03/05/29 00:31
>>651
そうですか。ありがとさんです。
でも、気持ち悪いので、誰か何か知ってたら教えてください。

ついでだから、>>648。とても読めませんが、こんなのどう?
(なんか学校の宿題くさいけど、俺も>>651にレスしてもらったし。)

#include <iostream.h>
#include <math.h>

void main(void){
int sum = 0;
char binary[17];
cin >> binary;
for(int i = 0; i < 16; i++)
sum += binary[i] == '1' ? pow(2, 15 - i) : 0;
cout << sum << endl;
}

かならず16桁あるという前提で。

654 名前:デフォルトの名無しさん :03/05/29 00:35
>>648
16桁の2進数を入力して、10進数に変換して出力するプログラム

#include <iostream>
#include <bitset>
int main()
{
 std::bitset< 16 > bits;
 if( std::cin >> bits )
  std::cout << bits.to_ulong();
}


655 名前:デフォルトの名無しさん :03/05/29 00:58
>> 648
とりあえずint型が表示できる数を調べてみてはいかがでしょう・・・


656 名前:648 :03/05/29 00:59
皆様ありがとうございます。
何とかエラーは消えましたが、同じことしてるはずなのに
653さんのはうまくいって何故か自分のは思う結果が出ない…考えてみます。

ちなみに宿題じゃなくて問題集です…

657 名前:648 :03/05/29 00:59
>>655


658 名前:デフォルトの名無しさん :03/05/29 01:49
>> 648
#include <iostream>
#include <math.h>
using namespace std;
int main()
{
char str[17] = "0000000000000000";
int i = 0;
int ans = 0;
cout << "16桁の2進数を入力して下さい:";
str[16] = '\0';
cin >> str;
for(i=0;i<16;i++)
{
if(str[i] == '\0')
str[i] = '0';
ans += (str[i]-48) * pow(2,i);
}
cout << ans << '\n';
return 0;
}

16桁以内なら途中で入力を中断しても演算するようにしています

659 名前:デフォルトの名無しさん :03/05/29 02:11
>>653
処理系が標準に準拠できていないんだろうなあ。
使った処理系は何?
ifstreamはistreamから派生している?
fstreamからの派生になってたりしないか?

660 名前:653 :03/05/29 06:33
>>659
レスありがとうです。
俺が使ってるのはbcc32(Borland C++ 5.5)です。
やっぱり、変ですよね。(俺の頭が、じゃなくて。)
某、好きだったんだけどな。

ただ、派生はちゃんとしてるように見えます。
class _RWSTDExportTemplate basic_ifstream : public basic_istream<charT, traits>
この_RWSTDExportTemplateってのはよくわかりませんが。

661 名前:デフォルトの名無しさん :03/05/29 10:09
キャストしてみるとか。気持悪いけど。

getline(static_cast<istream&>(file), s);


662 名前:デフォルトの名無しさん :03/05/29 18:46
例えば、
 namespace HOKJELKDSLKHLKFJHLEBIFBSDIF {
  class X { public: int x; X() : x(0) { } };
 }
という名前空間とクラスがあったとします。
この X を使いたい場合に、この長たらしい名前空間を何度も書きたくないので
 namespace A {
  using namespace HOKJELKDSLKHLKFJHLEBIFBSDIF;
  void foo(X x);
 }
と、「ヘッダファイル内に」書いたとします。
すると、
 int main() {
  A::X x;
  A::foo(x);
 }
のように、仕様上 A::X として使えるようになってしまいます。
エイリアスを使っても、そのエイリアスが外部で使えてしまいます。

A の名前空間を通じて X を参照できないようにし、
なおかつ foo の X などであの長い名前空間を使えないようにする方法って
何かないんでしょうか?

663 名前:662 :03/05/29 18:46
age 忘れ

664 名前:デフォルトの名無しさん :03/05/29 18:48
1つ条件を忘れていました。
A の外で using するのもダメです。

665 名前:デフォルトの名無しさん :03/05/29 18:53
ヘッダに書くなよ

666 名前:デフォルトの名無しさん :03/05/29 19:05
ヘッダでusingしない
もしくはusingをまったく使用しない

667 名前:662 :03/05/29 19:13
つまり、やっぱり「どうしようもない」ってことでしょうか?

668 名前:デフォルトの名無しさん :03/05/29 19:27
名前空間をインポートするusingを使っておきながらそれを無効にしたいなどというのは矛盾もいいとこなのでどうしようもない

669 名前:デフォルトの名無しさん :03/05/29 19:32
#define HOKJELKDSLKHLKFJHLEBIFBSDIF A
つーか、秦でいいよ。手抜きするな。

670 名前:662 :03/05/29 19:57
ヘッダ書くのは楽したいけど、
インポートしたい訳ではないんです。
ヘッダを書くのを楽するためには using しないといけないけど、
インポートしたくないので using はしたくない、ってことです。

だから何とかしたかったのですが、
#define〜#undef がせいぜいということのようですね。
できればマクロも使いたくないので
大人しく手抜きせずに書く事にします。

その namespace ブロック内でのみ有効な using とかあればいいんですけどね...。
そもそも全部 public なのが(ry

671 名前:デフォルトの名無しさん :03/05/29 22:46
なんか昔「仮想を切る」とかデンパなことを言ってたやつ?

672 名前:662 :03/05/29 22:51
>>671
何ですか? それは。

まぁ、vi しか使えない環境に放り込まれたら
あなたたちもそういう機能が欲しくなりますよ。きっと。

673 名前:デフォルトの名無しさん :03/05/29 22:53
viの置き換え機能で後で一気に長い名前に置き換えればいいじゃん。

674 名前:662 :03/05/29 22:56
>>673
なるほど。それはいいですね。
あとで整形する必要はありますけど。

ところで、長くなってくるとソースが見づらくなると思うんですけど、
みなさんどうしてますか?

675 名前:660 :03/05/29 22:58
>>661
こんな俺を見捨てずにありがとうです。

やってみたらうまくいきました。
それどころか、
void mygetline(ifstream& file){
string s;
getline((ifstream&)file, s);
cout << s << endl;
}
でもコンパイルとおっちゃいました。キャストとるとだめです。
なんじゃこりゃーですが、もう、抵抗するのやめます。
いろいろ教えてくれたみなさん。ほんとに、ありがとです。

676 名前:デフォルトの名無しさん :03/05/29 23:53
>>654 カコイイ!

俺も改良版考えました。
16桁以下ならOK。で、安全。

#include <iostream.h>

void main(void){
char binary[17];
cin.get(binary, 17);
int sum = binary[0] - '0';
for(int i = 1; binary[i] != '\0'; i++){
sum <<= 1;
sum += binary[i] - '0';
}
cout << sum << endl;
}


677 名前:デフォルトの名無しさん :03/05/29 23:53
VC++でDWORDとBOOLがコンパイルエラーを吐くんだけど、
DWORDとBOOLってunsigned long(だっけ?)とboolに変えないとだめ?

678 名前:デフォルトの名無しさん :03/05/30 00:06
> VC++でDWORDとBOOLがコンパイルエラーを吐くんだけど、

どんな?

679 名前:677 :03/05/30 00:09
>>678
スマソ。

error C2065: 'BOOL' 定義されていない識別子です。

みたいな感じです。


680 名前:677 :03/05/30 00:14
とりあえず試しに、hello worldを元に

#include "stdafx.h"

int main(int argc, char* argv[]){
BOOL a;
printf("Hello World!\n");
return 0;
}

って書いてみたんですが、これもコンパイルエラーでした。

681 名前:デフォルトの名無しさん :03/05/30 00:17
>>680
stdafx.h 内で
 #include <windows.h>


682 名前:デフォルトの名無しさん :03/05/30 00:36
>>662
↓これじゃだめ?
 namespace A {
  namespace short_name = HOKJELKDSLKHLKFJHLEBIFBSDIF;
  void foo(short_name::X x);
 }


683 名前:677 :03/05/30 00:41
>>681
できまつた。ありがとうございまつ。

684 名前:初心者プログラマー :03/05/30 00:54
こんばんわ。いまCでプログラムを書いています。一応書いてはみたのですが、
自信がありません・・・。
そこで、プログラムソースを添削していただきたいのですが・・・
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/lounge/file/1054220849_1/report2-3.c
ここにソースを置いています。
お願いします。


685 名前:デフォルトの名無しさん :03/05/30 00:55
>>684
ここ含めて5箇所にマルチポスト。
その内2つがスレ立て。

686 名前:デフォルトの名無しさん :03/05/30 01:23
> report2-3.c
 
頼むから夜中に爆笑させないでくれえ〜。

687 名前:662 :03/05/30 01:28
>>682
A::short_name が外から使えてしまうのが
ちょっと気持ち悪いんです。

688 名前:デフォルトの名無しさん :03/05/30 01:37
>>687
んなこと言ったら、HOKJELKDSLKHLKFJHLEBIFBSDIFが使える時点でダメなんじゃねーの?

689 名前:203 :03/05/30 02:09
>>688
HOKJELKDSLKHLKFJHLEBIFBSDIF::hoge が
A::short_name::hoge としても使えるのは気持ち悪くありませんか?

 namespace ___HOK = HOKJELKDSLKHLKFJHLEBIFBSDIF;
とか、「外部で使わないでー」というお願いを込めた名前にする、
というのならまだ使えるかも?

690 名前:689=662 :03/05/30 02:10
番号間違えました。

691 名前:デフォルトの名無しさん :03/05/30 02:13
>>689
じゃぁboostにちなんでdetailの中でコソコソやっとけ。

692 名前:デフォルトの名無しさん :03/05/30 06:07
>>662
ヘッダファイルでusingを使うのは行儀が悪いのでやめた方がいい。
名前空間の名前を短くするか、そうでなければ全部書いてください。
コピペ使えばどうってことのない手間でしょう。

# どうでもいいが「名前空間の名前」って言い方はちょっと変か……

693 名前:662 :03/05/30 13:09
>>692
レスありがとうございます。

>ヘッダファイルでusingを使うのは行儀が悪いのでやめた方がいい。
非常に同感です。
使ってみて、強く実感しています。

>名前空間の名前を短くするか、そうでなければ全部書いてください。
>コピペ使えばどうってことのない手間でしょう。
エイリアスを使おうが、元の名前を短くしようが、
結局 using を使わない以上何らかの NAMESPACE:: を書かないといけないんですよね。
大人しく書く事にします。

694 名前:デフォルトの名無しさん :03/05/30 21:07
下のプログラムを組んでみて疑問がありまする。
基底クラスのインスタンスを渡しているのに、派生クラスにキャストすると
派生クラスのメンバ関数foo2が呼べるのはなぜですか?(最初は落ちるかと思ったんだけど…)

#include <iostream>

class A {

};

class B : public A {
    public:
        void foo(A* a) {
            B *b = static_cast<B*>(a);
            b->foo2();
        }

        void foo2() {
            std::cout << "B::hoge()" << std::endl;
        }
};


int main(int argc, char* argv[]) {
    A a;
    B b;
    b.foo(&a);

    return 0;
}


695 名前:デフォルトの名無しさん :03/05/30 21:10
>>694
もしBにメンバ変数の追加があって、そのfoo2がそれを参照してるならやばいよ。
たまたまBで拡張された部分をアクセスしない関数だから大丈夫なだけ

696 名前:デフォルトの名無しさん :03/05/31 09:07
std::mapから、要素を完全に取り除きたい場合はどうすればいいですか。
std::map<std::string, long> testMap;
testMap["111"] = 111;
testMap["222"] = 222;
testMap["333"] = 333;
testMap.erase("222");
こうやって要素を消しても、iteratorでmapをなめると、"222"をキーに持つ要素が出てきてしまいます。

697 名前:デフォルトの名無しさん :03/05/31 09:09
悪質な釣り師見参

698 名前:動画直リン :03/05/31 09:13
http://homepage.mac.com/hitomi18/

699 名前:696 :03/05/31 12:36
すみません。勘違いしてました。

ちょっと別の質問なんですけど、mapの要素に対して[]を使ってアクセスすると、
なぜか要素のコンストラクタが呼ばれるようです(find()では呼ばれない)。
これってどういう事でしょうか。mapの要素に[]でアクセスするのは効率が悪いんですか?

700 名前:デフォルトの名無しさん :03/05/31 13:05
700

701 名前:デフォルトの名無しさん :03/05/31 13:14
>>699

> ちょっと別の質問なんですけど、mapの要素に対して[]を使ってアクセスすると、
> なぜか要素のコンストラクタが呼ばれるようです(find()では呼ばれない)。

なぜって、仕様読んだのか?
[]は新しい要素を代入することが出来る。

> これってどういう事でしょうか。mapの要素に[]でアクセスするのは効率が悪いんですか?

効率が悪いとしたら、使い方が間違っとる。


702 名前:696 :03/05/31 13:21
>>701
だから、例えば
std::map<std::string, CMyClass> theMap;
theMap["test"];//追加される
theMap["test"];//参照
theMap["test"];//参照
という感じで、追加されるのは最初の一回目だけで、後は参照するだけ
だと思っていたんですが、二回目以降もCMyClassのコンストラクタが呼ばれてます
theMap["test"]
theMap.find("test");
theMap.find("test");
こういうやり方ならコンストラクタは一回しか呼ばれません

703 名前:デフォルトの名無しさん :03/05/31 13:25
Cを飛ばしていきなりC++始めたいときは、やっぱり「やさしいC++」を読むのがいいんでしょうか?

704 名前:デフォルトの名無しさん :03/05/31 14:20
>>703
他の言語の経験は?

705 名前:デフォルトの名無しさん :03/05/31 14:21
>>703
推薦図書/必読書のためのスレッド PART 10
http://pc2.2ch.net/test/read.cgi/tech/1051496506/l50

706 名前:デフォルトの名無しさん :03/05/31 14:33
>>702
operator[] が
 return insert( make_pair(key, val()) )->second
で実装されてる環境(VC6,7,Bcc5など)だと二回目以降も
デフォルトコンストラクタがよばれるし、
 iterator i = find( key )
 return ( i != end() ? return i->second : insert( make_pair(key, val()) )->second);
と実装されてれば(gcc3など)一回しか呼ばれないし。処理系による。

707 名前:696 :03/05/31 14:38
>>706
え!!operator[]ってそうだったの!?
じゃあ確実に参照だけしたいって場合はfind()->secondするのが良いんですね
わかるりましつ

708 名前:デフォルトの名無しさん :03/05/31 15:35
wchar_tってのがあるじゃないですか。例えば、
>wchar_t wt[256];
>_wcspcpy(wt, L"あ あ あ");
こういう使い方。
この場合、wtの中身は、UTF-8ですか?UTF-16ですか?

709 名前:デフォルトの名無しさん :03/05/31 15:39
文字コードは処理系や環境に依存すると思うけど・・・

710 名前:デフォルトの名無しさん :03/05/31 15:39
>>708
まずUTF-8みたいなマルチバイトではないだろうが
UTF-16かどうかは実装依存
Visual C++だとUCS-2, glibcだとUCS-4とかじゃなかった?

711 名前:708 :03/05/31 15:48
すげー、レス嬉しい >>709 >>710

じゃあぁ、コンパイラ調べれば分かりますね。ちなみにBCBでつ。

DBにUNICODE入れようと思うのですが、UTF-8/16混在させたら読むに読めないから怖いですね。

UCSってのが何か良く分からないです。

712 名前:デフォルトの名無しさん :03/05/31 15:57
>>711
このへん読むとヨシ
http://euc.jp/i18n/charcode.ja.html#chap7

UCSは文字集合で、UTFは交換用符号だが
UTF-16というと、同じ2バイトでもUCS-4の文字集合を表現するために
16bit=1文字とは限らないので扱いにくい。
UCS-2といった場合は必ず16bit=1文字で表現できる。

で、BCBならWin32だろうけど、それならVCと同じじゃないかな。

713 名前:711 :03/05/31 16:02
>>712
あ、そうなんだ。
じゃぁ、DBにはUCS-2で入れといて、
HTMLなんかにするときにUTFに変えればよさげ、
と思ったが自信無い。

714 名前:デフォルトの名無しさん :03/05/31 17:08
UTF-8/UTF-16 使うと、既存の W_Char 用関数が全滅するので、結構大変だよ。
今までは 16bit/2byte 渡せばすむところを、w_char のポインタを渡さなきゃいけなくなったり。


715 名前:713 :03/05/31 17:41
>>714
既存とはCの基本ランタイムwfopenみたなヤシですか?
まじー?


716 名前:デフォルトの名無しさん :03/05/31 17:46
getc あたり、どうなると思う?

717 名前:デフォルトの名無しさん :03/05/31 17:51
wfopenって初耳

718 名前:デフォルトの名無しさん :03/05/31 17:54
wifstream, wofstream のコンストラクタも wstring でファイル名を
受けてくれればいいのに。

719 名前:デフォルトの名無しさん :03/05/31 18:11
正直、UTF8/16/32, UCS-2のどれが良いのかわけわか。

720 名前:デフォルトの名無しさん :03/05/31 20:07
結構調べたんですけど、stringstreamのバッファのクリアの仕方がわかりません。
まったくお恥ずかしい限りです。

721 名前:デフォルトの名無しさん :03/05/31 20:09
std::stringstream x;
x.str( std::string() );

722 名前:720 :03/05/31 20:19
>>721
アリガd

もう1つ
どうしてx.str( std::string("test") );
はダメなんですか?

723 名前:_ :03/05/31 20:22
http://homepage.mac.com/hiroyuki43/hankaku06.html

724 名前:デフォルトの名無しさん :03/05/31 20:25
>>722
ダメって、なにが?

725 名前:722 :03/05/31 20:54
>>724
あーーそうかstringstream::str("test")はポインタ進まないのね(汗)
ダメだと思った理由はご想像にお任せします。

726 名前:デフォルトの名無しさん :03/06/01 18:00
関数の引数のデフォルト値を途中だけ設定することが出来ないですが、
何故そういう仕様になってるのかよく分かりませんでした。
int f(int, int = 3, int);
と宣言して、
f(3,,4); //OK
f(,,4); //デフォルト値なしの引数が省略されているのでエラー
となるような仕様では何故駄目なんでしょうか?




727 名前:デフォルトの名無しさん :03/06/01 18:40
>>726
デフォルト引数を利用する場合
基本的には引数を省略する場合が多いんで、
途中に余計なコンマを書くよりは、
何も書かないでいいようにした方が効率的で分かりやすい。

デフォルト引数が複数ある場合には
f(3, , 4); というように指定したいと思う事もあるけど、
コンマの個数が増えてくるとソースが読みにくくなるし、
コンマの個数を間違えるとバグになるというのも困るので、
省略できないのも仕方が無いとも思う。

個人的には、名前付き引数があればええんでないかな、と思うのだが、
まぁ、無いものは仕方が無い、と。

728 名前:デフォルトの名無しさん :03/06/01 19:45
デフォルト引数とオーバーロードを一緒に扱いたかったから、違う?

729 名前:デフォルトの名無しさん :03/06/01 19:49
VC使っていますが、仮に

class A {
  A(int i) {}
};

class B {
  A  m_cA[8];
};

としたとき、B::m_cAを初期化するにはどうすればよいでしょうか。

730 名前:デフォルトの名無しさん :03/06/01 19:58
>>729
ttp://www.parashift.com/c++-faq-lite/ctors.html#faq-10.5

731 名前:デフォルトの名無しさん :03/06/01 20:45

DVからIEEEでキャプチャしてリアルタイム処理するプログラム組んでて
ttp://wwwdoi.elec.nara-k.ac.jp/html/jisyu/dxm/cap2/index.html
を使ってやっているんですが、むちゃくちゃかくかくするんです。
単なる処理速度の問題なのかどうか、、
cはできるんですがwinプログラムは始めてで、フレームレートあがるにはどこいじればいいかわかんない
たのむ!たすけて

732 名前:729 :03/06/01 21:23
>730
なるほど、この構成自体がコンパイル通らないのですか。
情報感謝です。

733 名前:デフォルトの名無しさん :03/06/01 21:28
>>729
配列の各々のオブジェクトに、違った初期化をする方法で
cinからもってくる方法がストラウストラップに載ってるね(p.300-301)。
まぁここまでするのもね。

734 名前:デフォルトの名無しさん :03/06/01 21:30
>>731
多分処理速度。圧縮処理汁!!

735 名前:デフォルトの名無しさん :03/06/01 21:53
C++の構造体とクラスの差について、
構造体は
・アクセス修飾子が無い。
・メソッド、コンストラクタ、デストラクタが定義できない。
以外に何かありますか?


736 名前:デフォルトの名無しさん :03/06/01 21:54
> 構造体は
> ・アクセス修飾子が無い。
> ・メソッド、コンストラクタ、デストラクタが定義できない。
そんな差は無い。

737 名前:デフォルトの名無しさん :03/06/01 21:55
C++は構造体でもメソッドもコンストラクタもデストラクタは定義できます。
アクセス修飾子もあります。
クラスとの違いはデフォルトの
アクセス修飾子がprivateかpublicかの違いのみです。

738 名前:デフォルトの名無しさん :03/06/01 21:56
>>736
>>737
初心者な物で・・・失礼しました。

739 名前:デフォルトの名無しさん :03/06/01 22:18
structはCとの互換性を考えてデフォルトをpublicにしているの?

740 名前:デフォルトの名無しさん :03/06/01 22:18
関数オブジェクトを簡単に書けるように

741 名前:デフォルトの名無しさん :03/06/01 23:21
オブジェクト指向的には構造体とクラスは別物。
C++ はほぼ同等の扱いにしてるけど。

742 名前:デフォルトの名無しさん :03/06/01 23:32
>>741 マジですか?

743 名前:デフォルトの名無しさん :03/06/02 01:00
何かの本で著者がstructとclassを使いわける俺ルールを書いてて
それに共感を覚えたんだけど、どういう決まりだったかすっかり
忘れてしまったな。

744 名前:デフォルトの名無しさん :03/06/02 03:41
構造体はただの複数のデータの塊(のための型)。
変数を一度に沢山定義して、
それを一度に受け渡しするためのものに過ぎない。

一方クラスは具体的にどんなメンバ変数があるかは隠蔽しちゃってて、
使う側からは、どういう種類のデータを扱えて、
どういう機能を持っているかさえ分かっておけばいいようになっている。
つまり、データの抽象化を行ったものがクラスと言える。
メンバ関数を通してデータを扱う場合と言ってもいいかもしれない。
でも、ポリモーフィズムとかも重要な性質だろう。


C の FILE 構造体はクラスみたいな使い方をしてるけど、
これは C にはクラスがなかったからこうしてるだけ。
こういうのは、オブジェクト指向言語ではクラスにすべきだろう。

745 名前:デフォルトの名無しさん :03/06/02 07:39
値として振舞うか、仕組みとして振舞うかの違いもあるよーな気がするのう。

746 名前:デフォルトの名無しさん :03/06/02 10:37
「オブジェクト指向的には」とか言ってるけど、
Cの構造体、C++の構造体、C#の構造体みたいに、
狭い範囲でそれぞれ意味が定義されてるもんじゃないの?

オブジェクト指向という括りで通用する構造体の定義ってあるの?

747 名前:デフォルトの名無しさん :03/06/02 11:03
単なるデータストアか、オブジェクトとしての振る舞い(もしくはロール)
をもつかで区別すりゃいいんでないかね。


748 名前:デフォルトの名無しさん :03/06/02 18:23
#include<stdio.h>
#include<math.h>
#include<conio.h>
main(){ float a,x,b,x1;
printf("入力→");
scanf("%f",&x);

for(;;){
a=exp(x)-3*x;
b=exp(x)-3;
x1=x-a/b;

if(fabs(x1-x)<0.0000001)break;

x=x1;
}

どこがおかしい?


749 名前:デフォルトの名無しさん :03/06/02 18:34
#include<conio.h>

750 名前:デフォルトの名無しさん :03/06/02 18:37
スレ選び


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