1

互いに依存する2つのクラスがあります。私は以前にこの問題を解決しましたが、これを修正する方法を覚えていません。私の簡略化されたコードは次のとおりです。

struct MenuOption{
  string Text;
  int Choice;
  bool UseSubMenu;
  Menu SubMenu;
};

class Menu{
public:
  Menu(MenuOption optionlist[],int optioncount);
};
4

4 に答える 4

3
  • 前方宣言を使用する

すなわち:

// Forward declaration to assure A of B's existence.
class B;

class A { // uses B
  B* b;
};

class B { // uses A
  A* a;
};
  • オブジェクト インスタンスではなくポインターを使用します。これは、コンパイラがクラスのメンバーに割り当てる領域を知る必要があるためです。したがって、コンパイラはそのクラスの完全な宣言を確認しないとそのサイズを認識できないため、そこにオブジェクト インスタンスを配置しても機能しません。ただし、ポインターはすべて同じサイズであり、余分なものを確認することなくコンパイラーに認識されます。
于 2010-09-27T09:05:39.913 に答える
1

前方宣言を使用する

struct MenuOption;

class Menu{
public:
  Menu(MenuOption optionlist[],int optioncount);
};

struct MenuOption {
  string Text;
  int Choice;
  bool UseSubMenu;
  Menu SubMenu;
};

データ メンバーをポインターにする必要はありません。上記のコード スニペットには「再帰的な無限サイズ」はありません。

SubMenuこれとは別に、それをポインターにすることはまだ良い考えのようです。サブメニューは必須ではなさそうですよね?そうしないと、そのメンバーは常にメニューになり、初期化する必要があるため、ポインターを使用する必要があります。ポインターは、初期化されていないままにするか、NULL ポインターとして残すことができます。boost::optional<>代わりに使用することもできます

struct MenuOption {
  string Text;
  int Choice;
  boost::optional<Menu> SubMenu;
};
于 2010-09-27T20:06:35.560 に答える
0

オブジェクトの代わりにポインターを使用する必要があります。この場合、私はそうSubMenuする必要があると信じていますMenu*

編集

実際、他の人が述べたように、前方宣言も必要です。ただし、前方宣言では、ポインター/参照を定義することはできますが、オブジェクトを作成することはできません。オブジェクトを作成しようとするとき、コンパイラはオブジェクトの内容を知る必要がsizeofありますが、これは利用できません (前方宣言を行ったとしても)。前方宣言でMenuは、型であることをコンパイラに伝え、型オブジェクトclassへのポインタをストレートしています。Menu考えてみてください。インスタンスを別のインスタンスにすることは、無限の再利用になります。

于 2010-09-27T09:05:10.163 に答える
0
class Menu;
struct MenuOption{
  string Text;
  int Choice;
  bool UseSubMenu;
  Menu* SubMenu;
};

class Menu{
public:
  Menu(MenuOption optionlist[],int optioncount);
};

基本的には、Menu クラスを「前方宣言」してから、Menu へのポインタを SubMenu として使用します。

于 2010-09-27T09:05:48.033 に答える