C++ 打破C+中的循环依赖+;

C++ 打破C+中的循环依赖+;,c++,circular-dependency,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; }; typedef std::map my_map; 上我的课{ ... 私人

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

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;
};
typedef std::map my_map;
上我的课{
...
私人:
我的地图::迭代器iter;
};
另一类{
公众:
我的映射::迭代器getIter();
私人:
我的地图;
};
编译器不喜欢这样,因为my_类不是在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;
};
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;
};
class my_class;
typedef std::map my_map;
上我的课{
...
私人:
我的地图::迭代器iter;
};
另一类{
公众:
我的映射::迭代器getIter();
私人:
我的地图;
};
我得到一个“错误:转发‘我的_类’声明”

我怎样才能打破这种恶性循环


很抱歉,我必须修改我的问题,因为我注意到我的陈述有点错误

以下是我的问题的正确表述:

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;
};
class my_容器;
typedef std::map my_map;
上我的课{
...
私人:
我的地图::迭代器iter;
};
类我的容器{
公众:
我的_类a_方法();
私人:
向量v;
};
另一类{
公众:
my_map::迭代器a_方法();
我的_类另一个_方法();
我的容器是另一个方法();
私人:
我的地图;
};

对此感到抱歉

请将我的地图作为成员放入我的\u类,如下所示:

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;
};
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;
};
class my\u class{
public:typedef std::map my_map;
...
私人:
我的地图::迭代器iter;
};
另一类{
公众:
my_类::my_映射::迭代器getIter();
私人:
my_类::my_地图;
};

如果您不想总是使用my_类::,请制作另一个typedef。

您可以将typedef放入my_类中:

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;
};
class my\u class{
公众:
typedef std::map my_map;
...
私人:
我的地图::迭代器iter;
};
另一类{
公众:
my_类::my_映射::迭代器getIter();
私人:
my_类::my_地图;
};
我的班级;
typedef std::mapmy_map;
~~~~~~~~~~~~~在这里使用指针!

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

如果这不实用,您可以不使用
my\u map
的迭代器,而只使用
my\u容器*
?编译器使用不完整的指针类型不会有问题。

如何:

#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;
};
#包括
class my_class;//向前声明类型。
typedef std::map my_map;
上我的课
{
私人:
我的地图::迭代器iter;
};
另一类
{
公众:
我的映射::迭代器getIter();
私人:
我的地图;
};

你能发布编译器给出的准确错误消息吗?获取上述代码的准确副本,并从VS2005的my_类构建中删除“…”。即使关闭了语言扩展,修改后的示例也可以使用VS2010进行编译。最后一个示例唯一的错误(除了缺少包括(始终提供一个精确的副本和粘贴的代码片段,以编译和生成您看到的错误(否则我们会花太多时间猜测您的环境)))你忘了vector上的std::prefix。谢谢大家的评论。这确实很有趣,但我的编译器不喜欢模板类的前向声明。我用映射解决了这个问题;是的,这应该可以工作,但不幸的是我在格式化问题时犯了一个错误,我的情况有点复杂。请ee post。请不要使用指针。这只会导致泄漏,因为您没有明确定义对象的所有权。+1,尽管这假设您不想将其添加到映射中导致复制。但通常是这样。@izex,您真的需要在每次将对象放入映射或读取时创建该对象的完整副本吗它来自映射?这通常是相当昂贵的。顺便说一句,对于这个问题,我真的很喜欢shared_ptr:typedef std::mapmy_map;它只是解决了在这里使用原始指针的内存管理难题。谢谢。我知道这不是小事,但在我的情况下,循环依赖是必要的。我解决了这个问题确实是在我的容器里。