1
A
答えて
1
#include <memory>
using namespace std;
template<class Real, int Size> class TVector {
protected:
Real *_values;
public:
TVector() {
// allocate buffer
_values = new Real[Size];
}
TVector(Real *prValues) {
// check first
if (prValues == 0)
throw std::exception("prValues is null");
// allocate buffer
_values = new Real[Size];
// initialize buffer with values
for (unsigned int i(0U) ; i < Size ; ++i)
_values[i] = prValues[i];
}
// Do not forget copy ctor
TVector(TVector<Real, Size> const &rTVector) {
// allocate buffer
_values = new Real[Size];
// initialize with other vector
*this = rTVector;
}
virtual ~TVector() {
delete [] _values;
}
virtual Real &operator[](int iIndex) {
// check for requested index
if (iIndex < 0 || iIndex >= Size)
throw std::exception("requested index is out of bounds");
// index is correct. Return value
return *(_values+iIndex);
}
virtual TVector<Real, Size> &operator=(TVector<Real, Size> const &rTVector) {
// just copying values
for (unsigned int i(0U) ; i < Size ; ++i)
_values[i] = rTVector._values[i];
return *this;
}
virtual TVector<Real, Size> &operator+=(TVector<Real, Size> const &rTVector) {
for (unsigned int i(0U) ; i < Size ; ++i)
_values[i] += rTVector._values[i];
return *this;
}
virtual TVector<Real, Size> operator+(TVector<Real, Size> const &rTVector) {
TVector<Real, Size> tempVector(this->_values);
tempVector += rTVector;
return tempVector;
}
};
template<class Real> class TVector2: public TVector<Real, 2> {
public:
TVector2() {};
TVector2(Real *prValues): TVector(prValues) {}
TVector2 &operator=(TVector2<Real> const &rTVector) {
return static_cast<TVector2 &>(TVector<Real, 2>::operator=(rTVector));
}
TVector2 &operator+=(TVector2<Real> const &rTVector) {
return static_cast<TVector2 &>(TVector<Real, 2>::operator+=(rTVector));
}
TVector2 operator+(TVector2<Real> const &rTVector) {
return static_cast<TVector2 &>(TVector<Real, 2>::operator+(rTVector));
}
Real &X() { return _values[0]; }
Real &Y() { return _values[1]; }
};
int main(int argc, char** argv) {
TVector2<int> v = TVector2<int>();
v[0]=0;
v[1]=1;
TVector2<int> v1 = TVector2<int>();
v1.X() = 10;
v1.Y() = 15;
v = v1;
v += v1;
v = v + v1;
return 0;
}
いくつかのその他の注意事項:
- それはあなたが
new
のに対してmalloc
を使用することは非常に悪いです。Real
は、あなたのケースでは、vector
がうまく動作するようにPODにすることができます。malloc
がPODでより良いパフォーマンスを提供していると思われる場合は、new
を使用するか、カスタム作成ポリシーを提供してください。また、free
の代わりにdelete []
を使用してメモリバッファを破壊することを忘れないでください。 - オーバーロード時に境界チェックを実行する方が、パフォーマンスを向上させるために、後置式の代わりに
++i
を使用することをお勧めします。operator[]
- 前者では、一時的な値は作成されません。
関連する問題
- 1. 事業でNightly./継続的インテグレーション
- 2. はなぜPHPは2事業者「と等しくない」
- 3. 事業部は、スクロールバー
- 4. 事業部は、クローム
- 5. PHPの業者が
- 6. IPアドレスを使用してモバイル事業者名を決定する
- 7. カスタムジャンゴ管理者テンプレート
- 8. 作業計画のテンプレート?
- 9. ジャンゴ編集やテンプレート
- 10. 事業部の混乱混乱
- 11. HTMLブートストラップ - ディスプレイ事業部の幅
- 12. CSS事業部は、位置決め
- 13. ネストされた事業部ホバー質問
- 14. 事業所にデータを配置
- 15. 事業部の高さはIE8
- 16. は、Windowsの携帯電話事業
- 17. は、経営者や
- 18. ルーティング相互にconflicing、/記事/ article_name_hereおよび/記事/アーカイブ
- 19. CSSの(相対的な初心者のために)の形や方法論
- 20. 消費者や労働者のパターン
- 21. PHP - 管理者の編集記事ページ
- 22. 初心者AWSコグニートの関心事
- 23. 相続人はアンドロイド
- 24. Fluenthibernateマッピング相続/サブクラス
- 25. 背景作業者の代理人と呼び出し者
- 26. Celery - プログラムで作業者をリストする
- 27. 作業者pthreadにcudaコンテキストを渡す
- 28. 2 Azureパッケージの作業者ロール
- 29. プロローグプリントは事実目標や初期
- 30. 新しいXCodeテンプレートに相当する
問題を発生させるために必要な**絶対最小値**までコードをカットしてください(http://sscce.orgを参照)。 –
コンパイルするものが必要ですか?またはエラーなしで解決することができますか? – fso