Нарушение циклической зависимости в C ++ - PullRequest
2 голосов
/ 28 июля 2010

У меня есть следующая проблема циклической зависимости, которую я пытаюсь решить:

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 ]

2 голосов
/ 28 июля 2010
class my_class;

typedef std::map  < int, my_class* > my_map;
                      ~~~~~~~~~~ use pointer here!
1 голос
/ 28 июля 2010

Круговые зависимости, как правило, плохие вещи. Можете ли вы немного переосмыслить свой дизайн? my_class действительно нужно знать, что его контейнер?

Если это не практично, вместо итератора в my_map, не могли бы вы обойтись только с my_container*? У компилятора не возникнет проблем с использованием неполного типа для указателя.

0 голосов
/ 28 июля 2010

Как насчет:

#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;
};
0 голосов
/ 28 июля 2010

Вы можете поместить 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;
};
0 голосов
/ 28 июля 2010

положить 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.

...