2012-01-04 5 views
2

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

Рассмотрим это:

//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 thingy у вас будет эта бесконечная итерация, включающая в себя файлы .h. Но с ifndef один из объектов не включает определение класса others и не знает, какой объект он должен создать. Вся эта проблема не возникает в C#, потому что вам не нужно включать файлы .h. У вас даже нет файлов .h: P. Когда вы создаете новый класс, каждый другой класс знает о существовании этого класса. Но в C++ вы должны включить .h конкретного класса, прежде чем можно создать объект этого класса (или ссылку даже).

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

Благодарим вас за интерес!

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

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

ответ

5

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

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

Object1 *object1; // Works fine, without having the full declaration of Object1. 
+2

Идея прав, но это обычно известно как упреждающее объявление, а не предварительной декларации. (И в стандарте это просто объявление. В отличие от определения, которое обеспечивает полное определение класса.) –

+0

Спасибо, чувак, это именно то, что мне нужно ^^ –

0

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

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

class X; 

X returnX(); 
void processX(X x); 
    -
0

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

 Смежные вопросы

  • Нет связанных вопросов^_^