2

このコードを Visual Studio 2010 で実行しようとすると、次のエラーが発生します。

matrix.exe の 0x012c23d3 で未処理の例外: 0xC0000005: 場所 0xccccccd0 を読み取るアクセス違反。

コードは次のとおりです。

#include <vector>

using namespace std;

class matrix : public vector<vector<char>> {
  public:
    matrix(int x, int y) {
        this->resize(x);
        for (int i = 0; i < y; ++i) {
            this[i].resize(y);
        }
    }
};

void main() {
    matrix mat(10, 10);
}

組み込みの行列操作関数を追加matrixして、型を拡張するクラスを作成しようとしています。vector<vector<char>>ただし、このコンストラクターを適切に実行することはできません。

ご協力いただきありがとうございます。

4

4 に答える 4

3

まず、標準コンテナーから公に継承しないでください。それらは、仮想デストラクタを持たないため、そのためのものではありません。派生が基本クラス ポインターによって削除されることを決して意図していなくても、落とし穴に気付かずに、何年も後に誰かがやってくるでしょう。標準コンテナprotectedly またはprivately からの継承は問題ありません。これは、子をポリモーフィックに破棄しようとすることができないためです。

次に、問題は2つあります。ループ条件のi < y代わりに、配列とポインターの演算子である組み込みではなく親クラスを使用することになります。i < xthis[i](*this)[i]operator[][]

しかし、コンストラクター全体を取り除くことができます:

matrix(int x, int y) : vector<vector<char> >(x, vector<char>(y)) { }
于 2013-05-22T18:26:34.857 に答える
0

代わりにこれを試してください:

class matrix : public vector< vector< char > >
{
public:
    matrix(int x, int y)
    {
        vector< char > _val(y, 0);
        this->resize(x, _val);
    }
};
于 2013-05-22T18:40:52.367 に答える