User Tools

Site Tools


programming:cpp:class

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

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 に使う際には
 +'operator==' と hash 関数のオーバーロードが,\\
 +ordered なコンテナの key に使う際には'operator<' のオーバーロードが必要
  
 +例えば int と double をもつクラスをキーとして使う場合は,
 +<code cpp MyClass.hpp>
 +#ifndef MYCLASS_HPP
 +#define MYCLASS_HPP
 +
 +#include <cstddef>
 +
 +#include <boost/functional/hash.hpp>
 +
 +class MyClass {
 +public : 
 +  int var1;
 +  double var2;
 +  
 +  bool operator==(const MyClass &rhs) const;
 +  bool operator<(const MyClass &rhs) const;
 +  
 +  friend std::size_t hash_value(const MyClass &obj) {
 +    std::size_t h = 0;
 +    boost::hash_combine(h, obj.var1);
 +    boost::hash_combine(h, obj.var2);
 +    return h;
 +  }
 +  
 +};
 +
 +#endif
 +</code>
 +
 +<code cpp MyClass.cpp>
 +#include "MyClass.hpp"
 +
 +bool MyClass::operator==(const MYClass &rhs) const {
 +  return var1 == rhs.var1 && var2 == rhs.var2;
 +}
 +
 +bool MyClass::operator<(const MyClass &rhs) const {
 +  if ( var1 != rhs.var1 )
 +    return var1 < rhs.var1;
 +  return var2 < rhs.var2
 +}
 +</code>
 +
 +また,デバッグなどでクラスの中身を見たい場合に出力ストリームをオーバーロードしておくと便利.\\
 +<del>自分は使わなかったが,入力ストリームをオーバーロードすれば,テキストファイルから一括で入力することも可能になる気がする.</del>\\
 +実際に使ってみたらできた.\\
 +入出力ストリームの例は以下の通り.
 +
 +<code cpp MyClass.hpp>
 +#ifndef MYCLASS_HPP
 +#define MYCLASS_HPP
 +
 +#include <iostream>
 +
 +class MyClass {
 +public : 
 +  int var1;
 +  double var2;
 +  
 +  friend std::ostream &operator<<(std::ostream &os, const MyClass &obj);
 +  friend std::istream &operator>>(std::istream &is, MyClass &obj);
 +  
 +};
 +
 +</code>
 +
 +<code cpp MyClass.cpp>
 +#include "MyClass.hpp"
 +
 +#include <iostream>
 +
 +std::ostream &operator<<(std::ostream &os, const MyClass &obj) {
 +  os << "Integer value : " << obj.var1 << "\n"
 +     << "Double value : " << obj.var2 << "\n";
 +     
 +  return os;
 +}
 +
 +std::istream &operator>>(std::istream &is, MyClass &obj) {
 +  is >> obj.var1 >> obj.var2;
 +  return is;
 +}
 +
 +</code>
 +
 +''operator=='' を定義したら,どうせ == と != はちょうど逆の出力をする以外ないはずなので\\
 +自動的に ''operator!='' も定義してほしい.\\
 +テンプレートを使うと上手くいくらしく,グローバルなヘッダーに以下を書いておく.
 +<code cpp>
 +
 +template<class T, class F = decltype(!(std::declval<T>()==std::declval<T>()))>
 +F operator!=(T a, T b) {
 +  return !(a==b);
 +}
 +
 +</code>
  
-operator オーバーロド 
programming/cpp/class.1649421247.txt.gz · Last modified: 2022/04/08 12:34 by odagawa