5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

【標準C++】C++相談室 part39【STL含む】

1 :v(^・^)v:05/01/23 16:45:03
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
boost,loki,テンプレートメタプログラミング等に関する質問は
専用の別スレにお願いッス。

前スレ part38
http://pc5.2ch.net/test/read.cgi/tech/1096304546/

過去スレ、関連スレ、関連リンクなどは >>2-20 あたり

186 :デフォルトの名無しさん:05/01/28 19:52:21
煮詰まってきたので質問させてください。

配列クラスarrayを、次のように定義します: ※エラー処理等の詳細は省略
template <class T>
class array {
T *data_;
int w_, h_;
public:
array(int w, int h) { w_ = w; h_ = h; data_ = new T[w_*h_]; };
virtual ~array() { delete[] data_; };
T get(int x, int y) { x = min(w_, max(0, x)); y = min(h_, max(0, y)); return data_[x+y*w_]; };
void set(int x, int y, const T& t) { x = min(w_, max(0, x)); y = min(h_, max(0, y)); data_[x+y*w_] = t; };
};
このクラスは2次元配列を1次元配列として実装してあります。
array<int> ia(10, 5);
ia.set(5, 3, 10);
cout << ia.get(5, 3) << endl;
というようにして、値の設定と取得ができます。
これをより簡易な表記ができるよう、[]演算子をオーバーロードしようと思いました。
添字が一つの場合は
T& operator[](int p) { return data_[min(w_*h_, max(0, p))]; };
のように書けるのですが、[]演算子への引数が二つ(xとy)あるケースでどう書けばいいかがわかりません。
ia[5][3] または ia[5, 3]
のような表記ができるようなコードは、どう書けばいいのでしょうか?

187 :デフォルトの名無しさん:05/01/28 19:57:33
>>186
つMore Effective C++
ただ禿はこういうときは[]なんか使わずに()を使え

188 :187:05/01/28 19:58:39
って言ってる

189 :デフォルトの名無しさん:05/01/28 20:00:59
>>187
んなもん誰が信じるかってーのwwww

190 :デフォルトの名無しさん:05/01/28 20:46:00
>>186
こんな感じかなぁ
添字の指定順序を逆にするともう少しシンプルになる
template <class T>
class array {
T *data_;
int w_, h_;
public:
array(int w, int h) { w_ = w; h_ = h; data_ = new T[w_*h_]; };
virtual ~array() { delete[] data_; };
T get(int x, int y) {x = min(w_, max(0, x)); y = min(h_, max(0, y)); return data_[x+y*w_];};
void set(int x, int y, const T& t) {x = min(w_, max(0, x)); y = min(h_, max(0, y)); data_[x+y*w_] = t;};
struct Proxy {
T *data_;
int w_ , h_, x_;
Proxy (T *data, int w, int h, int x): data_ (data), w_ (w), h_ (h), x_ (x) {}
T &operator[] (int y) {y = min(h_, max(0, y)); return data_[x_+y*w_];}
};
Proxy operator[] (int x) {x = min(w_, max(0, x)); return Proxy (data_, w_, h_, x);}
};


191 :デフォルトの名無しさん:05/01/28 21:32:00
>>186

template<typename T2>
class temporary {
  T2* plineData_;
  int index_x_, w_, h_;
public:
  temporary(T2* x, int index_x, int w, int h) : plineData_(x), index_x_(index_x), w_(w), h_(h) {}
  T2 operator[](int y) { return plineData_[index_x_ + y * w_]; }
};

template <class T>
class array {
  : 
  :
  // 追加分
  temporary<T> operator[](int i) {
    temporary<T> tmp(data_, i, w_, h_);
    return tmp;
  }
};

array::operator[]()でいったん別クラスのオブジェクト生成して、さらにそれのoperator[]()を呼んでいる
arrayのw_, h_の役割を交換するともっとシンプルになりそうな気がするが・・・

240 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)