我试图解决以下循环依赖问题:
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;
};
对此抱歉
答案 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;
};