C ++ строит взаимозависимость - PullRequest
1 голос
/ 14 сентября 2010

Здравствуйте, у меня есть структуры, объявленные в том же заголовочном файле, которые нужны друг другу.

struct A; // ignored by the compiler
struct B{
  A _iNeedA; //Compiler error Here
};

struct A { 
  B _iNeedB;
};

это нормально работает

class A;
class B{
  A _iNeedA;
};

class A { 
  B _iNeedB;
    };

// everything is good

Большое спасибо!

Ответы [ 2 ]

7 голосов
/ 14 сентября 2010

Это не может работать: A содержит B содержит A содержит B содержит….Где остановиться?

Все, что вы можете сделать для моделирования циклических зависимостей, это использовать указатели:

class A;

class B {
    A* _iNeedA;
};

class A {
    B* _iNeedB;
};

Теперь классы не содержат друг друга, просто ссылаются друг на друга.

Кроме того, вам нужно обратить внимание, что вы не можете использовать вещи, которые вы еще не определили : в приведенном выше коде вы объявили A до определения B.Так что можно объявить указатели на A в B.Но вы еще не можете использовать A до его определения.

0 голосов
/ 14 сентября 2010

Я отвечаю на свой вопрос.

Дело в том, что я делаю не совсем то, что я написал, но я думаю, это было то же самое, на самом деле я использую операторы, которые принимают аргументы. Тело операторов должно быть определено после моих объявлений структур (вне структуры), потому что структура B еще не знает членов структуры A ...

Я сказал, что это работает с классами, потому что с классами мы обычно используем файл CPP для определения методов, здесь я не использую какой-либо файл cpp для методов, которые я использую в своих структурах

Я собирался удалить это сообщение, но вы, ребята, слишком быстро;),

Вот пример

struct A; 

struct B { 
int member;
bool operator<(const A& right); //body not defined

}; 

struct A { 

int member;
   bool operator<(const B& right)
   {
      return  this->member < B.member;
   }
}; 

 bool B::operator<(const A& right) //define the body here after struct A definition
{
    return  this->member < A.member;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...