Классы C ++ с членами, ссылающимися друг на друга - PullRequest
2 голосов
/ 15 ноября 2011

Я пытаюсь написать 2 класса с членами, которые ссылаются друг на друга. Я не уверен, что делаю что-то не так или это просто невозможно. Может ли кто-нибудь помочь мне здесь ...

Source.cpp

#include "Headers.h"
using namespace std;

void main()
{
    Network* network = new Network();

    system("pause");
    return;
}

Headers.h

#ifndef Headers_h
#define Headers_h

#include <iostream>
#include <vector>
#include "Network.h"
#include "Router.h"

#endif

Network.h

#include "Headers.h"

class Network
{
protected:
    vector<Router> Routers;
};

Router.h

#include "Headers.h"

class Router
{
protected:
    Network* network;
public:
};

Я получаю следующие ошибки:

ошибка C2143: синтаксическая ошибка: отсутствует ';' до '<' <br> ошибка C2238: неожиданный токен (ы), предшествующий ';'
ошибка C4430: отсутствует указатель типа - предполагается int.

Я почти уверен, что не пропустил ни точки с запятой, ни тому подобное. Программа работает, найду ли я одного из участников. Я пытался найти похожие вопросы, и решение было использовать указатели, но это то, что я делаю, и это, похоже, не работает!

Ответы [ 4 ]

4 голосов
/ 15 ноября 2011
  1. Использование включает охрану .
  2. Использование Форвардная декларация

1011 * Е.Г. *

Source.cpp

#include "Network.h"
// using namespace std; // bad idea unless it's a quickie test program

void main()
{
    Network* network = new Network();

    system("pause");
    return;
}

Network.h #ifndef MY_NETWORK_H_INCLUDED #define MY_NETWORK_H_INCLUDED

#include "Router.h"
#include <vector>
using std::vector;
// even better is:
//     typedef std::vector<Router> t_RouterVec;
//     t_RouterVec routers;

class Network
{
protected:
    vector<Router> Routers;
};

    #endif // MY_NETWORK_H_INCLUDED

Router.h

#ifndef MY_ROUTER_H_INCLUDED
#define MY_ROUTER_H_INCLUDED
    class Network;
class Router
{
protected:
    Network* network;
public:
};

    #endif MY_ROUTER_H_INCLUDED

ОЧЕНЬ ПЛОХАЯ ИДЕЯ Я считаю это запахом. Вы заставляете всех включать все. Теперь каждый раз, когда вы что-то меняете в Network.h или Router.h, вы должны перекомпилировать (и в идеале заново тестировать) все!

#ifndef Headers_h
#define Headers_h

#include <iostream>
#include <vector>
#include "Network.h"
#include "Router.h"

#endif
4 голосов
/ 15 ноября 2011

первая ошибка - вам нужно явно использовать пространство имен:

std::vector<Router> Routers;

Не "использовать пространство имен std;" в заголовочных файлах

Другие ошибки возникают с первого раза:)

Что касается ссылки на класс, определенный позже, вам нужно сделать предварительное объявление класса Router, поставить

class Router;

в вашу Сеть.h

1 голос
/ 15 ноября 2011

Вам необходимо добавить к вашему вектору std::.Другой вариант - поставить using namespace std; вверху этого файла.

std::vector<Router> Routers;

или

using namespace std;
...
vector<Router> Routers;
0 голосов
/ 15 ноября 2011

Проблемы компиляции:

  1. Пожалуйста, добавьте std :: before vector в Network.h

  2. Пожалуйста, исправьте mainвернуть целое число, согласно стандартам.


Циркулярные ссылки:

Network.h ссылается на класс Router для своего векторасодержание и ссылки на Router.h класс Network.Это сценарий курица-яйцо.Вы не можете иметь оба:).

Чтобы решить эту проблему, я бы порекомендовал следующее:

  1. Добавить непрозрачную ссылку на класс Network в Router.h.

    Поскольку Router.h использует указатель на сеть, ему не нужно знать детали сети, нужно просто знать, что сеть является классом.

    class Network;

  2. Измените порядок директив включения в Headers.h на

    # include «Router.h»

    # include «Network.h»

...