2

解決しようとしている次の循環依存関係の問題があります。

typedef std::map<int, my_class> my_map;

class my_class {
...
private:
    my_map::iterator iter;
};

class otherclass{
public:
    my_map::iterator getIter(); 
private:
    my_map map;
};

my_class が typedef の前に宣言されていないため、コンパイラはこれを好みません。

次のように myclass を前方宣言しようとすると:

class my_class;

typedef std::map<int, my_class> my_map;

class my_class {
...
private:
    my_map::iterator iter;
};

class otherclass{
public:
    my_map::iterator getIter(); 
private:
    my_map map;
};

「エラー: 'my_class' の前方宣言」が表示されます。

どうすればこの悪循環を断ち切ることができるでしょうか?


申し訳ありませんが、私の表現が少し間違っていることに気付いたので、質問を修正する必要があります。

以下は私の問題の正しい表現です:

class my_container;

typedef std::map<int, my_container> my_map;

class my_class {
...
private:
    my_map::iterator iter;
};

class my_container {
public:
    my_class a_method();
private:
    vector<my_class> v;
};

class otherclass{
public:
    my_map::iterator a_method();
    my_class another_method();
    my_container yet_another_method();
private:
    my_map map;
};

これにつきましては申し訳ございません

4

5 に答える 5

2
class my_class;

typedef std::map  < int, my_class* > my_map;
                      ~~~~~~~~~~ use pointer here!
于 2010-07-28T09:06:45.853 に答える
2

循環依存は一般的に悪いことです。デザインを少し考え直してもらえますか?コンテナが何であるかをmy_class本当に知る必要がありますか?

それが実用的でない場合は、イテレータ into の代わりに ?my_mapだけで済むmy_container*でしょうか? コンパイラは、ポインターに不完全な型を使用しても問題ありません。

于 2010-07-28T12:24:00.083 に答える
0

どうですか:

#include <map>

class my_class;                         // forward declare the type.
typedef std::map<int, my_class> my_map;

class my_class
{
  private:
    my_map::iterator iter;
};

class otherclass
{
  public:
    my_map::iterator getIter();
  private:
    my_map map;
};
于 2010-07-28T14:04:43.387 に答える
0

次のように、my_map を my_class のメンバーとして配置します。

class my_class {
public:     typedef std::map<int, my_class> my_map;
...
private:
        my_map::iterator iter;
};

class otherclass{
public:
        my_class::my_map::iterator getIter(); 
private:
        my_class::my_map map;
};

を常に使用したくない場合はmy_class::、別の typedef を作成します。

于 2010-07-28T08:59:29.317 に答える
0

typedef を my_class 内に配置できます。

class my_class {
public:
    typedef std::map<int, my_class> my_map;
...
private:
    my_map::iterator iter;
};

class otherclass{
public:
    my_class::my_map::iterator getIter(); 
private:
    my_class::my_map map;
};
于 2010-07-28T08:59:52.920 に答える