[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 05/09 20:36 / Filesize : 218 KB / Number-of Response : 953
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C++相談室 part78



1 名前:v(^・^)v mailto:sage [2010/02/13(土) 23:18:03 ]
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

前スレ
C++相談室 part77
pc12.2ch.net/test/read.cgi/tech/1263556932/

577 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 20:20:28 ]
最後の一つ前までやればいいだけにみえる

578 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 20:34:14 ]
>>577
--vec.end()
なんて怖すぎます!
・・・ブルブル。

579 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 20:37:18 ]
ランダムアクセスイテレータならcontainer.end() - 1でいいだろ

580 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 20:37:49 ]
怖くねーよカス

581 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 20:42:41 ]
あれ、空のときに困ると思ったんだけど、
やってみたら大丈夫だった・・・?!

582 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 20:44:05 ]
あ、わかった。
要素が一個だけのとき、何も出力されなくなる。

583 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 20:46:19 ]
>たいてい欲しいものだと思います

いや別に。
上手いやり方か知らんが、自分で適当に
↓みたいな反復子を作るのは駄目なのか?
codepad.org/o3QbtQyC

584 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 20:47:03 ]
いや、そもそもぜんぜんダメだ。
v=[3,4]
のとき、出力が
3#
ですよ。。。

585 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 20:51:56 ]
>>583
やっぱそっちですか。
イテレータとかすぐに書けないけど・・・。
ありがとうございます。



586 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 21:46:35 ]
>>585
楽してイテレーター書くならこんなのどうかな。
www.kmonos.net/alang/boost/classes/iterators.html


587 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 21:59:38 ]
boostはホント何でもありますね・・・。
なるべく依存したくないけど。

>>583
理解できたので、ほとんどそのまま使いまわせそうです。
たいへん助かりました。

588 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 22:04:19 ]
>>587
boostでテクニック勉強したら、自分でサブセットなライブラリを作れば依存しなくてすむんじゃないかな。


589 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 00:54:10 ]
>>575 何のこと?

590 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 07:16:34 ]
Hoge Hoge::getObj( ){
 return *this;
}

Hoge& Hoge::getObj( ){
 return *this;
}

return *this はそのままで戻り値の書き方次第(Hoge& or Hoge)で
参照返しとオブジェクトのコピー返しと変わってしまうというのに違和感を感じる。
上の2通りの違いを *this の部分でも書き示す方(例:参照返し→ @*this )が良かったのに、と思ってしまうのですが
どうですか?
(どうですか?、って言っても仕様だからどうかなる話ではないのですが)


591 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 07:42:38 ]
それが気になる人は、それ以上に、関数を呼び出すほうも気になるだろうね。
int func1(const Hoge& h);
int func2(Hoge h);
Hoge hoge;
func1(hoge);
func2(hoge); // 同じ書き方

関数定義を書いている時は、すぐそこに戻り値の扱いが見えてる安心感があってまだいいけど、
関数呼び出しを書いている時は、関数の宣言or定義がよその何処かに書かれてる。
エディタ支援があるとはいえ、「遠くの何かを知ってなきゃいけない」感じがあって、より落ち着かないのでは。

592 名前:デフォルトの名無しさん mailto:sage [2010/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 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 10:22:01 ]
関数宣言見ただけじゃ参照かどうかわからなくて困るだろ
と思ったけど
int &a = @b;
みたいにしてほしいってことなのかな

594 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 11:19:24 ]
constにするときはstatic_castでいいんじゃないか

595 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 11:30:14 ]
そんなことよりint @sp = spnew int [10]; int $wp = wpnew sp;を組み込んでくれ



596 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 11:31:26 ]
シンタックスシュガーは
もっと多くてもいい

597 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 11:42:32 ]
オレサマプリプロセッサ作って好きに構文創作しれ

598 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 13:55:16 ]
>>597
#define amigo friend;

愛用してます

599 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 15:28:31 ]
フレンド程度に内面を洗いざらいさらしていいのか?

600 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 15:34:29 ]
>>597
#define foreach BOOST_FOREACH


601 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 15:37:34 ]
>>599
friendのおかげで、余計なpublicを作らずprivateで済ませられるんじゃないのか。


602 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 15:40:05 ]
#define buddy friend;
じゃないの?

603 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 15:42:12 ]
friendはクラステンプレート中にテンプレート関数を定義したい
時に、暗黙の型変換ができるように使っている。

Effective C++で紹介されていた内容。


604 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 15:56:22 ]
>>598
ほらみろよく判って無い奴が調子に乗って暴れ出したじゃないか

605 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 15:59:18 ]
そこは指摘せずにそっとしておく所だろ



606 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 16:54:52 ]
abort() if (!p);

みたいに書けるようにはならんのか。


607 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 17:25:45 ]
if (!p) abort() ; 

608 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 17:35:50 ]
>>606
C++などのほかの言語なんかに手を出さず、一生perlを使い続けるべきだと思います。

609 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 17:42:02 ]
perlではif文を後に書くのか?

610 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 17:56:39 ]
>>596
言語の文法は最小限でライブラリで拡張できるほうがいい。

611 名前:598 mailto:sage [2010/03/06(土) 18:17:05 ]
すいません嘘です

612 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 19:54:49 ]
abort() if(!p) else exit();
とか普通に書きたいんじゃないの?

613 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 19:55:27 ]
>609
文修飾子という扱いで後ろにも置ける。

if(e) { func(); }
func() if e;

は OK だけど、

if(e) func();
{ func() } if e;

はできない。

614 名前:デフォルトの名無しさん [2010/03/06(土) 20:00:36 ]
>>613
2種類の書き方があるっていうか、そういうのって分りにくくないのかな?
後に書くということは
func(すっげー長い式なんたらかんたらどうのこうの) if e;
だと読むときifを読み落としそうだなあ。


615 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 20:01:35 ]
ワケ分からんw

C++だと、func() ;も{ func() ; }も、ひとつのstatementなので、ものすごい違和感があるな。
{ func() ; } if e ;
ができないというのは、ものすごく違和感があるな。



616 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 20:06:35 ]
struct A;
struct B{ B( A& ); }
A a(); // これとか
B b( A() ); //これが
関数宣言にみなされない書き方ないの?
A a;
B b( a );
とかじゃない方法で。

617 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 20:09:39 ]
>>615
思うに。
{
すげーー長い文
なんたらかんたら
だらだらだらだら
}
if e;
って読むのに困るよね。
do{}while()でも読みにくいのね。

618 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 20:22:06 ]
do... whileは、まだ、先頭にdoがあるから、「あ、これはdo... while文の始まりだな」と分かるわけで、
それほど読みにくいってほどでもないんじゃないかな。

619 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 20:23:29 ]
>>616 ないよ。

620 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 20:31:05 ]
func() if e; はシンタックスシュガーの一例か?

混乱の割にメリットは感じられない。


621 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 20:51:51 ]
ループの先頭などで、
break if foo
continue if bar
とかするのは気持ちいい。

622 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 21:14:57 ]
だから、perl以外の言語は触らずに
perlだけ使ってなよ。

623 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 21:25:16 ]
        ハ,,ハ
       (*゚ω゚ )  >>622お断りします。Rubyも使います。
.       (=====)
      _(_⌒) )
    /\  `J  ̄ ̄\
     ̄ ̄ ̄ ̄| | ̄ ̄ ̄
            |
          / \
             ̄ ̄

624 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 22:07:59 ]
perlで俺シンタックスシュガープリプロセッサ作ればいいんじゃね?


625 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 22:18:21 ]
foreach(int x, std::make_pair(v.begin(), it))
みたいにカンマが含まれても大丈夫なマクロが欲しいです



626 名前:デフォルトの名無しさん mailto:sage [2010/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 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 22:57:49 ]
>616
ttp://www.parashift.com/c++-faq-lite/ctors.html#faq-10.19

628 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 23:36:34 ]
あの、ひとついいですか?
僕は現在高校2年生です。そんなぼくにもC++はマスター
できます?

629 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 23:40:22 ]
それなりのことはできるようになりますがマスターはそう簡単にはできません

630 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 23:46:51 ]
>>628
それはお前次第やろ

631 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 23:55:49 ]
>>625
C99の__VA_ARGS__が、C++0xに入る。

632 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 01:23:57 ]
double* darray = new double[0];
delete [] darray;

のようなことがプログラム中で起こるのですが、問題ありますか?

633 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 01:25:45 ]
>>632 いいえ。何が心配?

634 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 01:35:02 ]
サイズ0だと続けて次に確保したときに、おんなじ場所を確保しちゃうような気がする
ダミーで1byteぐらい確保されんのかな

635 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 01:37:05 ]
>>634
ヌルを返したり他のオブジェクトと同じアドレスを返したりしちゃいけないことになってるから、
だいたいの実装がそんな感じ。



636 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 02:15:18 ]
0バイトのオブジェクトは存在できないから標準に従えば1バイト以上確保することになる
だがdarray[0]にアクセスすると未定義動作
変なの

637 名前:デフォルトの名無しさん mailto:sage [2010/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 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 02:35:06 ]
error: no matching function for call to 'std::bad_alloc::bad_alloc(const char [10])'

639 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 07:00:01 ]
"C++"で、依存関係を解決するためにインターフェイス指向な設計に取り入れるってこと多いかなぁ?
テンプレートではなく、仮想関数を使う方法で。

640 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 07:00:33 ]
s/設計に/設計を/

641 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 07:09:36 ]
>>639
あると思うよ。
今の時代だとクリティカルな部分さえ最適化できればいいから動的型付けに対してそんなに神経質になる必要も無い。
ソフトウェア工学から見たある程度の規模からの開発のし易さや動的な依存関係の解決には仮想関数が向いているし
テンプレートを用いた静的な型レベルの解決なら実行速度に対する最適化が向いている。
臨機応変に適材適所できるからC++が選ばれる、何てこともあるね。
強い動的型付けな言語(Rubyとか)になっちゃうと融通が利かないし。
でもRubyとかを採用する現場では速度低下の弊害より人材のコスト考えてる場合ばおおいね

642 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 08:52:23 ]
>>639
俺はよく使ってる。
継承を使う時は、純粋仮想関数のみで構成されたクラスの継承がほとんど。

テンプレートを依存関係を解決するために使うのは、本当にテンプレートが効果的かよく考えてやった方がいいと思う。

643 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 09:44:55 ]
>>634
コンストラクタで malloc() を呼ぶと
malloc(0) でも8バイトぐらいは確保される。

ここらへんは Cライブラリの実装次第だが、
あとで realloc()/free() に渡す可能性があるポインタということを
考えると0バイトであってもユニークなポインタが返されるべき。


644 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 10:48:18 ]
templateを使った依存関係の解決ってどういうの?

645 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 12:20:35 ]
>>644
class Hoge {
void foo() { fuga_.(this); }
Fuga<Hoge> fuga_;
}
俺はこんなのを想像した。これは相互参照か?

単に特定のクラスに依存したら拡張性がなくなるから、テンプレート引数で指定できるようにしたいという事かもしれない。



646 名前:645 mailto:sage [2010/03/07(日) 12:22:14 ]
2行目訂正
void foo() { fuga_.bar(this); }

647 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 12:30:42 ]
こういうのを相互参照って言うんじゃないか
class b;

class a
{
b* bb;
};

class b
{
a* aa;
};


648 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 12:59:32 ]
多態性を持ちつつどこかに保存しなければならない場合にはインターフェース(か、型消去)を使うかな
でも保存する必要が無い関数の引数とかだったらテンプレートの方がいいと思う
例えば標準のアルゴリズムをテンプレートじゃなくてインターフェースで解決しようとしたら結構めんどくさいだろう
std::random_access_iterator_interfaceみたいなのが沢山作られて、それを適切に継承してないイテレータは対応アルゴリズムが使えない
みたいな感じで、行儀はいいんだけど、すごいめんどくさくなる

649 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 16:00:23 ]
理想的には継承と多相は独立した概念なんでしょうね。
要求される振る舞いが出来ることを保証する仕組みの一つが
継承であるだけで。

650 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 16:10:37 ]
いわゆるダックタイピング

651 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 16:40:10 ]
>>649
多相を実現する手段の一つが継承


652 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 18:35:47 ]
ダックタイピングはコンセプトがあればなぁ

653 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 18:50:34 ]
せめてコンパイラのエラーメッセージがわかりやすくなれば

654 名前:デフォルトの名無しさん mailto:sage [2010/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 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 00:10:08 ]
>>654 std::move するんだよ。



656 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 03:22:13 ]
>>654
C++0xなら、rvalue referenceが使える。

それ以前のC++では、一応、auto_ptrを実装できるぐらいの方法はあるが、
そのテクニックを学ぶことは、精神衛生上よろしくないので、おすすめしない。

657 名前:デフォルトの名無しさん [2010/03/08(月) 04:21:56 ]
>>654
コピー代入を封じるなら無理。
キャストは、元オブジェクトからキャスト先オブジェクトという作るという点では、複製に等しいため。

それこそ>>655の言うように所有権の移動を許可する方向でやるしかない。
(もちろん所有権が移る以上、本来のキャストとは若干異なるセマンティクスになる)

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

659 名前:デフォルトの名無しさん mailto:sage [2010/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 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 11:12:58 ]
template<class vtype>
class Test
{
 public:
  Test( ){ }
  void func( );
};

のようなクラスのとき、
vtype が P と Test<P> (Pはプリミティブ型) とで呼び出す func( ) を変える方法はありますか?

661 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 11:33:00 ]
特殊化すればいいよ

662 名前:660 mailto:sage [2010/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 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 12:22:01 ]
>>662
codepad.org/isjE5LKn

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



665 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 12:40:57 ]
>>664
codepad.org/QzjNzjhA



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


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

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

669 名前:デフォルトの名無しさん mailto:sage [2010/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 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 17:44:32 ]
サンクス。クラス使わないとダメなんすか?

671 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 18:03:45 ]
pod作る関数を作ればいい。テンプレートで

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

673 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 18:14:12 ]
>>672 それは代入じゃない。

674 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 18:17:26 ]
あーざっす

675 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 18:17:34 ]
初期化だ(キリッ



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

677 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 20:22:05 ]
const const_iterator* it;
const_cast(it)

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






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<218KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef