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. エメット:他の事業者が
- 2. 事業者は、フロートに「android.widget.EditText」
- 3. iOSで返される通信事業者名は、ネットワーク通信事業者名かSIMキャリア名ですか?
- 4. 事業でNightly./継続的インテグレーション
- 5. 初心者相続問題C#
- 6. はなぜPHPは2事業者「と等しくない」
- 7. アドビシステムズ社のブロードキャスト事業者のIPアドレスの取得
- 8. のPostgreSQL 9.4 UPDATE ... REGEX事業者とエラーからの
- 9. ハンドル事業エラー
- 10. 事業部は、左
- 11. Magento2カスタムコンテンツ事業部
- 12. 事業部は、クローム
- 13. 事業部は、スクロールバー
- 14. 作業者ロールトレースログ
- 15. Kentico記事aspxテンプレート
- 16. 事業部は、チェックボックスが
- 17. PHPの業者が
- 18. IPアドレスを使用してモバイル事業者名を決定する
- 19. のstd ::ソートは、()(<グローバル事業者を探していません)
- 20. プロローグ - 私は、次の演算子を定義している事業者
- 21. 2Dベクトルへの割当対象事業者のための一致なし=
- 22. RxPy - 合併事業者が排出をインターリーブするのはなぜですか?
- 23. はどのようにこれら2つの事業者が作業を行うオペレータ
- 24. ドッカーインスタンスでredisに接続できないセラー作業者
- 25. テンプレート相互再帰
- 26. 相対テンプレートのインポート
- 27. スパークの摂取経路:「作業者から作業者へのソース」または「作業者からのソース」
- 28. 可変個引数テンプレート展開、相続、とstd :: unique_ptrを
- 29. テンプレート引数リスト相互接続された汎用構造体
- 30. HTML事業部は、私はこれをやろうとしている
問題を発生させるために必要な**絶対最小値**までコードをカットしてください(http://sscce.orgを参照)。 –
コンパイルするものが必要ですか?またはエラーなしで解決することができますか? – fso