C++相談室 part78
..
435:デフォルトの名無しさん
10/02/28 23:50:58
>>433
いいよ
template<bool A>
struct X
{
void f() {}
};
template<>
struct X<true>
{
void f();
};
とヘッダーに書いて
void X<true>::f(){}
を別のコンパイル単位に書くのはOK。
bool が typename でも同じ
436:デフォルトの名無しさん
10/02/28 23:51:44
クラス設計に関して質問です。
Waveファイルの入出力に関するクラスと、再生に関するクラスの2つを作ったとします。
実際waveファイルを入力して、再生するというプログラムを書く場合オブジェクトを何にしたらいいでしょうか?
オブジェクト指向がよくわかっていなくて・・・
437:デフォルトの名無しさん
10/02/28 23:59:35
// ヘッダファイル
template<bool B>
struct hoge
{
hoge();
};
// ソースファイル
template<>
hoge<true>::hoge() {}
template<>
hoge<false>::hoge() {}
これで問題ないね
438:433
10/03/01 00:18:10
>>435
>>437
ありがとうございました!
439:デフォルトの名無しさん
10/03/01 00:45:56
>>436
WaveIO obj = new WaveIO(filePath);
Player obj2 = new Player();
obj2.Play(obj);
とかってなるんでないの
440:デフォルトの名無しさん
10/03/01 02:23:03
マルチスレッドキューありますか。
自作しようして無理だった。
441:デフォルトの名無しさん
10/03/01 05:44:38
>>432
make_sharedだな。TR1にもC++0xにもある。
>>440
Intel TBBになんかあったはず。
442:デフォルトの名無しさん
10/03/03 00:34:04
クラスのメンバ関数とそのconst関数の共通化をしようとして失敗しています。
以下のコードでは [ ]演算子のオーバーロードがその例です。
どうしたら理想([ ]によるメンバ変数arrayの中身変更)的な動作になるでしょうか?
URLリンク(codepad.org)
443:デフォルトの名無しさん
10/03/03 00:56:27
高校1年の春、2年生に進級する直前のできごとでした。
僕は難関、最初の壁と名高いポインタにぶつかりました。
ポインタ・・・彼は僕を苦しめました
存在が意味不明でした。
『本当に必要なのか?
いつ、使うの?君はなんなんだい?』
僕は寝ることをやめて飲まず食わず
1週間、ずっとポインタを見つめた結果
理解できませんでした・・
そのときの挫折はまさに、絶望でした。
自分の理解力の無さと頭の悪さに怒りを覚え
その怒りはそのうちに悲しみにかわり
僕は1ヶ月、眠れませんでした。
444:デフォルトの名無しさん
10/03/03 01:11:16
>>442
× return const_cast<double&>( static_cast<const Test>(*this)[pos] );
○ return const_cast<double&>( static_cast<const Test&>(*this)[pos] );
445:デフォルトの名無しさん
10/03/03 01:14:32
そんな僕がまたプログラマ目指そうと思ったのですが
どう思います?
446:デフォルトの名無しさん
10/03/03 01:17:12
>>445
好きにすればいい。分からない事があったらここに書き込めば俺は答える。
447:デフォルトの名無しさん
10/03/03 02:35:19
>>444
ありがとうございます。
<間違い> return const_cast<double&>( static_cast<const Test>(*this)[pos] );
は、static_cast<const Test>(*this) で *this の中身をコピーした const Test型 のオブジェクトを生成し、
その生成されたオブジェクトに [pos] でアクセスしている。
だから、実際には *this の中身にアクセスできていない。
という解釈で良いでしょうか?
448:デフォルトの名無しさん
10/03/03 02:38:14
>>442
こういうのも
return const_cast<double&>( static_cast<const Test*>(this)->operator[](pos) );
449:デフォルトの名無しさん
10/03/03 02:41:27
>>447 そういうこと。
450:442
10/03/03 04:18:56
>>448
>>449
ありがとうございます!
451:デフォルトの名無しさん
10/03/03 07:50:18
ツリーのクラス構造について質問です。
現在、以下のようなクラスを考えています。
class Base{}
class ParentBase : public Base { };
class Parent : public ParentBase { };
class ChildBase : public Base { };
class Child : public ChildBase { };
class ChildA : public Child {}
class ChildB : public Child {}
class ParentA : public Parent
{
public:
ChildA childa;
ChildB childb;
};
class ParentB : public Parent
{
public:
ParentA parenta;
};
Parentの派生クラスは、メンバ変数でChildだったり、Parentのオブジェクトの実体を保持します。(例:ParentA, B)
ここで、各Parentが保持するオブジェクトから、親オブジェクトへアクセスする方法はないでしょうか?
やりたいことは、ParentA::childaで、ParentAの関数を呼ぶ、ParentB::parentaで、ParentBの関数を呼ぶ、ということがしたいのです。
一番基底クラスのBaseクラスで、Baseクラスへのポインタ持たせてやろうと思ったのですが、そのポインタへの実体のセット方法がわからなくて、迷ってしまいました。
何かいい方法はないでしょうか?
452:デフォルトの名無しさん
10/03/03 11:04:37
ポインタを理解したのは、確かポインタ渡し、参照渡し、値渡しの違いを知ったときだった憶えがある
453:デフォルトの名無しさん
10/03/03 11:15:38
>>451
コンストラクタで渡すなりセットするメンバ関数を作るなり public にして設定するなり、
いろいろあるだろ。何が気に入らないんだ?
454:デフォルトの名無しさん
10/03/03 11:27:28
struct hoge: public unary_function<int,int> {
int operator(int);
};
的な関数オブジェクトを
g++ -Weffc++ hoge.cpp
でコンパイルした場合、
warning: base class struct std::unary_function<int, int> has a non-virtual destructor
というエラーがどうしても出るのですが、
ライブラリの責任であってユーザ側からは対応しようがない、
というので正しいでしょうか?
455:デフォルトの名無しさん
10/03/03 11:41:08
protected継承
456:デフォルトの名無しさん
10/03/03 11:43:09
>>454 URLリンク(ja.lmgtfy.com)
457:デフォルトの名無しさん
10/03/03 12:35:06
>>456
要するにGCCがそうだと言ってるからそうだ、ということですね。
これに対するライブラリ実装者の答えが欲しいのですが・・・。
458:デフォルトの名無しさん
10/03/03 12:38:09
>>457 どうしてそうなったw
459:デフォルトの名無しさん
10/03/03 12:42:54
>>457
>456 のリンクをたどると、 >454 の警告に関する gcc の「バグ」報告に連れて行かれて、
その報告は今でも "NEW" として残っているんだが、何か違うものが見えるのかい?
460:デフォルトの名無しさん
10/03/03 12:46:39
そう読むのか。
コメントのほうを読んで誤解してしまいました・・・。
ありがとうございます。
461:デフォルトの名無しさん
10/03/03 16:09:59
>>454 が何を問題だと言っているのか判らない。
もしかして、Effective C++ 読まずに問題視してる?
462:デフォルトの名無しさん
10/03/03 22:27:54
調子に乗って struct を class みたいに使うのが悪いんじゃね?
463:デフォルトの名無しさん
10/03/03 22:37:41
どうせポリモルに扱わないんだからほっとけよ
464:デフォルトの名無しさん
10/03/03 22:37:41
>>454
どこに「エラー」って書いてあるんだよ
もしかしてエラーと警告を混同してるか?
465:デフォルトの名無しさん
10/03/03 23:00:41
C++のキャストって長ったらしくてあまり使わないんですが,
実際C++のキャストで助かった&Cのキャストではまった
経験をお持ちの方っていますか?
466:デフォルトの名無しさん
10/03/03 23:08:51
C++スタイルはデバッグで見つけやすい
467:デフォルトの名無しさん
10/03/03 23:18:38
>>465
キャストは奨励できないからC++のキャストは長い。
キャストにも色々な目的があるので種類がある。目的に合わない変換不可能なものにはエラーが出る。
あらゆる変換ができるCスタイルのキャストはバグを見つけにくいので使わないほうがいい。
468:デフォルトの名無しさん
10/03/03 23:20:00
long longな値をstd::fstreamに<<すると三桁区切りにcommaが入ってPCが爆発するんだけど
書式設定だとか弄ってcomma入れないような設定できなかったっけ?
469:デフォルトの名無しさん
10/03/03 23:50:17
>>465
意図しない、または、意図した以上のキャストをコンパイル時に発見できる
470:デフォルトの名無しさん
10/03/03 23:59:55
>>468
localeとfacet
thousands_sep()が返す値を確認するとよい
471:デフォルトの名無しさん
10/03/04 00:28:37
C++スタイルのキャストでコンパイルエラーがでる度に助かっているわけだ
472:デフォルトの名無しさん
10/03/04 00:44:21
>465
検索が簡単。
473:デフォルトの名無しさん
10/03/04 05:25:49
分かってても、警告がうざい&タイプが面倒だから、使ってしまう(int)キャスト
474:デフォルトの名無しさん
10/03/04 06:50:49
>>473 しね
475:デフォルトの名無しさん
10/03/04 07:30:55
dynamic_castの機能はCスタイルのキャストでは実現できない
476:デフォルトの名無しさん
10/03/04 08:12:19
キャストの多さは設計の不十分さを示す良い指標
477:デフォルトの名無しさん
10/03/04 10:50:11
dynamic_castはゆとり
const_castはバグ
478:デフォルトの名無しさん
10/03/04 12:20:32
stdの特殊化が許されてるのはswapだけですか?
479:デフォルトの名無しさん
10/03/04 13:28:12
ていうかstatic_castも暗黙的な変換ができないポインタ変換に対して使えちゃうだろ。
static_castは甘え
480:デフォルトの名無しさん
10/03/04 13:33:06
dynamic_castを使う設計てどっかミスってるはず
ダウンキャストするんだったら自前の仮想関数テーブル作れよって話しだ
481:デフォルトの名無しさん
10/03/04 13:35:39
いやdynamic_castでいいだろw
482:デフォルトの名無しさん
10/03/04 13:37:38
>>481
アップキャストした後にダウンキャストとかポリモーですらないじゃん
483:デフォルトの名無しさん
10/03/04 13:40:39
クロスキャストなんてboostにそれ専用のがあるだろ?
484:デフォルトの名無しさん
10/03/04 13:43:24
>>483
うるせーテーブル作らせろ
いやまじでダウンキャストとか使う場面なくね?
面倒だからやっちゃえとかならわかるんだが
485:デフォルトの名無しさん
10/03/04 13:54:06
同意
内部でdynamic_cast使ってるboostとか糞だよな
486:デフォルトの名無しさん
10/03/04 14:14:02
RTTI嫌ってるやつって厨二病みたいなもんだろ?
487:デフォルトの名無しさん
10/03/04 14:32:25
RTTIは遅くなるっていうけど、実際影響がどんなもんか分からん
488:デフォルトの名無しさん
10/03/04 14:39:26
RTTIで起きる速度低下の影響は自前で仮想関数テーブルを用意する場合と同じ。
489:デフォルトの名無しさん
10/03/04 14:41:41
見栄の問題なのか?w
490:デフォルトの名無しさん
10/03/04 15:06:56
>>489
見栄だよ
型名保持してポインタを型変換するだけだし
でも使ってない
491:デフォルトの名無しさん
10/03/04 16:48:51
C++ってゲームプログラミングに使える?
492:デフォルトの名無しさん
10/03/04 16:56:09
>>491
DirectX使えば、いろいろ綺麗に作れるぞ。
493:デフォルトの名無しさん
10/03/04 18:18:44
>>492
取り合えず勉強してみます
ありがとう!
494:デフォルトの名無しさん
10/03/04 20:14:40
キャストは結局のところ「正しくないかもしれないけど見逃してくれ」とコンパイラに指示している。
キャストが正しいことをプログラマーが保証しなければならない。
dynamic_cast(RTTI)もNULLが返る可能性も考えてプログラムを作らなければならない。
どんなにデバッグしても、キャストは客先でプログラムがクラッシュするかもしれない時限爆弾を抱えるようなものである。
暗黙の型変換や仮想関数であれば必ず正しい動作をすることがコンパイラが保証するので堅牢になる。
わずかな設計の見直しでリスクを減らせるんだからキャストは控えるのを勧める。
495:デフォルトの名無しさん
10/03/04 20:22:37
プログラムが正しいかどうかをコンパイラに丸投げする考えのほうがよっぽど危険だよ
第三者たるコンパイラが勘違いしそうな「本当は正しい」ところをマークするのがキャストだ
できちゃいけないキャストが通る理不尽な仕様は確かにあるが、それは
できることとしていいことの分別がつく人しか C++ を使うべきではないということだ
496:デフォルトの名無しさん
10/03/04 20:31:50
キャストは影響を局所化してさらに見えないように包めばいいじゃない
497:デフォルトの名無しさん
10/03/04 20:35:09
>>487
1万回ループさせて0.1秒差とかそんなもん
>>494
NULLが返る可能性を考えないのにdynamic_castを使うとか意味がわからん
そんなの参照と例外に狂ってるやつくらいだろ
498:デフォルトの名無しさん
10/03/04 20:37:50
暗黙の型変換でプログラムが堅牢になると聞いて
499:デフォルトの名無しさん
10/03/04 20:37:59
たった10000回で100msも差がでるのか。
100000000回で10msくらいでもまだ遅いのに
500:デフォルトの名無しさん
10/03/04 20:42:30
>>499
そんな見栄を張るなよw
501:デフォルトの名無しさん
10/03/04 20:43:44
>>478
swap以外もすべて明示的特殊化してよい。
502:デフォルトの名無しさん
10/03/04 20:45:32
暗黙の型変換で堅牢
ハハッ
503:デフォルトの名無しさん
10/03/04 20:45:45
>>500
ごめん・・・最近なにしても楽しくないし2chで見栄張る位しか生き甲斐がなくて・・・。
もう自衛隊に入るわ。最近政治がアレだし俺みたいなクズ人間は戦争で死んでも誰も悲しまないだろう。
504:デフォルトの名無しさん
10/03/04 21:04:38
>>503
自衛隊がお断りだ
505:デフォルトの名無しさん
10/03/04 21:19:52
>>504
もうニート生活はやだよ・・・
506:デフォルトの名無しさん
10/03/04 23:01:18
普通にstatic_castしか使わない = Cのキャストでおk
static_castでエラーが出るケースなんて,経験でわかるようになる程度じゃろ
507:デフォルトの名無しさん
10/03/04 23:06:17
>>506
> static_castでエラーが出るケースなんて,経験でわかるようになる程度じゃろ
いや、わからない人用にあるわけじゃないんだけど。
508:デフォルトの名無しさん
10/03/04 23:09:06
>>506
どんなに経験積んだって人間は間違えるから予防が必要なんだよ
509:デフォルトの名無しさん
10/03/04 23:14:27
構文が悪い
static_cast<int>(var)と(int)varじゃ
後者を使いたくなるのもわかる
510:デフォルトの名無しさん
10/03/04 23:15:31
>>506
よくないよ。
static_cast 継承関係に無い型をキャストしようとエラーになる
Cスタイルキャスト 継承関係に無い型をキャストしてもエラーにならない。
511:デフォルトの名無しさん
10/03/05 00:31:20
インディアン 嘘つかない
512:デフォルトの名無しさん
10/03/05 00:46:24
Cスタイルのキャストを残したビャーネが悪い
513:デフォルトの名無しさん
10/03/05 01:00:33
残すも何も互換性だから
514:デフォルトの名無しさん
10/03/05 01:04:56
じゃあ完全互換じゃなくしたビャーネはもっと悪い
515:デフォルトの名無しさん
10/03/05 01:07:44
CとC++って完全互換じゃないの?
extern C/C++ とかでなんとかなると思ってたんだけど
だれか反例教えちくり
516:デフォルトの名無しさん
10/03/05 01:13:04
100%の互換となることを目標としたことは一度もない、とプログラミング言語C++に書かれているよ
517:デフォルトの名無しさん
10/03/05 01:26:17
そうなのか,買って呼んでみるよ
518:デフォルトの名無しさん
10/03/05 01:28:12
>>515
URLリンク(www.google.co.jp)
URLリンク(www.google.co.jp)
519:デフォルトの名無しさん
10/03/05 01:30:15
int class;
この時点から 100% じゃないしな
520:デフォルトの名無しさん
10/03/05 01:31:10
>>515
変数名に new とか関数名に delete とか、余裕で死ねる。
521:デフォルトの名無しさん
10/03/05 01:31:25
C89 でもちょこちょこ違うのに、C99 で決定的になったからな<非互換性。
ああ、すべての言語に複合リテラルがあればいいのに。
522:デフォルトの名無しさん
10/03/05 01:47:46
>>521
残念ながら C++ は C89 ではなく K&R C から派生した言語なので
C++ が C89 に対して互換性がないのではなく、
C89 が C++ に対して互換性がないんだよ
C++ 側に「捨てた罪」があるのは K&R C に対してだけなのが原則で
extern "C" などの後付け設定がこの原則の例外
523:デフォルトの名無しさん
10/03/05 01:50:13
>>522
> 残念ながら C++ は C89 ではなく K&R C から派生した言語なので
はつみみです
ソースある?
524:デフォルトの名無しさん
10/03/05 01:51:49
D&Eでございます。
525:デフォルトの名無しさん
10/03/05 02:05:31
それ、禿一人で作ってたころのはなしじゃねーの?
少なくとも ISO C++ が参照してる C は ISO C だし。
526:デフォルトの名無しさん
10/03/05 02:07:38
どのクラスからも呼び出すことの出来る変数はどのように宣言するのでしょうか?
staticやexternがあるみたいですが
いかんせんエラーが出ます。どうか教えてください
527:デフォルトの名無しさん
10/03/05 02:08:00
>>522
C++ の設計が K&R C から始まったとして、どうしてそれが
標準 C++ と標準 C との互換性の主従に関係するの?
528:デフォルトの名無しさん
10/03/05 02:08:44
>>526 ソースとエラーメッセージうp 長いなら >>6 へ
529:デフォルトの名無しさん
10/03/05 02:15:54
>>528
長いんで省略した形で記述します。
たとえば
==================================
//○×.h
class Cabc : public **
{
省略
public:
//ここでグローバル変数を記述したい
static CString str;
//省略
}
/////////////////////////////////////
○X.cpp
//省略
str = _T("a");
//省略
/////////////////////////////////////
このstrの値を他のクラスで使いたい場合
CString buf;
buf = Cabc::str ;
のようにしてもダメなんでしょうか?
わかりにくくてごめんなさい
なにぶん初心者ですのでよろしくおねがいします
530:デフォルトの名無しさん
10/03/05 02:17:13
>>527
公式に「主従」なんかないだろう
俺は事の経緯から導かれる道義的な関係を指摘したまで
531:デフォルトの名無しさん
10/03/05 02:22:40
>>515
extern "C"はCとC++の間でグローバルな関数・変数がリンクできるようになるだけ。
構文の解釈が変わるなどといったことは起こらない。
互換でない例としてはvoid*から他のポインタ型の暗黙変換が可能か否かなど。
532:デフォルトの名無しさん
10/03/05 02:31:53
>>530
いや、導かれてないから。 >>522 の1行目が事実だとしても2行目以降は
あんたが勝手に言ってるだけでしょ。道義的関係とか意味わかんないし。
C89 が当時の標準化もされていなかった C++ と互換性がないとか、当たり前だし。
533:デフォルトの名無しさん
10/03/05 02:36:39
>>532
C89 の目玉が C++ からの逆輸入という事実もあるわな
当時の C++ が標準化がされていようがいまいが C89 はその道を選んだ
どっちが合わせるべき立場にあったかは明確であろう
534:デフォルトの名無しさん
10/03/05 02:37:24
今日は寝落ち
535:デフォルトの名無しさん
10/03/05 02:45:27
>>533
合わせるべき立場とか、無いから。それ、妄想だから。
その調子で「C++0x は C# に合わせるべき立場にいる」とか
「C++0x は D に合わせるべき立場にいる」言い出すやつが
いたとしたらどう思うよ?
あんたが C++ 大好きなのはわかったが、これはさすがに
言いすぎだろ。
536:デフォルトの名無しさん
10/03/05 02:58:29
先発のものが後発に合わせるわけにはいかないってだけのことだろ
C#がC++0xに対して互換性が無いのと一緒
537:デフォルトの名無しさん
10/03/05 03:00:29
long longや可変個引数マクロ、数学関数などC99からC++0xへ持ち込まれるものだってある。
初期化リストをC99の複合リテラルと互換性のある構文にしようという提案が出たことだってあった。
CとC++は,お互いに影響を与えつつ受けつつという関係だと思うなぁ。
538:デフォルトの名無しさん
10/03/05 03:04:36
内部クラスではtemplateが使えないのでしょうか?
以下のようなコードとコンパイルエラーが出ます。
gcc version 4.4.1 (Ubuntu 4.4.1-4ubuntu9)
test0.cpp: In function ‘void func()’:
test0.cpp:14: error: expected primary-expression before ‘template’
test0.cpp:14: error: expected ‘;’ before ‘template’
test0.cpp:30: error: expected ‘}’ at end of input
12: void func()
13: {
14: template<class T>
15: class Hoge{
16: public:
17: static void foo( const T& val ){
18: cout << val << endl;
19: }
20: };
21:
22: Hoge::foo();
23: }
539:デフォルトの名無しさん
10/03/05 03:24:35
使えない。
540:デフォルトの名無しさん
10/03/05 06:03:48
>>529
> わかりにくくてごめんなさい
わかりにくいのは、エラーが何なのかをキミが隠しているからだ。
人生相談コーナーに「とある良くないことが起きました。どうすればいいですか?」とだけ書いて
送っても、「まぁ、気を落とさずに」みたいな曖昧なアドバイスしか来ないぞ。
541:デフォルトの名無しさん
10/03/05 06:57:39
>>529
.cppのstrって何者?
542:デフォルトの名無しさん
10/03/05 07:37:28
>>540
えっと、、そこまで難しいことではないんです
ただ、たとえばどんなクラスからでも使えるCStringの変数が欲しいわけ
でそういうのはどうするのか?という質問なんです。
543:デフォルトの名無しさん
10/03/05 07:39:41
>>541
ヘッダで宣言したCStringのつもりです。
このstrをどんなクラスからでも参照可能にするにはどうしたらいいのでしょうか?
とても困っています
よろしくお願いします
544:デフォルトの名無しさん
10/03/05 07:42:25
ここまで頑としてエラーを書かないのは何でだろうね。
クイズの出題者気取り?
545:デフォルトの名無しさん
10/03/05 07:44:23
静的メンバ変数でググれ
546:デフォルトの名無しさん
10/03/05 07:50:13
>>544
エラーは
LicenselistViewerList.obj : error LNK2001: 外部シンボル
""public: static class ATL::CStringT<char,class StrTraitMFC_DLL<char,class
ATL::ChTraitsCRT<char> > > CLicenselistViewerList::strrr" (?strrr@CLicenselistViewerList@@2V?$CStringT@DV?$StrTraitMFC_DLL@DV?$ChTraitsCRT@D@ATL@@@@@ATL@@A)" は未解決です。
です。
俺はただこの問題が解決してほしいだけなのでクイズとかそんなんではないです
本当に困っています
547:デフォルトの名無しさん
10/03/05 07:51:54
>>545
ググって解決できないから頼んでます。
静的メンバ変数だとこのやりかたで宣言したstrは
Cabc::strで外の変数を使えるとあります。
使えません
どうしてでしょうか?
548:デフォルトの名無しさん
10/03/05 08:03:30
宣言はあってる
定義の仕方が悪い
549:デフォルトの名無しさん
10/03/05 08:08:19
>>546
エラーメッセージは開発者がなにをすべきか直ぐ分かるようにするために出力してるんだぜ
class名::str;
を.cppの先頭付近にでも書いとけ
550:デフォルトの名無しさん
10/03/05 11:48:45
>>546
> strrr
"r" 増えてね?
551:デフォルトの名無しさん
10/03/05 11:52:05
デュラララみたいな
552:デフォルトの名無しさん
10/03/05 13:23:56
>>546
static CString CLicenselistViewerList::strrrという静的メンバ変数の
実体の定義が見つからないのでリンクできないというエラー
静的メンバ変数はヘッダで宣言のみではダメで実体の定義
CString CLicenselistViewerList::strrr;
を.cppファイルに記述する必要がある
553:デフォルトの名無しさん
10/03/05 14:19:52
あのー
*x1 += a;
ってどういう演算するんですか?
554:デフォルトの名無しさん
10/03/05 14:21:33
>>553
x1 の指すオブジェクトに a を加えるっぽい。
これ以上は x1, a の型を明らかにしないとわからん。
555:デフォルトの名無しさん
10/03/05 14:28:19
っへー!!
てっきり、num1 = a + *x1;
とかで何か用意しないとこのaと *x1の合計は作れないものだと思ってました!
てことは -=で引き算出来るんですか?
ホンマ助かりました。今ポインターの勉強してるんです。
ちなみに問題は最初に点数を指定させて、加算点を入力させるというものです。
やさしいc++第3版 著高橋 をやっていました。回答例に出てきていたので
なんぞこれってかんじでした
556:デフォルトの名無しさん
10/03/05 14:30:03
引き算できるよ。*=,/=もあるし&=,|=,>>=みたいなのもある
557:デフォルトの名無しさん
10/03/05 14:31:29
人の顔のAA二ミエマス。
ホントに貴方紳士ですね!また質問に着ます!
有り難うございました
558:デフォルトの名無しさん
10/03/05 14:41:48
>>557 名無しさんが一人だとでも思ってるのか?
559:デフォルトの名無しさん
10/03/05 15:29:43
環境:WindowsXP、VS2008 Express Edition
知っている方がいましたら教えて下さい。
現在、GUIアプリの作成を行っているのですが、
(Windowsフォームアプリケーション開発)
一つ分からない事があります。
下のURLにあるようなTreeViewが欲しいのですが(ページの上の方にあるやつです)、
URLリンク(www.codeguru.com)
どうやって実現するのでしょうか?
ツールボックスを見ても、TreeViewはあるのですが、
上記のようなTreeView+Columnというのがどこにあるのか分からなくて・・・。
560:デフォルトの名無しさん
10/03/05 15:48:23
こっちで訊くのがいいと思う
スレリンク(tech板)
561:デフォルトの名無しさん
10/03/05 15:50:34
>>560
誘導サンクス。
>>569は誘導先で聞いてみます。
562:561
10/03/05 15:51:16
×>>569
○>>559
563:デフォルトの名無しさん
10/03/05 15:51:18
struct a{ virtual ~a{} };
struct b : a{ int array[8] };
//...
a *ptr = new b;
//...
delete ptr; //ptrはa*だけど実際に指しているのはヒープに配置されたbのインスタンス. sizeof(a) != sizeof(b)なのにこんな事してもいいの?
564:デフォルトの名無しさん
10/03/05 15:57:40
いいよ
565:デフォルトの名無しさん
10/03/05 15:58:11
全て分かった上で、話題作りで書き込んでる様に見えるんだが
そりゃ解体子が仮想だから
566:デフォルトの名無しさん
10/03/05 16:15:07
>>565
destructorがvirtualかどうかは関係ないでしょ?
>>563
newしたときのサイズがどこかにしまってあるから。
567:デフォルトの名無しさん
10/03/05 16:22:33
>>566
すまんが釣りに見える
568:563
10/03/05 16:30:00
解体子っていうのはクラス内部のリソースを開放したりするためのもので、
自身がヒープに配置されていたり、それのメモリ管理は関係ないような認識でした。
事実、インスタンスがスタックに配置されていてもデストラクタは走ります。
これは、インスタンスのメモリ管理はインスタンスを抱えているスコープが管理するべきだという事です。
曖昧な理解が解消して助かりました。ありがとうございます。
569:デフォルトの名無しさん
10/03/05 17:11:53
Java厨は勉強熱心だなぁ
それにくらべてC++erは・・・
570:デフォルトの名無しさん
10/03/05 17:17:57
>>566
ちょっと焦ったわ
なわけねえだろw
571:デフォルトの名無しさん
10/03/05 17:46:12
JavaとC++の両刀使いの人っている?
572:デフォルトの名無しさん
10/03/05 17:47:38
ASもJSもPerlもRubyもEsolangも普通にやるがね
573:デフォルトの名無しさん
10/03/05 18:54:59
563は納得したのだろうか。
確保した領域の大きさについてだけ言えば566が正しいと思う。
確保した自由記憶領域の大きさはOS(システムコール)が記録している。
解放する時に大きさを知っている必要は無い。
p = malloc( N ) の後 free( p ) だけでいい(Nを指定する必要が無い)
のと同じ。
そういう意味では565は見当外れ。
まぁC++スレだし、そういうことを訊きたい訳じゃないんだろうけど
574:デフォルトの名無しさん
10/03/05 18:58:27
ポインタを整数サイズで-1して整数表現で取り出したらサイズだったなんてことはよくある事
575:デフォルトの名無しさん
10/03/05 19:09:37
上のシンプルな例ならともかく多重継承なら死にかねない
576:デフォルトの名無しさん
10/03/05 19:58:38
copy(vec.begin(),vec.end(),ostream_iterator<T>(cout,"#"));
だと最後にもセパレータが入って
1#2#3#
となってしまいますが、
1#2#3
がたいてい欲しいものだと思います。
whileの内で条件分岐させる以外にうまい方法知りませんか?
577:デフォルトの名無しさん
10/03/05 20:20:28
最後の一つ前までやればいいだけにみえる
578:デフォルトの名無しさん
10/03/05 20:34:14
>>577
--vec.end()
なんて怖すぎます!
・・・ブルブル。
579:デフォルトの名無しさん
10/03/05 20:37:18
ランダムアクセスイテレータならcontainer.end() - 1でいいだろ
580:デフォルトの名無しさん
10/03/05 20:37:49
怖くねーよカス
581:デフォルトの名無しさん
10/03/05 20:42:41
あれ、空のときに困ると思ったんだけど、
やってみたら大丈夫だった・・・?!
582:デフォルトの名無しさん
10/03/05 20:44:05
あ、わかった。
要素が一個だけのとき、何も出力されなくなる。
583:デフォルトの名無しさん
10/03/05 20:46:19
>たいてい欲しいものだと思います
いや別に。
上手いやり方か知らんが、自分で適当に
↓みたいな反復子を作るのは駄目なのか?
URLリンク(codepad.org)
584:デフォルトの名無しさん
10/03/05 20:47:03
いや、そもそもぜんぜんダメだ。
v=[3,4]
のとき、出力が
3#
ですよ。。。
585:デフォルトの名無しさん
10/03/05 20:51:56
>>583
やっぱそっちですか。
イテレータとかすぐに書けないけど・・・。
ありがとうございます。
586:デフォルトの名無しさん
10/03/05 21:46:35
>>585
楽してイテレーター書くならこんなのどうかな。
URLリンク(www.kmonos.net)
587:デフォルトの名無しさん
10/03/05 21:59:38
boostはホント何でもありますね・・・。
なるべく依存したくないけど。
>>583
理解できたので、ほとんどそのまま使いまわせそうです。
たいへん助かりました。
588:デフォルトの名無しさん
10/03/05 22:04:19
>>587
boostでテクニック勉強したら、自分でサブセットなライブラリを作れば依存しなくてすむんじゃないかな。
589:デフォルトの名無しさん
10/03/06 00:54:10
>>575 何のこと?
590:デフォルトの名無しさん
10/03/06 07:16:34
Hoge Hoge::getObj( ){
return *this;
}
Hoge& Hoge::getObj( ){
return *this;
}
return *this はそのままで戻り値の書き方次第(Hoge& or Hoge)で
参照返しとオブジェクトのコピー返しと変わってしまうというのに違和感を感じる。
上の2通りの違いを *this の部分でも書き示す方(例:参照返し→ @*this )が良かったのに、と思ってしまうのですが
どうですか?
(どうですか?、って言っても仕様だからどうかなる話ではないのですが)
591:デフォルトの名無しさん
10/03/06 07:42:38
それが気になる人は、それ以上に、関数を呼び出すほうも気になるだろうね。
int func1(const Hoge& h);
int func2(Hoge h);
Hoge hoge;
func1(hoge);
func2(hoge); // 同じ書き方
関数定義を書いている時は、すぐそこに戻り値の扱いが見えてる安心感があってまだいいけど、
関数呼び出しを書いている時は、関数の宣言or定義がよその何処かに書かれてる。
エディタ支援があるとはいえ、「遠くの何かを知ってなきゃいけない」感じがあって、より落ち着かないのでは。
592:デフォルトの名無しさん
10/03/06 08:48:31
constなら区別して呼び出せるけどね
void foo(int& a);
void foo(const int& a);
int a; //constではない
foo(const_cast<const int&>(a)); //ここはconst版を呼びたい
593:デフォルトの名無しさん
10/03/06 10:22:01
関数宣言見ただけじゃ参照かどうかわからなくて困るだろ
と思ったけど
int &a = @b;
みたいにしてほしいってことなのかな
594:デフォルトの名無しさん
10/03/06 11:19:24
constにするときはstatic_castでいいんじゃないか
595:デフォルトの名無しさん
10/03/06 11:30:14
そんなことよりint @sp = spnew int [10]; int $wp = wpnew sp;を組み込んでくれ
596:デフォルトの名無しさん
10/03/06 11:31:26
シンタックスシュガーは
もっと多くてもいい
597:デフォルトの名無しさん
10/03/06 11:42:32
オレサマプリプロセッサ作って好きに構文創作しれ
598:デフォルトの名無しさん
10/03/06 13:55:16
>>597
#define amigo friend;
愛用してます
599:デフォルトの名無しさん
10/03/06 15:28:31
フレンド程度に内面を洗いざらいさらしていいのか?
600:デフォルトの名無しさん
10/03/06 15:34:29
>>597
#define foreach BOOST_FOREACH
601:デフォルトの名無しさん
10/03/06 15:37:34
>>599
friendのおかげで、余計なpublicを作らずprivateで済ませられるんじゃないのか。
602:デフォルトの名無しさん
10/03/06 15:40:05
#define buddy friend;
じゃないの?
603:デフォルトの名無しさん
10/03/06 15:42:12
friendはクラステンプレート中にテンプレート関数を定義したい
時に、暗黙の型変換ができるように使っている。
Effective C++で紹介されていた内容。
604:デフォルトの名無しさん
10/03/06 15:56:22
>>598
ほらみろよく判って無い奴が調子に乗って暴れ出したじゃないか
605:デフォルトの名無しさん
10/03/06 15:59:18
そこは指摘せずにそっとしておく所だろ
606:デフォルトの名無しさん
10/03/06 16:54:52
abort() if (!p);
みたいに書けるようにはならんのか。
607:デフォルトの名無しさん
10/03/06 17:25:45
if (!p) abort() ;
608:デフォルトの名無しさん
10/03/06 17:35:50
>>606
C++などのほかの言語なんかに手を出さず、一生perlを使い続けるべきだと思います。
609:デフォルトの名無しさん
10/03/06 17:42:02
perlではif文を後に書くのか?
610:デフォルトの名無しさん
10/03/06 17:56:39
>>596
言語の文法は最小限でライブラリで拡張できるほうがいい。
611:598
10/03/06 18:17:05
すいません嘘です
612:デフォルトの名無しさん
10/03/06 19:54:49
abort() if(!p) else exit();
とか普通に書きたいんじゃないの?
613:デフォルトの名無しさん
10/03/06 19:55:27
>609
文修飾子という扱いで後ろにも置ける。
if(e) { func(); }
func() if e;
は OK だけど、
if(e) func();
{ func() } if e;
はできない。
614:デフォルトの名無しさん
10/03/06 20:00:36
>>613
2種類の書き方があるっていうか、そういうのって分りにくくないのかな?
後に書くということは
func(すっげー長い式なんたらかんたらどうのこうの) if e;
だと読むときifを読み落としそうだなあ。
615:デフォルトの名無しさん
10/03/06 20:01:35
ワケ分からんw
C++だと、func() ;も{ func() ; }も、ひとつのstatementなので、ものすごい違和感があるな。
{ func() ; } if e ;
ができないというのは、ものすごく違和感があるな。
616:デフォルトの名無しさん
10/03/06 20:06:35
struct A;
struct B{ B( A& ); }
A a(); // これとか
B b( A() ); //これが
関数宣言にみなされない書き方ないの?
A a;
B b( a );
とかじゃない方法で。
617:デフォルトの名無しさん
10/03/06 20:09:39
>>615
思うに。
{
すげーー長い文
なんたらかんたら
だらだらだらだら
}
if e;
って読むのに困るよね。
do{}while()でも読みにくいのね。
618:デフォルトの名無しさん
10/03/06 20:22:06
do... whileは、まだ、先頭にdoがあるから、「あ、これはdo... while文の始まりだな」と分かるわけで、
それほど読みにくいってほどでもないんじゃないかな。
619:デフォルトの名無しさん
10/03/06 20:23:29
>>616 ないよ。
620:デフォルトの名無しさん
10/03/06 20:31:05
func() if e; はシンタックスシュガーの一例か?
混乱の割にメリットは感じられない。
621:デフォルトの名無しさん
10/03/06 20:51:51
ループの先頭などで、
break if foo
continue if bar
とかするのは気持ちいい。
622:デフォルトの名無しさん
10/03/06 21:14:57
だから、perl以外の言語は触らずに
perlだけ使ってなよ。
623:デフォルトの名無しさん
10/03/06 21:25:16
ハ,,ハ
(*゚ω゚ ) >>622お断りします。Rubyも使います。
. (=====)
_(_⌒) )
/\ `J  ̄ ̄\
 ̄ ̄ ̄ ̄| | ̄ ̄ ̄
|
/ \
 ̄ ̄
624:デフォルトの名無しさん
10/03/06 22:07:59
perlで俺シンタックスシュガープリプロセッサ作ればいいんじゃね?
625:デフォルトの名無しさん
10/03/06 22:18:21
foreach(int x, std::make_pair(v.begin(), it))
みたいにカンマが含まれても大丈夫なマクロが欲しいです
626:デフォルトの名無しさん
10/03/06 22:57:30
>614
Perl には TMTOWTDI(There's More Than One Way To Do It:やり方は一つじゃない)という
スローガンがあってな。
>615
Perl では { } は block であって文じゃないんだ。
>620
if (e) func(); ができなくていちいち block 書くのが面倒という事なんだと思う。
627:デフォルトの名無しさん
10/03/06 22:57:49
>616
URLリンク(www.parashift.com)
628:デフォルトの名無しさん
10/03/06 23:36:34
あの、ひとついいですか?
僕は現在高校2年生です。そんなぼくにもC++はマスター
できます?
629:デフォルトの名無しさん
10/03/06 23:40:22
それなりのことはできるようになりますがマスターはそう簡単にはできません
630:デフォルトの名無しさん
10/03/06 23:46:51
>>628
それはお前次第やろ
631:デフォルトの名無しさん
10/03/06 23:55:49
>>625
C99の__VA_ARGS__が、C++0xに入る。
632:デフォルトの名無しさん
10/03/07 01:23:57
double* darray = new double[0];
delete [] darray;
のようなことがプログラム中で起こるのですが、問題ありますか?
633:デフォルトの名無しさん
10/03/07 01:25:45
>>632 いいえ。何が心配?
634:デフォルトの名無しさん
10/03/07 01:35:02
サイズ0だと続けて次に確保したときに、おんなじ場所を確保しちゃうような気がする
ダミーで1byteぐらい確保されんのかな
635:デフォルトの名無しさん
10/03/07 01:37:05
>>634
ヌルを返したり他のオブジェクトと同じアドレスを返したりしちゃいけないことになってるから、
だいたいの実装がそんな感じ。
636:デフォルトの名無しさん
10/03/07 02:15:18
0バイトのオブジェクトは存在できないから標準に従えば1バイト以上確保することになる
だがdarray[0]にアクセスすると未定義動作
変なの
637:デフォルトの名無しさん
10/03/07 02:27:16
void *operator new (std::size_t size)
{
if(size == 0) throw std::bad_alloc("Fack you!"); return std::malloc(size);
}
638:デフォルトの名無しさん
10/03/07 02:35:06
error: no matching function for call to 'std::bad_alloc::bad_alloc(const char [10])'
639:デフォルトの名無しさん
10/03/07 07:00:01
"C++"で、依存関係を解決するためにインターフェイス指向な設計に取り入れるってこと多いかなぁ?
テンプレートではなく、仮想関数を使う方法で。
640:デフォルトの名無しさん
10/03/07 07:00:33
s/設計に/設計を/
641:デフォルトの名無しさん
10/03/07 07:09:36
>>639
あると思うよ。
今の時代だとクリティカルな部分さえ最適化できればいいから動的型付けに対してそんなに神経質になる必要も無い。
ソフトウェア工学から見たある程度の規模からの開発のし易さや動的な依存関係の解決には仮想関数が向いているし
テンプレートを用いた静的な型レベルの解決なら実行速度に対する最適化が向いている。
臨機応変に適材適所できるからC++が選ばれる、何てこともあるね。
強い動的型付けな言語(Rubyとか)になっちゃうと融通が利かないし。
でもRubyとかを採用する現場では速度低下の弊害より人材のコスト考えてる場合ばおおいね
642:デフォルトの名無しさん
10/03/07 08:52:23
>>639
俺はよく使ってる。
継承を使う時は、純粋仮想関数のみで構成されたクラスの継承がほとんど。
テンプレートを依存関係を解決するために使うのは、本当にテンプレートが効果的かよく考えてやった方がいいと思う。
643:デフォルトの名無しさん
10/03/07 09:44:55
>>634
コンストラクタで malloc() を呼ぶと
malloc(0) でも8バイトぐらいは確保される。
ここらへんは Cライブラリの実装次第だが、
あとで realloc()/free() に渡す可能性があるポインタということを
考えると0バイトであってもユニークなポインタが返されるべき。
644:デフォルトの名無しさん
10/03/07 10:48:18
templateを使った依存関係の解決ってどういうの?
645:デフォルトの名無しさん
10/03/07 12:20:35
>>644
class Hoge {
void foo() { fuga_.(this); }
Fuga<Hoge> fuga_;
}
俺はこんなのを想像した。これは相互参照か?
単に特定のクラスに依存したら拡張性がなくなるから、テンプレート引数で指定できるようにしたいという事かもしれない。
646:645
10/03/07 12:22:14
2行目訂正
void foo() { fuga_.bar(this); }
647:デフォルトの名無しさん
10/03/07 12:30:42
こういうのを相互参照って言うんじゃないか
class b;
class a
{
b* bb;
};
class b
{
a* aa;
};
648:デフォルトの名無しさん
10/03/07 12:59:32
多態性を持ちつつどこかに保存しなければならない場合にはインターフェース(か、型消去)を使うかな
でも保存する必要が無い関数の引数とかだったらテンプレートの方がいいと思う
例えば標準のアルゴリズムをテンプレートじゃなくてインターフェースで解決しようとしたら結構めんどくさいだろう
std::random_access_iterator_interfaceみたいなのが沢山作られて、それを適切に継承してないイテレータは対応アルゴリズムが使えない
みたいな感じで、行儀はいいんだけど、すごいめんどくさくなる
649:デフォルトの名無しさん
10/03/07 16:00:23
理想的には継承と多相は独立した概念なんでしょうね。
要求される振る舞いが出来ることを保証する仕組みの一つが
継承であるだけで。
650:デフォルトの名無しさん
10/03/07 16:10:37
いわゆるダックタイピング
651:デフォルトの名無しさん
10/03/07 16:40:10
>>649
多相を実現する手段の一つが継承
652:デフォルトの名無しさん
10/03/07 18:35:47
ダックタイピングはコンセプトがあればなぁ
653:デフォルトの名無しさん
10/03/07 18:50:34
せめてコンパイラのエラーメッセージがわかりやすくなれば
654:デフォルトの名無しさん
10/03/07 23:48:11
スマポのお勉強してるんですが
キャストってどうやって実装してるんでしょうか?
class hoge : public fuga;
void test(const oreore::unique_ptr<fuga> &p);
oreore::unique_ptr<hoge> p(new hoge);
test(p);
といった感じの使い方を許可したいんですがどうにもうまくいきません
所有権の移動を禁止する方針で作っている(コピー代入を封印)のでキャストするときにテンポラリな値を返せません
template <class Other> oreore::unique_ptr<Other> (void)
{
return oreore::unique_ptr<Other>(*this); // 禁止されてる
}
655:デフォルトの名無しさん
10/03/08 00:10:08
>>654 std::move するんだよ。
656:デフォルトの名無しさん
10/03/08 03:22:13
>>654
C++0xなら、rvalue referenceが使える。
それ以前のC++では、一応、auto_ptrを実装できるぐらいの方法はあるが、
そのテクニックを学ぶことは、精神衛生上よろしくないので、おすすめしない。
657:デフォルトの名無しさん
10/03/08 04:21:56
>>654
コピー代入を封じるなら無理。
キャストは、元オブジェクトからキャスト先オブジェクトという作るという点では、複製に等しいため。
それこそ>>655の言うように所有権の移動を許可する方向でやるしかない。
(もちろん所有権が移る以上、本来のキャストとは若干異なるセマンティクスになる)
658:デフォルトの名無しさん
10/03/08 07:36:01
const_cast ってconstはずしだから <> の中に型書くの無駄だなぁって思ってしまう。
const int* からconstとったら int* に決まってんじゃん、と。
659:デフォルトの名無しさん
10/03/08 08:09:18
>>658
const_castがオマエの言うような機能だったとして、このコードはどうすればいいんだ?
int x = 0 ;
int const * const p = &x ;
const_cast(p) ;
さあどれだ?
const_cast<int * const>(p) ;
const_cast<int const * const>(p) ;
const_cast<int *>(p) ;
660:デフォルトの名無しさん
10/03/08 11:12:58
template<class vtype>
class Test
{
public:
Test( ){ }
void func( );
};
のようなクラスのとき、
vtype が P と Test<P> (Pはプリミティブ型) とで呼び出す func( ) を変える方法はありますか?
661:デフォルトの名無しさん
10/03/08 11:33:00
特殊化すればいいよ
662:660
10/03/08 12:15:01
>>661
このようにしたのですが、うまく行きません。。。
template<class vtype>
void Test<vtype>::func( )
{
cout << "aaa" << endl;
}
template<class vtype>
void Test<Test<vtype> >::func( )
{
cout << "bbb" << endl;
}
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5400日前に更新/218 KB
担当:undef