0

Null値または派生した子を指すオブジェクトポインタのグリッドを持つプログラムで作業しています。このグリッドの値を派生した子のアドレスに設定して、子をグリッドに「配置」し、メモリ内の位置によって子にアクセスできるようにしたいと考えています。同じクラスの代入として、逆参照としての()演算子と=演算子の両方をオーバーロードすることはできますか?

グリッドのインターフェイスの外観を強調します。

class Grid{ 

public: 
    virtual int get(g_type) const; 

public: 

    parent* operator() (int,int); 

    Grid() : _amtCol(10),_amtRow(10) 
    {construct();} 

    ~Grid() {deconstruct();} 

private: 
    int _amtCol; 
    int _amtRow; 
    parent* **_grid; 

private: 
    parent ***meddle(access); 
    void meddle(access, parent***); 
    virtual void construct(); 
    virtual void deconstruct(); 
}; 

Heres()オーバーロードの外観。私のクラスの残りの部分を作成し、限り継承と構造が行くように動作している

Grid b; 
Child c; 
Child c2; 

b(1,1) = &c; 
b(1,4) = &c2; 

b(1,1)->foo(); //calls the first Childs foo() 
b(1,4)->foo(); //calls the second Childs foo() 

:私が行うことができるようにしたいどのような

parent* Grid::operator() (int i,int j){ 

    if(i < get(r_QTY) && j < get(c_QTY)){ 

     return this->meddle(key)[i+1][j+1]; 

    }else{return NULL;} 
} 

はと私のプログラムの残りの部分の中にこれを呼んでいます。

オーバーロードなどを連鎖させる方法はありますか?

おそらく私は親と子供のクラスで割り当て過負荷を解消する必要があると思っていましたが、うまくいくようです。

///////////////////////////////////////////////////////////////////////////// ///////

アンはさておき、私はこれが実装されています:

void Grid::operator() (int i,int j,parent &cpy){ 
    if(i < get(r_QTY) && j < get(c_QTY)){ 
     this->meddle(key)[i+1][j+1] = &cpy; 
    } 
} 

は、この機能が可能になります。

私の論文があります!ありがとう!

////////////速い追加:おそらく、これが道徳的かつ倫理的に公正であるかどうかを必ずしも知る必要はありません。私は機能する機能を実装する方法があります。私は、ライブラリにすでに存在するものを私自身の創作物よりも優先させることを理解していると思いますが、たとえばstd :: vectorを使用するとできないということは可能であるということです。私は、これがどのように可能になったのか、それが言語の構文のどこにあるのだろうと思っています。

+0

無関係に、しかし、あなたはそれが役に立つかもしれませんto [コンストラクタまたはデストラクタで 'virtual'関数を呼び出さない理由を知る](https://stackoverflow.com/questions/962132/calling-virtual-functions-inside-constructors) – Tas

+0

また、[あなたのデストラクタが仮想でなければならない理由](https://stackoverflow.com/questions/1123044/when-should-your-destructor-be-virtual) – PaulMcKenzie

+0

ああ、それは非常に有用な情報です。ありがとう。 – TBurns

答えて

0

ないあなたの質問は正確に何をしてください、しかし、あなたのような何かを行うことができます。

struct parent 
{ 
    virtual ~parent() = default; 
    virtual void foo() = 0; 
}; 

struct Child : parent 
{ 
    Child(int n) : n(n) {} 
    void foo() override { std::cout << n << std::endl;} 
    int n; 
}; 

class Grid{ 
public: 
    Grid() : col(10), row(10), grid(col * row, nullptr) {} 

    parent* operator() (std::size_t x, std::size_t y) const { 
     if (col <= x || row <= y) { throw std::runtime_error("Invalid arguments"); } 
     return grid[y * col + x]; 
    } 

    parent*& operator() (std::size_t x, std::size_t y) { 
     if (col <= x || row <= y) { throw std::runtime_error("Invalid arguments"); } 
     return grid[y * col + x]; 
    } 

private: 
    int col; 
    int row; 
    std::vector<parent*> grid; 
}; 

をそして、あなたが持っている:

Grid b; 
Child c(1); 
Child c2(2); 

b(1,1) = &c; 
b(1,4) = &c2; 

b(1,1)->foo(); //calls the first Childs foo() 
b(1,4)->foo(); //calls the second Childs foo() 

Demo

関連する問題