■過去ログ置き場に戻る■
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 next�A
�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.