打破C ++中的循环依赖

时间:2010-07-28 08:40:29

标签: c++ circular-dependency

我试图解决以下循环依赖问题:

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;
};

对此抱歉

5 个答案:

答案 0 :(得分:2)

class my_class;

typedef std::map  < int, my_class* > my_map;
                      ~~~~~~~~~~ use pointer here!

答案 1 :(得分:1)

循环依赖通常是一件坏事。你能重新考虑一下你的设计吗? my_class真的需要知道它的容器是什么吗?

如果这不可行,而不是my_map中的迭代器,你可以只使用my_container*吗?对于指针使用不完整的类型,编译器不会有问题。

答案 2 :(得分: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。

答案 3 :(得分: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;
};

答案 4 :(得分: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;
};