C ++ объектные ссылки как переменные-члены объектов - PullRequest
2 голосов
/ 04 января 2012

Я немного новичок в C ++ и столкнулся с проблемой при настройке основной архитектуры.Я узнал, как использовать эту конкретную архитектуру в C #, но я не могу заставить ее работать в C ++.Моя проблема заключается в следующем: у меня есть 2 объекта.Я хочу, чтобы эти объекты «знали» друг о друге, поэтому я хочу, чтобы ссылки на оба этих объекта были внутри них переменными-членами.

Учтите это:

//main.cpp:
#include "Object1.h"
#include "Object2.h"

Object1 *obj1;
Object2 *obj2;

...

obj1 = new Object1(obj2);
obj2 = new Object2(obj1);

...


//Object1.h

#ifndef OBJECT1_H
#define OBJECT1_H

#include "Object2.h"

class Object1 {
    public:
    Object1(Object2*);

    Object2 *obj;
}

#endif


//Object2.h

#ifndef OBJECT2_H
#define OBJECT2_H

#include "Object1.h"

class Object2 {
    public:
    Object2(Object1*);

    Object1 *obj;
}

#endif

Это, однако, невозможно.Потому что без ifndef у вас была бы эта бесконечная итерация включения файлов .h.Но с помощью ifndef один из объектов не включает определение другого класса и не знает, какой объект он должен создать.Вся эта проблема не возникает в C #, потому что вам не нужно включать .h файлы.У вас даже нет файлов .h: P.Когда вы создаете новый класс, каждый другой класс знает о существовании этого класса.Но в C ++ вы должны включить .h определенного класса, прежде чем можно будет создать объект этого класса (или даже ссылку).

Итак, мой вопрос.Как мне сделать 2 объекта со ссылками друг на друга как переменные-члены?

Спасибо за ваш интерес!

Приветствия,

Максим Шумейкер

Ответы [ 4 ]

5 голосов
/ 04 января 2012

Вы используете предварительную декларацию, которая просто:

class Object1;     // Pre-declare this class, so we can have pointers to it

Object1 *object1;  // Works fine, without having the full declaration of Object1.
1 голос
/ 04 января 2012

Чтобы справиться с ситуацией, которую вы описали, в c ++ есть вещь, называемая - Форвардное объявление.

Несколько полезных ссылок:

http://en.wikipedia.org/wiki/Forward_declaration

http://www -subatech.in2p3.fr / ~ фотонов / subatech / мягкий / Карнак / CPP-INC-1.shtml

0 голосов
/ 04 января 2012

Вам не нужно включать Object1.hpp в Object2.hpp, если вы работаете только с указателями на Objects1.Но вам нужно включить Object1.hpp в Object2.cpp, так как он должен иметь фактическую реализацию Object1

0 голосов
/ 04 января 2012

Вам не нужно #include в заголовочных файлах. Например, в Object1.h вы можете просто вместо этого поставить class Object2;. Это имеет много преимуществ. Старайтесь избегать #include в заголовочных файлах, если они не компилируются без них.

Вы можете делать такие забавные вещи, как

class X;

X returnX();
void processX(X x);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...