C++相談室 part78
..
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がコンテナと関連付けられてるかチェックしたいってことなのかな?
わざわざややこしいことやってるように見えるけど
795:デフォルトの名無しさん
10/03/13 02:43:02
namespace boost {
namespace detail { struct none_helper{}; }
typedef int detail::none_helper::*none_t ;
} // namespace boost
namespace boost {
none_t const none = ((none_t)0) ;
} // namespace boost
このコードはいったい何をしようとしてるわけ?
796:デフォルトの名無しさん
10/03/13 02:55:22
ググった?
797:デフォルトの名無しさん
10/03/13 04:11:26
>>795
他のどんな型からも自動変換されないし、
他のどんな型へも自動変換されないような変数を定義してるんじゃね?
798:デフォルトの名無しさん
10/03/13 06:23:39
>>468といい>>778といい、最近のPCは爆発しすぎだな
799:デフォルトの名無しさん
10/03/13 06:27:14
俺のPCは蒸着するぜ0.05秒で。
800:デフォルトの名無しさん
10/03/13 06:52:58
手荷物どころかそのうち航空貨物での取り扱いも断られる
801:デフォルトの名無しさん
10/03/13 07:31:03
そして単純所持禁止へ
802:デフォルトの名無しさん
10/03/13 07:33:53
コンピュータが爆発するって
昔の映画や漫画によくあったな
803:デフォルトの名無しさん
10/03/13 07:52:27
「映画の中のコンピュータ」って
ジョークがあったな
804:デフォルトの名無しさん
10/03/13 08:20:38
「なお、このPCは自動的に消滅する」
805:デフォルトの名無しさん
10/03/13 10:22:54
>>799
あれってさリュック背負ってたりするとセムシ形状に成ったりするん?
806:デフォルトの名無しさん
10/03/13 12:27:14
>>795
なんだこれ超ムズイじゃねぇか。
807:デフォルトの名無しさん
10/03/13 13:03:28
pointer to memberって使ったことあんましないからわからんけど
ほかのpointer to memberじゃないとキャストできない(void *にreinterしても変換できなかった)から他の型と比較できない
なおかつメンバが空だからnullしか入れるものがない
したがってただひとつの状態を持てるってことかな
C++ってこういう気持ち悪いバッドノウハウ多すぎるよね
すなおに仕様でnil型導入すればいいのに
808:デフォルトの名無しさん
10/03/13 13:26:04
一般的な実装上の都合からいうと、
メンバへのポインターは、単なるオフセットに過ぎない。
809:デフォルトの名無しさん
10/03/13 13:30:01
null_ptrをお待ちください
810:デフォルトの名無しさん
10/03/13 17:15:12
>>807
実装上の都合を言語ユーザに押し付けてる感はあるな
811:デフォルトの名無しさん
10/03/13 19:14:16
>>810
812:デフォルトの名無しさん
10/03/13 19:16:22
ごめん、途中で送信してしまった。
>>810
他の言語はともかく、
余計なオーバーヘッドを嫌うC++なら、こういう制限も許される(むしろ歓迎される?)よね。
813:デフォルトの名無しさん
10/03/13 19:38:24
>>810
型変換については妥当な話だと思うし、 nil の不在は実装上の都合ではないだろうし、
何のことを言ってるの?
814:デフォルトの名無しさん
10/03/13 21:11:09
void Test(int *array) {
// ごにょごにょ(配列の長さについては考えないとする)
}
みたいな関数があったとき、
int array[3] = {0,0,0};
Test(array);
はコンパイルできるのに、
Test({0,0,0});
はコンパイルできない。
配列に付ける名前が不足しちゃうのでなんとか名前を付けずにやりたいんだけど、
良い手段ない?
それともなんでもいいからとりあえず名前を付けざるを得ないんだろうか。
815:デフォルトの名無しさん
10/03/13 21:18:13
名前付けないと可読性下がりそう
816:デフォルトの名無しさん
10/03/13 21:21:19
>>814
C++0x をお待ちください。
名前が不足するとかいうのがよくわからんが、マクロでスコープきったり、必要なら
__LINE__ あたりとくっつけとけばよかったりしない?
C++0x 全部じゃなくても、 gcc みたいに C99 の機能が取り込まれてるコンパイラなら
↓こんなのが使えたり。
void Test(int *array);
#define TEST(...) do { int array[] = __VA_ARGS__; Test(array); } while(0)
void Tests()
{
TEST({1,2,3});
TEST({4,5,6});
TEST({7,8,9});
}
817:デフォルトの名無しさん
10/03/13 21:26:22
可変長引数マクロ関数使えるのか
818:デフォルトの名無しさん
10/03/13 21:26:36
>>814
ヘルパー関数を使って、
std::vector<int> make_vector(int num, ...);
Test(&make_vector(3,0,0,0)[0]);
とか、
Test((int*)"\x00\x00\x00\x00""\x00\x00\x00\x00""\x00\x00\x00\x00""\x00\x00\x00\x00");
などの悪手しか思いつかない。
819:デフォルトの名無しさん
10/03/13 21:26:59
配列リテラルとかLL出身者っぽい要望だなぁ
820:デフォルトの名無しさん
10/03/13 21:31:05
>>816
レスありがとうございます。
> 名前が不足するというのがよくわからん
Testを沢山呼ぶんですよ。
それで、
int array1[3] = {0,0,0};
Test(array1);
int array2[3] = {0,0,1};
Test(array1);
int array3[3] = {0,0,2};
Test(array1);
以下大量に。
(実際は配列の中身はもっとぐしゃぐしゃで、規則性はないデータになる)
__LINE__をつけるというのはいいですね。
>>818
レスありがとうございます。
STL不勉強のためすみませんが今はちょっとよくわかりません。
>>819
はい・・・LL出身です・・・。
とりあえず__LINE__くっつける方法で行きたいと思います。ありがとうございました。
821:デフォルトの名無しさん
10/03/13 21:31:50
>>820
なんかTestの引数が全部array1になっちゃってますが、
2回目はarray2、3回目はarray3です・・・。
822:デフォルトの名無しさん
10/03/13 21:36:44
C99にはズバリの機能(複合リテラル)があるのだが、C++0xに入るとは聞いていない。
Test((int[]){0,0,0});
823:デフォルトの名無しさん
10/03/13 21:37:24
二次元配列にすればいいだけなんじゃない
int arys[100][3];
for(int i=0;i<100;++i){
arys[i][0]=0;
arys[i][1]=0;
arys[i][2]=i;
test(arys[i]);
}
824:デフォルトの名無しさん
10/03/13 21:40:22
>>822
std::initializer_listが入る
825:814
10/03/13 21:41:00
>>823
>>820でちょこっと書きましたが、実際には配列のデータはもっとぐしゃぐしゃで、
必ずしも
arys[i][0]=0;
arys[i][1]=0;
arys[i][2]=i;
となるわけではないのです。
質問のために簡略化しているので・・・すみません。
826:デフォルトの名無しさん
10/03/13 21:44:44
それなら読み込めばいいんでは?
int arys[100][3];
for(int i=0;i<100;++i){
cin >> arys[i][0] >> arys[i][1] >> arys[i][2];
test(arys[i]);
}
これは標準入力だけど、別にファイルからでもいいし
827:814
10/03/13 21:50:09
>>826
そうした方がいいでしょうかね・・・大量のデータをソースコードにべた書きするのは
よくないかなぁと思ったんですが、
データをあまり見られたくないんですよ。
それで、別ファイルにするよりはソースコードに埋め込んだほうがどちらかというと
見られにくいかなぁと思ったので。
別にソースに埋め込んでも見ようとすれば見れるのでなんてことはないんですが。
828:デフォルトの名無しさん
10/03/13 21:54:44
慣れたLLでコードジェネレートしればいいじゃない
829:814
10/03/13 21:57:51
>>828
なるほど、考えてみます。ありがとうございます。
830:デフォルトの名無しさん
10/03/13 21:58:14
>>827
__VA_ARGS__ は使えんのか? >>816 にあるやつ。
831:814
10/03/13 22:02:11
>>830
Visual C++ 2008なので使えると思います。
考えてみます。
832:デフォルトの名無しさん
10/03/13 22:04:48
>>820
int *arrays[] = {
{ 0,0,0 },
{ 0,0,1 },
{ 0,0,2 }
};
みたいなのじゃダメなの?
argv と同じやりかた。
833:デフォルトの名無しさん
10/03/13 22:07:18
>>832 コンパイルしてみてから言おうな。
834:デフォルトの名無しさん
10/03/13 22:14:19
めんどくせw
835:デフォルトの名無しさん
10/03/13 22:19:38
>>816
__LINE__とくっつけたとして、どうやって参照するの?同じ行が前提?
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5401日前に更新/218 KB
担当:undef