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

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

如果这不切实际,而不是迭代器 into my_map,你可以只用一个my_container*? 编译器对指针使用不完整类型不会有问题。

于 2010-07-28T12:24:00.083 回答
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 回答
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 回答