C++相談室 part78 ..
[2ch|▼Menu]
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;
}


663:デフォルトの名無しさん
10/03/08 12:22:01
>>662
URLリンク(codepad.org)

664:660
10/03/08 12:39:43
>>663
ありがとうございます。
クラスレベルで特殊化してしまうと、メンバ関数が沢山ある場合
同じようなコードが沢山生まれてしまうので
関数部分だけ特殊化できれば、と思ったのですが
クラスのところで特殊化しなきゃダメなのですね。



665:デフォルトの名無しさん
10/03/08 12:40:57
>>664
URLリンク(codepad.org)

666:660
10/03/08 12:52:05
>>665
テンプレートと継承の組み合わせというのは考えられませんでした。
ありがとうございます。


667:デフォルトの名無しさん
10/03/08 13:41:10
>>655-657
サンクスです
キャスト≒複製って知りませんでした
時期標準のソースをチラ見したところ標準もキャストはサポートされてなかったので、uniqueの方はキャスト諦めることにしました

668:デフォルトの名無しさん
10/03/08 15:54:42
構造体のメンバ変数を一括で代入する方法ってないんですか?
例えば構造体Aの変数のメンバ変数を全て0にするとか…

669:デフォルトの名無しさん
10/03/08 16:26:02
struct S { int a, b, c; double x, y, z; static S empty; };
S S::empty = { 0 };

S var;
var = S::empty;

670:デフォルトの名無しさん
10/03/08 17:44:32
サンクス。クラス使わないとダメなんすか?

671:デフォルトの名無しさん
10/03/08 18:03:45
pod作る関数を作ればいい。テンプレートで

672:デフォルトの名無しさん
10/03/08 18:05:33
struct S { int a, b, c; double x, y, z;};
S a={0};
これで事足りるんじゃ

673:デフォルトの名無しさん
10/03/08 18:14:12
>>672 それは代入じゃない。

674:デフォルトの名無しさん
10/03/08 18:17:26
あーざっす

675:デフォルトの名無しさん
10/03/08 18:17:34
初期化だ(キリッ

676:デフォルトの名無しさん
10/03/08 19:48:52
>>659
const_cast<int *>(p)だろ
他のconstが必要なら後で付ければいい
何があかんのですか

677:デフォルトの名無しさん
10/03/08 20:22:05
const const_iterator* it;
const_cast(it)

これはどうなるんだ?
const_iteratorはポインタかもしれないしクラスかもしれない

678:デフォルトの名無しさん
10/03/08 20:35:48
const_iteratorがconst Type*だった場合、
itの型はconst Type *constでconst_castするとconst Type*になる。
そうでない場合、const_castするとconst_iteratorになる。ただそれだけの話。

679:デフォルトの名無しさん
10/03/08 20:43:53
>>676
void const * const * const cpcpc = 0;
void ** pp = const_cast<void**>(cpcpc);
void const ** cpp = const_cast<void const**>(pp); // このcastはどうすんの?


680:デフォルトの名無しさん
10/03/08 20:54:34
>>678
>itの型はconst Type *constでconst_castするとconst Type*になる。
なんでType*じゃないんだ?>>676と矛盾しない?

681:デフォルトの名無しさん
10/03/08 22:11:07
std::complexのconj( )って何でメンバ関数ではなくグローバル関数なのですか?

682:デフォルトの名無しさん
10/03/08 22:15:54
無闇にメンバ関数にするとprivateにアクセス出来てしまうから、
privateにアクセスする必要のない関数は
メンバでもfriendでもない関数にするのが良いって
偉い人が言ってた

683:681
10/03/08 22:28:24
>>682
ありがとうございます。

もし自分がcomplex作ったら、conj( )をメンバ関数にして
privateなデータを変更してしまうように実装しそうなのですが
これは良くないんですかね?

684:デフォルトの名無しさん
10/03/08 22:34:42
そもそも変更することがおかしいんじゃないかい。
メンバ変数にするにしてもconstにするべきだと思う。
共役複素数を求めるだけだよね?

685:デフォルトの名無しさん
10/03/08 22:42:05
むしろその程度の軽い型なら不変型にしちゃった方が

686:681
10/03/08 23:02:53
>>684
イメージ的にはこんな感じです。

myComplex<double> mc0(2,2); // 2+2i
mc0.conj( ); // 2-2i

グローバル関数にするとコピーが発生してしまうので
良くないのかなぁ、と思ったのですが。

687:デフォルトの名無しさん
10/03/08 23:14:08
実測した訳じゃないが、
あまり効果なさそうな気はする。
コードを見やすくしたほうがいいんじゃないだろうか。

688:デフォルトの名無しさん
10/03/08 23:28:29
なんで配列はイニシャライザリストで初期化出来ないんですか?

689:デフォルトの名無しさん
10/03/08 23:50:50
C++0xにご期待ください

690:デフォルトの名無しさん
10/03/09 01:16:28
>>679
const増やすのはstatic_castでもreinterpret_castでも出来る
お好きな方で

691:デフォルトの名無しさん
10/03/09 01:19:23
>>690 キャスト無しで通っちゃうよ。

692:デフォルトの名無しさん
10/03/09 01:28:37
>>676
void f(void const* a[]); // const 一個付け忘れてるけど変更できない外部ライブラリ
void f(void* a[]); // 同上、ただし非 const データを対象とするオーバーロード

// ここから自前のコード
void g(void const* const a[])
{
f(const_cast(a)); // 上のオーバーロードに渡したいのに下のほうにいっちゃう
}

こわくね?

693:デフォルトの名無しさん
10/03/09 02:23:22
まあconst_cast使うなってのが基本だから
それを書きやすくするうえに他のキャストと違う形になる
省略記法なんて認められないと思われる

694:デフォルトの名無しさん
10/03/09 07:04:10
>>690-691
うちのVC++2008EEではconst_castかC style castでないと通らないんだけど、
なんかおかしいのかな。

695:デフォルトの名無しさん
10/03/09 07:21:42
どうせ<>書いてないとか

696:デフォルトの名無しさん
10/03/09 07:26:55
通らない
URLリンク(codepad.org)

697:デフォルトの名無しさん
10/03/09 07:48:53
void ** const cpp = static_cast<void **>(pp);
えっ?

698:デフォルトの名無しさん
10/03/09 07:49:47
>>696
それは、規格の文面によって、明示的に禁止されている。
4.4 Qualification conversions [conv.qual]

なぜできないのかというと、それを用いることによって、const性に穴が生じるから。
規格のサンプルコードを、適当にコメントを補って引用すると、

int main() {
const char c = ’c’;
char* pc;
const char** pcc = &pc; // 仮に、これが許可されているとする
*pcc = &c;// ppcを介して、pcを変更している。
*pc = ’C’; // pcはconstでもないのに、constなはずのcを参照出来ているので、変更できる。
}

つまり、constなppcを介して、非constなpcを変更できてしまうので、
pcが、明示的なキャストもなしに、constなオブジェクトを参照することが可能になってしまう。

699:デフォルトの名無しさん
10/03/09 07:57:03
>>698
規格の参照までしていただいて、ありがとうございます。
参考になります。

ということで、これを踏まえて改めて>>679

700:デフォルトの名無しさん
10/03/09 07:57:31
ubuntu の gcc version 4.4.1 (Ubuntu 4.4.1-4ubuntu9)
環境で例外クラスの実装を見ようと思ったのですが
/usr/include/c++/4.4/stdexcept
に logic_error などの宣言はあるのに実装が書いてありません。
どのファイルを見たら良いでしょうか?

701:デフォルトの名無しさん
10/03/09 08:07:03
const_castの話してるやつはコテ着けるか
婉曲表現と皮肉をやめて直接主張しろ
何人かいて訳が分からない

702:デフォルトの名無しさん
10/03/09 08:40:34
はがす時は全はがしが楽じゃね?ってことが基点となっていると思うので

void const * const * const cpcpc = 0;
void ** pp = const_cast<>(cpcpc); // 全はがし
void const ** cpp = const_cast<void const**>(pp); // つける時は書く
// void const ** cpp = const_cast<void const**>(cpcpc); // 一部はがしのときもこれまで同様書ける

というのを望んでんのかも

703:デフォルトの名無しさん
10/03/09 09:06:33
がんばれ
658 :デフォルトの名無しさん :2010/03/08(月) 07:36:01
const_cast ってconstはずしだから <> の中に型書くの無駄だなぁって思ってしまう。
const int* からconstとったら int* に決まってんじゃん、と。

704:デフォルトの名無しさん
10/03/09 14:09:06
constの話で盛り上ってるからついでに聞きたいんだけど

struct X {
int *p;

void test(int x) const
{
*p = x;
}
};

こう書くとconst指定してるのにオブジェクトの内容が変化してる
これって合法なの?


705:デフォルトの名無しさん
10/03/09 14:14:13
>>704
Xのオブジェクトはpであることを思い出せ。
pはint*型だから「int型の値のあるメモリの位置」を指している。
*p = xは「pの指している先のint型の値に対する副作用」であって「pに対する副作用」ではない。

706:デフォルトの名無しさん
10/03/09 15:34:24
pは宝の地図
*pは宝の中身
Xのメンバはpつまり宝の地図
だからtest(int x) constとは宝の地図を書き換えちゃいけないってこと
*p = xは宝の中身を入れ替えているだけ

707:デフォルトの名無しさん
10/03/09 15:39:05
中々面白い例え方をするな。

708:デフォルトの名無しさん
10/03/09 15:54:36
**pは宝の地図の在り処を書いた地図か。判りやすいね。

709:デフォルトの名無しさん
10/03/09 15:57:01
ゲームのお使いクエストだな。
そのお宝の例えは俺は結構好きだな。

710:デフォルトの名無しさん
10/03/09 16:19:18
へー、いい表現じゃん

711:デフォルトの名無しさん
10/03/09 16:23:11
サンクス
正常な動作だったのね

712:デフォルトの名無しさん
10/03/09 17:43:29
new intは新しく宝を作るが、この式自体は新しく作られた宝のありかを示す地図を返す。
new int*は宝の地図を新しく作りその地図のありかを返す式だが、新しく作られた宝の地図には宝のありかは書いてない。
難しいな。

713:デフォルトの名無しさん
10/03/09 19:38:02
new int*なんてあんの? あるなら知らなかった。

714:デフォルトの名無しさん
10/03/09 19:44:58
型なら何でもnew出来るだろ

715:デフォルトの名無しさん
10/03/09 19:46:35
関数型もできるっけ?
関数ポインタじゃなくて。

716:706
10/03/09 21:01:33
何の気無しに書いたんで、反応あって驚いてる。
>>706は、一番最初にポインタを勉強する時に俺が(たまたま)イメージしたもので、
今にして思うと、地図という「質量を持った物体」でポインタを喩えたのが好都合だった気がする。
たまたまそういうイメージをしたお陰で、ポインタもまた「そういう値」である、って所で
まったく混乱せずに済んだ。>>708が言うように、ポインタのポインタも
「勇者は宝箱を開けた。なんと宝の地図を見つけた!」ということだと考えれば楽だったし。

717:デフォルトの名無しさん
10/03/09 22:24:46
C++は勉強するほど自信がなくなっていくな・・・boostマジキチ

718:デフォルトの名無しさん
10/03/09 23:10:15
>>716
初心者には分かりやすい言い例えだね。
俺もそれ使わせてもらいます。


719:デフォルトの名無しさん
10/03/09 23:24:34
住所とか例えるより絶対わかりやすい。

720:デフォルトの名無しさん
10/03/09 23:30:25
>「勇者は宝箱を開けた。なんと宝の地図を見つけた!」

あるあるw

721:デフォルトの名無しさん
10/03/09 23:38:31
ポインタを宝箱に例えるなら、中身の種類は開ける前から判っているんだが

722:デフォルトの名無しさん
10/03/09 23:38:54
s/宝箱/宝箱の地図/

723:デフォルトの名無しさん
10/03/10 00:06:18
で?

724:デフォルトの名無しさん
10/03/10 00:35:08
ヌルポインタはミミックだな
開けると死ぬ

725:デフォルトの名無しさん
10/03/10 01:44:47
住所にたとえるのと変わらんと思うがね

726:デフォルトの名無しさん
10/03/10 01:46:21
ていうか別に喩えなくても分かるから

727:デフォルトの名無しさん
10/03/10 01:46:56
ミミックは固定ボスだから、地図が読めない奴が初見殺しされるだけだろ

728:デフォルトの名無しさん
10/03/10 04:46:42
minorという変数がプログラム中にありますが、
cstdlibをインクルードしたら以下のようなエラーが出るようになりました。

error: macro "minor" passed 2 arguments, but takes just 1

これは単純に、minorという変数名を使うな、という解釈でよいでしょうか?

729:デフォルトの名無しさん
10/03/10 04:58:04
>>728
どう読んだらそんな解釈になるんだよ。

そのエラーが再現する最小ソースを作ってみれ。

730:728
10/03/10 05:25:53
>>729
言葉足らずでした。

上記のエラーは、
ctdlib の中(もしくはcstdlibがインクルードしているファイルの中)に
引数を1つとるminorというマクロ(?)があるから、
引数が2つある自作クラスのオブジェクト名をminorにしてはいけない
ということでしょうか?

以下ソース

#include <cstdlib>

class Hoge
{
 public:
  Hoge( int i, int j ){ }
};


int main(int argc, char* argv[])
{
 Hoge minor(1,1);

 return 0;
}


731:デフォルトの名無しさん
10/03/10 05:36:58
>>730
別に言葉足らずじゃない。>>729が寝ぼけてるだけ。
環境によってはsys/types.hにminorマクロがあるので使わない方がいい。

732:デフォルトの名無しさん
10/03/10 05:43:19
>>731
ありがとうございます。

733:デフォルトの名無しさん
10/03/10 05:56:50
>>730
手元の Cygwin g++ 4.3.4 では何事もなくコンパイルが通ったよ。

ちなみに >728 の環境(OS、コンパイラ、そのバージョン)は何?

734:デフォルトの名無しさん
10/03/10 06:01:57
>>731
cstdlib のインクルードでユーザーが使える名前がマクロ定義されてるのは
コンパイラのバグ(標準違反)だと言ってしまっていいと思うんだけど、そういう
予防しとかないといけないものなの?どっかの環境での常識?

735:728
10/03/10 06:04:13
>>733
Ubuntu 9.10
gcc version 4.4.1

です。

gcc -v の内容全部貼ると
Using built-in specs.
Target: i486-linux-gnu
Configured with: ../src/configure -v
--with-pkgversion='Ubuntu 4.4.1-4ubuntu9'
--with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs
--enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --enable-shared --enable-multiarch
--enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext
--enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4 --program-suffix=-4.4
--enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc
--enable-targets=all --disable-werror --with-arch-32=i486 --with-tune=generic
--enable-checking=release --build=i486-linux-gnu --host=i486-linux-gnu
--target=i486-linux-gnu
Thread model: posix
gcc version 4.4.1 (Ubuntu 4.4.1-4ubuntu9)

736:デフォルトの名無しさん
10/03/10 06:14:04
-std=c++98 とかすれば逃げれたりするんじゃないかなー。
まぁ #undef すりゃいいんだけどね。

737:728
10/03/10 06:35:01
以下のソースコードコンパイルすると

#include <cstdlib>

void minor( int i, int j )
{
}

int main(int argc, char* argv[])
{
 return 0;
}


test.cpp:5:26: error: macro "minor" passed 2 arguments, but takes just 1
test.cpp:5: error: variable or field ‘minor’ declared void
test.cpp:5: warning: extended initializer lists only available with -std=c++0x or -std=gnu++0x

というerrorと、warningが出ます。
>>730のソースコードではwarning出ませんでした。

738:デフォルトの名無しさん
10/03/10 09:54:54
functionってすげいな
ソース眺めるだけで勉強になる

739:デフォルトの名無しさん
10/03/10 17:43:07
struct A;
struct B{A a;};
struct A{int a;};
int main(){return 0;}

前方宣言したら、後で定義してれば
使えると思ってたんですが
これがエラーになります
Bの中をA* aにするとエラーが消えるのですが
その辺に理由があるんでしょうか?

740:デフォルトの名無しさん
10/03/10 17:53:13
ちょっと実験してみたところ、前方宣言って思ったほど強くない?んですね
Aのデータは定義されるまでは全く参照出来ないのか

struct A;
struct B{void f(A *a){}}; //セーフ
//struct B{void f(A& a){}}; //セーフ
//struct B{void f(A a){}}; //アウト
//struct B{void f(A& a){a.a;}}; //アウト
//struct B{void f(A* a){a->a;}}; //アウト
struct A{int a;};
int main(){return 0;}

741:デフォルトの名無しさん
10/03/10 18:01:37
サイズがわかってるかどうかで判断できるよ

742:デフォルトの名無しさん
10/03/10 19:10:29
なるほど、セーフなのはアドレスですもんね
ありがとうございました

743:デフォルトの名無しさん
10/03/10 22:23:35
>>738
しかしそんなソースを仕事で書いたら
同僚に白い目で見られそうだww

744:デフォルトの名無しさん
10/03/10 22:40:04
すみません
vectorのresizeでサイズを大きくした時に
拡張した結果メモリの再配置が起こったとすると
resizeする前のデータはコピーされるのでしょうか?

745:デフォルトの名無しさん
10/03/10 22:42:12
ざれます

746:デフォルトの名無しさん
10/03/10 22:43:10
>>744
URLリンク(www.fides.dti.ne.jp)

747:デフォルトの名無しさん
10/03/10 22:43:18
ありがとうございます><.

748:デフォルトの名無しさん
10/03/11 00:56:34
クラスを使ってプログラミングする場合、main関数はどのように使用すればいいのでしょうか?

749:デフォルトの名無しさん
10/03/11 00:59:17
普通に使用すればいいです

Javaみたいにどっかのクラスのstatic関数にする必要はなし、というか無理

750:デフォルトの名無しさん
10/03/11 01:51:16
オペレータオーバーロードの ->* って、どう定義してどう使うんですか?
ググール先生に聞こうと思ったんだけど記号検索できませんでした

751:デフォルトの名無しさん
10/03/11 01:55:22
URLリンク(homepage2.nifty.com)

752:デフォルトの名無しさん
10/03/11 02:06:36
結合力最強の二項演算子なので
マクロとかで細工するときに便利なこともあります

753:デフォルトの名無しさん
10/03/11 02:24:57
>>751
どうもです
しかしなんだこれって感じですね
ポインタエミュレートのために
(myp_hoge->*(&MyPtr<hoge>::Func))(a, b, c);
といった形で使いたいんですが、定義の仕方が分からないです(->なら簡単なんですが・・・)

>>752
そういう特殊な使い方ってよく思いつくもんですよね

754:デフォルトの名無しさん
10/03/11 03:03:47
>>748
徹底したクラス指向で行くならこの程度のものになる。
int main()
{
 MainClass m;
 return m.main();
}

755:デフォルトの名無しさん
10/03/11 04:20:39
int main()
{
 return MainClass()();
}
徹底するならこうだろーと思った俺はそろそろ寝るべきか

756:デフォルトの名無しさん
10/03/11 04:51:32
operator RESULT(); //用意するだろ普通

757:デフォルトの名無しさん
10/03/11 16:29:37
throwでint投げると問題があるようなことを聞いたのですが、
どんな問題があるんでしょうか?
ポインタでキャッチしてしまうとか?

758:デフォルトの名無しさん
10/03/11 16:33:36
受け取る方はみんなstd::exceptionを継承してて欲しいなーって思ってるから

759:デフォルトの名無しさん
10/03/11 16:44:47
なるほど。よくわかりました。

760:デフォルトの名無しさん
10/03/11 17:01:56
istringstream の putback って何回でも呼んでおk?

761:デフォルトの名無しさん
10/03/11 21:28:31
boost::functionとstd::functionって混在しても問題ありませんか?
それともどちらか一方にすべきでしょうか?

762:デフォルトの名無しさん
10/03/11 21:54:55
混在させたこと無いからわからんけど、大丈夫じゃね?
どっちも最終的にはただの関数オブジェクトになるわけだから
boostのほうにstdのfunctionを代入することも逆もできるはず
名前は名前空間があるからかぶるわけないし

763:デフォルトの名無しさん
10/03/11 22:54:37
ABI互換性は?

764:デフォルトの名無しさん
10/03/11 23:03:33
混在といっても、ひとつのコンパイラでコンパイルするんだからABI関係なくね?


765:デフォルトの名無しさん
10/03/11 23:15:46
namespace boost = std ;

766:デフォルトの名無しさん
10/03/11 23:28:03
ありがとうございます。
今のところはboostが使えるならboostが無難かと
思うのでboostにします。


767:デフォルトの名無しさん
10/03/11 23:34:01
>>766
えぇーーー
普通は逆でしょ
標準で済むなら標準を使うのが筋でしょ

768:デフォルトの名無しさん
10/03/11 23:38:24
>>767 std::function はまだ標準じゃないでしょ。

769:767
10/03/11 23:40:20
>>768
そりゃそうだ
boost と std だけ見て function を見てなかったよ

770:デフォルトの名無しさん
10/03/11 23:48:14
>>766も「今のところは」って言ってるしな。


771:デフォルトの名無しさん
10/03/12 01:27:32
placement newを使わずに、任意のメモリ領域にコンストラクタを呼ぶことは不可能?

772:デフォルトの名無しさん
10/03/12 01:30:56
>>771
何がしたいのかわからないけど、コピーでいいなら std::allocator::construct() とか
std::uninitialized_copy() とかが使えるんじゃない?

773:デフォルトの名無しさん
10/03/12 10:16:48
template <class T> void Caller( T &f ){ f(); }
に対して、
void Callee();
があり、
Caller( Callee ); // これだとコンパイルが通るのに、
Caller( &Callee ); // こっちは通らない
のはなぜですか?

774:デフォルトの名無しさん
10/03/12 10:40:58
URLリンク(codepad.org)
それはポインタだからさ

775:デフォルトの名無しさん
10/03/12 20:32:25
関数の引数に配列の参照を渡したいんですが、どうすればいいですか

776:デフォルトの名無しさん
10/03/12 20:54:16
>>774
サンクスです。
T &fは「関数の参照型」と言えばいいんでしょうか?
また、関数ポインタを呼ぶ際は、
(*f)(); //デリファレンスあり
f();//なし
2通りで呼べますが、これはシンタックスシュガー的なものですか?
どっち使ってもOKですか?

777:デフォルトの名無しさん
10/03/12 20:54:42
template<typename T, size_t N> void func(T (&x)[N])

778:デフォルトの名無しさん
10/03/13 00:39:50
typedef std::deque<int>::iterator iterator;
iterator tekitou;
//...
tekitou == iterator(); //tekitouに代入処理がなかったらtrue
を期待して組んでたら例外が発生してパソコンが爆発したんですけど
tekitouがデフォルトコンストラクタ走ったまま何も触られて無いかどうかを判定する方法はありませんか?

779:デフォルトの名無しさん
10/03/13 00:52:18
>>778
パソコンが爆発するプログラムを作っているんだったら
いますぐやめなさい。

780:デフォルトの名無しさん
10/03/13 00:53:54
パソコンが爆発するプログラムを作っているのではありません。
パソコンが爆発するのを防ぐプログラムを作っているのです。

781:デフォルトの名無しさん
10/03/13 01:15:50
爆発させるプログラムにも実に巧妙なメカニズムがあってだな・・・

782:デフォルトの名無しさん
10/03/13 01:17:30
兎に角、例外が発生してプログラムが正常に動作しないと爆発を防ぐ事ができないのです。
ご教示いただけないでしょうか?

783:デフォルトの名無しさん
10/03/13 01:20:26
判定する方法は無い
ポインタと違ってイテレータにはNULL入れられないからねぇ
int *ptr = 0;

784:デフォルトの名無しさん
10/03/13 01:21:45
本当に爆発するというなら、
本題なんてどーでもよくて、爆発させる方法を知りたい気すらする。

785:デフォルトの名無しさん
10/03/13 01:22:35
bool変数でも使って対処しとけ

786:デフォルトの名無しさん
10/03/13 01:24:23
std::pair<iterator, param>ってしてたけどSTLがクソ過ぎてstd::pair<std::pair<iterator, bool>, param>って書かなきゃいけなくなったわ・・・

787:デフォルトの名無しさん
10/03/13 01:25:48
こういうときは boost::optional だっけ?

788:デフォルトの名無しさん
10/03/13 01:26:47
つtuple

789:デフォルトの名無しさん
10/03/13 01:30:12
end()をNULL代わりにしたらあかんの?

790:デフォルトの名無しさん
10/03/13 01:32:49
今回もそうでしたが、コンテナを特定できないとそれは使えません。

791:デフォルトの名無しさん
10/03/13 01:55:44
じゃあNULL用の適当なコンテナ作ればいいじゃん

792:デフォルトの名無しさん
10/03/13 01:58:30
std::pair<iterator, param>ってしてたけどSTLがクソ過ぎてstd::pair<std::pair<iterator, dummy_container>, param>って書かなきゃいけなくなったわ・・・

793:デフォルトの名無しさん
10/03/13 01:59:08
nil使えよ

794:デフォルトの名無しさん
10/03/13 02:06:15
iteratorがコンテナと関連付けられてるかチェックしたいってことなのかな?
わざわざややこしいことやってるように見えるけど


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5401日前に更新/218 KB
担当:undef