打破 C++ 中的循环依赖

发布于 2024-09-11 22:23:59 字数 1112 浏览 5 评论 0原文

我正在尝试解决以下循环依赖问题:

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

对此感到抱歉

I have the following cyclic dependency problem I am trying to solve:

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

The compiler does not like this, since my_class was not declared before the typedef.

if I try to forward-declare myclass like this:

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

I get an "error: forward declaration of 'my_class'".

How can I break this vicious cycle?


I'm sorry but I have to revise my question, as I have noticed that my representation is slightly wrong.

The following is the correct representation of my problem:

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

Sorry about this

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

许你一世情深 2024-09-18 22:23:59
class my_class;

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

typedef std::map  < int, my_class* > my_map;
                      ~~~~~~~~~~ use pointer here!
浮云落日 2024-09-18 22:23:59

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

如果这不切实际,您可以只使用 my_container* 来代替 my_map 的迭代器吗?编译器不会因为使用不完整类型的指针而出现问题。

Circular dependencies are generally a Bad Thing. Can you re-think your design a bit? Does a my_class really need to know what its container is?

If that's not practical, instead of an iterator into my_map, could you get away with just a my_container*? The compiler won't have a problem with using an incomplete type for the pointer.

枫林﹌晚霞¤ 2024-09-18 22:23:59

将 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。

put my_map as a member in my_class, like this:

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

If you don't want to always use my_class::, then make another typedef.

短叹 2024-09-18 22:23:59

您可以将 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;
};

You could put the typedef inside 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;
};
莫多说 2024-09-18 22:23:59

怎么样:

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

How about:

#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;
};
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文