This shows you the differences between two versions of the page.
| Next revision | Previous revision | ||
|
programming:cpp:class [2022/04/08 12:34] odagawa created |
programming:cpp:class [2022/05/25 08:01] (current) odagawa |
||
|---|---|---|---|
| Line 4: | Line 4: | ||
| unordered_map などの key に使う際には | unordered_map などの key に使う際には | ||
| + | ' | ||
| + | ordered なコンテナの key に使う際には' | ||
| + | 例えば int と double をもつクラスをキーとして使う場合は, | ||
| + | <code cpp MyClass.hpp> | ||
| + | #ifndef MYCLASS_HPP | ||
| + | #define MYCLASS_HPP | ||
| + | |||
| + | #include < | ||
| + | |||
| + | #include < | ||
| + | |||
| + | class MyClass { | ||
| + | public : | ||
| + | int var1; | ||
| + | double var2; | ||
| + | | ||
| + | bool operator==(const MyClass &rhs) const; | ||
| + | bool operator< | ||
| + | | ||
| + | friend std::size_t hash_value(const MyClass &obj) { | ||
| + | std::size_t h = 0; | ||
| + | boost:: | ||
| + | boost:: | ||
| + | return h; | ||
| + | } | ||
| + | | ||
| + | }; | ||
| + | |||
| + | #endif | ||
| + | </ | ||
| + | |||
| + | <code cpp MyClass.cpp> | ||
| + | #include " | ||
| + | |||
| + | bool MyClass:: | ||
| + | return var1 == rhs.var1 && var2 == rhs.var2; | ||
| + | } | ||
| + | |||
| + | bool MyClass:: | ||
| + | if ( var1 != rhs.var1 ) | ||
| + | return var1 < rhs.var1; | ||
| + | return var2 < rhs.var2 | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | また,デバッグなどでクラスの中身を見たい場合に出力ストリームをオーバーロードしておくと便利.\\ | ||
| + | < | ||
| + | 実際に使ってみたらできた.\\ | ||
| + | 入出力ストリームの例は以下の通り. | ||
| + | |||
| + | <code cpp MyClass.hpp> | ||
| + | #ifndef MYCLASS_HPP | ||
| + | #define MYCLASS_HPP | ||
| + | |||
| + | #include < | ||
| + | |||
| + | class MyClass { | ||
| + | public : | ||
| + | int var1; | ||
| + | double var2; | ||
| + | | ||
| + | friend std:: | ||
| + | friend std:: | ||
| + | | ||
| + | }; | ||
| + | |||
| + | </ | ||
| + | |||
| + | <code cpp MyClass.cpp> | ||
| + | #include " | ||
| + | |||
| + | #include < | ||
| + | |||
| + | std:: | ||
| + | os << " | ||
| + | << | ||
| + | |||
| + | return os; | ||
| + | } | ||
| + | |||
| + | std:: | ||
| + | is >> obj.var1 >> obj.var2; | ||
| + | return is; | ||
| + | } | ||
| + | |||
| + | </ | ||
| + | |||
| + | '' | ||
| + | 自動的に '' | ||
| + | テンプレートを使うと上手くいくらしく,グローバルなヘッダーに以下を書いておく. | ||
| + | <code cpp> | ||
| + | |||
| + | template< | ||
| + | F operator!=(T a, T b) { | ||
| + | return !(a==b); | ||
| + | } | ||
| + | |||
| + | </ | ||
| - | operator オーバーロド | ||