1

私の GUI システムでは、主要なビルディング ブロックは描画可能Containerなクラスです (= 描画可能です)。ただし、それ自体は「一種のテーブル」であり、セルが含まれています。Container

Cellクラスはレイアウトに役立ちます。コンテナーが持つセルの数は、行と列の数によって定義されます。Cellオブジェクトは表示されません。

そして、ここに問題があります。Cellオブジェクトは描画できません。オブジェクトにはオブジェクトが含まれており、呼び出し時にオブジェクトContainerで定義された規則Cell(配置、パディングなど)によって描画されますcell.draw()

ここで作成された循環依存関係を回避するために raw ポインターを使用することで、これを簡単に解決できることはわかっていますが、可能であればスマート ポインターを使用したいと考えていました。ただし、取得しているエラーによると、生のポインターとは異なり、スマートポインターがオブジェクトのサイズを認識している必要があることは明らかです。

Unique_ptr エラー

/usr/include/c++/4.8/bits/unique_ptr.h:65:22: error: invalid application of ‘sizeof’ to incomplete type ‘Container’
  static_assert(sizeof(_Tp)>0,

コンテナ.hpp

#include <Cell.hpp> // Causes circular dependency
class Cell; // Causes error: invalid application of ‘sizeof’

class Container
{
// ...
private:
    std::vector<std::unique_ptr<Cell>> cells;
// ...
}

セル.hpp

#include <Container.hpp> //Causes circular dependency
class Container; // Causes error: invalid application of ‘sizeof’
class Cell
{
// ...
private:
    std::vector<std::unique_prt<Container>> subcontainers;
// ...
}

スマート ポインターを使用して状況を解決する良い方法はありますか (おそらく問題の解決策全体を再設計することによって)、またはここで生のポインターを使用する必要がありますか?

4

2 に答える 2

5

std::unique_ptr前方宣言された型で機能しますが、削除を呼び出すには完全な型を知る必要があります。

クラスがコンパイラによって生成されたデストラクタを使用している場合、これはあなたを悩ませます。によって保持される型の完全な型定義が表示されるソース ファイルで、クラスのアウト オブ ラインの (おそらく空の) カスタム デストラクタを定義することによって、問題を取り除くことができunique_ptrます。

詳細については、この回答を参照してください。

于 2015-02-09T17:03:33.070 に答える
0

答え: コンテナを含む 1 つのコンテナが必要だと思います:D 各コンテナには getCells() メソッドがあります。

于 2015-02-09T17:09:34.213 に答える