読者です 読者をやめる 読者になる 読者になる

gl5_progのメモ

自分のためのメモとかまとめとか

C++

(ideoneメモ)基底クラスと同じ名前のメンバ変数は定義可能

できないと思ってた。 http://ideone.com/mvfwSh #include <stdio.h> class Base { public: Base() : m(1){} int m; }; class Derived : public Base { public: Derived() : m(2){} int m; }; int main( void ) { Derived d; printf( "%d\n", d.m ); printf( "%d\n", </stdio.h>…

テンプレート引数を無視したフレンドクラス宣言

C++

template<class> friend class A; こう書くことでテンプレート引数の型に関係なくクラスAに対してフレンド宣言ができるそうです。 参考: http://d.hatena.ne.jp/Cryolite/20040602 おまけコード例 http://ideone.com/PSNuxi #include <stdio.h> class Madoka; class Homura; </stdio.h></class>…

C++でトレイトみたいなもの

http://ideone.com/6O3GTF #include <stdio.h> #define TRAIT_DEF( trait_name ) \ class Trait_##trait_name \ { \ public: \ virtual void trait_name( void ) = 0; \ } #define TRAIT_USE( trait_name, class_name ) \ Trait_##trait_name##_##class_name m_Trait_</stdio.h>…

テンプレートコンストラクタの落とし穴

C++

http://ideone.com/qyfPdT #include <stdio.h> template<class T> class Wrap { public: Wrap(){printf("Wrap()\n");} ~Wrap(){printf("~Wrap()\n");} template<class U> Wrap(const Wrap<U>&){ printf("Wrap(Wrap<U>)\n"); } }; int main( void ) { Wrap<int> wrapInt; printf( "--------------\n"</int></u></u></class></class></stdio.h>…

constの抜け道

C++

http://ideone.com/bXfoUv #include <stdio.h> class A { A* p; int m_Value; public: A():p(this),m_Value(0){} int GetValue( void ) const { return m_Value; } // const member function void SetValue( int value ) const { p->m_Value = value; } }; int main( </stdio.h>…

C++で簡易タプルを実装してみる

http://ideone.com/FWKkVv #include <stdio.h> #define tempClassDef( num ) template<class T##num> struct tempClass##num { T##num m##num; }; \ template<> struct tempClass##num<void> { } tempClassDef( 0 ); tempClassDef( 1 ); tempClassDef( 2 ); template<class T0, class T1=void, class T2=void> struct MyTup…</class></void></class></stdio.h>

C++で前方宣言したクラスの内部クラスへのポインタを引数にとる関数を作成するアイデア

はじめに C++では前方宣言したクラスの内部クラスをさらに前方宣言することはできません。 class A; class A::Inner; // error class B { public: void Func( A::Inner* p ); // error }; なので、内部クラスへのポインタを引数にとる関数を宣言するには、外…

C++で自由な順番でメンバの初期化(相当)を行うアイデア

はじめに C++で正しくメンバ変数の初期化を行おうとすると、コンストラクタでメンバイニシャライザを使って行わなければなりません。このメンバイニシャライザは、「メンバ変数の宣言順に記述する必要がある」「コンストラクタの最初に記述する必要がある」…

C++03ではテンプレート引数としてローカル型を渡すことができない

C++

http://ideone.com/ULCO6F #include <stdio.h> #define INNER_STRUCT class A { public: template<class T> void Func( T& ){} }; #ifndef INNER_STRUCT struct Visitor {}; #endif int main( void ) { A a; #ifdef INNER_STRUCT struct Visitor {}; #endif Visitor v; a.Func<Visitor>(</visitor></class></stdio.h>…

C++でオーバーライド時に戻り値の違いは許されるのかどうか。あるいは共変の戻り値について。

C++

C++は共変の戻り値である場合、戻り値が違っていてもオーバーライドが許されるらしい。 共変の戻り値とは、オーバーライド時に基底クラスで置き換えができる戻り値のことらしい。 ちなみにC#は、この共変の戻り値でもオーバーライドは許されてないらしい。 …

(ideoneメモ)配列の参照

http://ideone.com/RJd1WV #include <stdio.h> #define COUNT 5 typedef int(&DEF_ARRAY)[COUNT]; class A { public: int m_Array[COUNT]; /* error int(&)[COUNT] GetArray( void ) { return m_Array; } */ A() { for( int i=0; i</stdio.h>

外からメンバ変数を定義する方法

C++

問題 とあるクラス/構造体にメンバ変数を定義したいとします。しかし、様々な事情によりクラス定義内の書き換えができない場合どうしたらよいでしょうか。状況的には以下のようになります。 http://ideone.com/jHqwio prog.cpp #ifndef HEADER_H #define HEA…

(ideoneメモ)プリミティブ型みたいな挙動をさせる

http://ideone.com/IL1t5i float + double の演算結果はdoubleになる。 こういうのをユーザー定義クラスでどうやればいいのか試してみた。 格下であるFloatにのみDouble operator+(Double)を持たせることで、 Float + Double の結果をDoubleにした。 Double …

(ideoneメモ)2項演算の左オペランドに暗黙の型変換が発生しないことの確認

Ideone.com | Online C++ Compiler & Debugging Tool #include <stdio.h> class Double { public: Double operator +( Double other ){ printf( "Double::operator+(Double)\n" ); return *this; } }; class Float { public: operator Double(){ printf( "Float to Do</stdio.h>…

(ideoneメモ)関数内クラスのスコープ

http://ideone.com/B3XdFk #include <stdio.h> int main( void ) { class A{}; if ( true ) { class B{}; } { class C{}; } A a; /* error B b; C c; */ return 0; } 関数内クラスについて さらに深いスコープ(if文内など)でも宣言できる そのスコープ外からは見えな</stdio.h>…

(ideoneメモ)if文などのスコープについて

http://ideone.com/GJO3u6 #include <stdio.h> int main( void ) { if ( int a = 1 ) { /* error int a = 2; */ printf( "a = %d\n", a ); } /* error printf( "a = %d\n", a ); */ for ( int i=0; i<1; ++i ) { /* error int i = 10; */ printf( "i = %d\n", i ); } </stdio.h>…

(ideoneメモ)内部クラスから見える型名の範囲

http://ideone.com/TmzG0l #include <stdio.h> class A { public: class A1; class A2; class A1 { public: A2* pA2; class A11 { public: A2* pA2; }; }; class A2 { public: }; }; int main( void ) { return 0; } 内部クラスから見えるのは直近の外部クラスだけで</stdio.h>…

クラス外での定義方法まとめ

C++

内部クラス 宣言 class A { public: class AA; }; 定義 class A::AA { public: }; テンプレートクラスのメンバ関数 宣言 template< typename T > class A { public: void Func( void ); }; 定義 template< typename T > void A<T>::Func( void ){} テンプレート</t>…

std::list内の要素を移動させる方法

C++

こことか ここ見てもうまい方法が分からなかったので、とりあえず自分がやった方法をメモ。 移動させる要素を指すイテレータをa 移動先を指すイテレータをb として、こんなふうにします。 list.insert( b, *a ); list.erase( a ); つまり、普通に新規要素と…

メンバ関数ポインタのアップキャスト

C++

クラスAのメンバ関数ポインタを受け取るところにクラスAを継承したクラスBのメンバ関数ポインタを渡したい場合、つまり、メンバ関数ポインタをアップキャストしたい場合はstatic_castを使えばいいらしいです。 http://ideone.com/dm8iQ9 #include <stdio.h> class A {</stdio.h>…

内部クラスをクラス定義外で定義する

C++

C++で内部クラスの定義はその場( クラス定義内 )に書かなければいけないものと思ってましたがクラス定義の外でも書けるんですね。 class A { public: class AA; }; class A::AA { public: }; http://ideone.com/Qi0kaE

strlenなどにNULLポインタを渡した場合の挙動

C++

処理系によって挙動は違うかもしれませんが、ideone上では以下のようになりました。 strlenにNULLポインタを渡すと落ちます。 strcmpは引数の片方がNULLポインタだと落ちます。ただし、両方ともNULLポインタだと落ちません。 if(0) // 落ちる { int ret = st…

->templateという書き方

C++

p->IsActiveState<AAA>(); みたいなコードを書いたところ、 エラー: use 'template' keyword to treat 'IsActiveState' as a dependent template name こんなエラーが出てしまいました。 なんかtemplateキーワードを使えと言われてる気がしたので、 p->template I</aaa>…