Особенности использования классов

 
Господа, подскажите, пожалуйста! Не могу разобраться. У меня есть два класса, которые реализуют некоторый функционал. Создаются объекты обеих классов (автоматически). Мне хотелось бы обращаться к данным одного класса 1 из класса 2 и к данным класса 2 из класса 1. Очевидно, что первое реализуется, если я в классе 1 создаю объект класса 2. Но как при этом реализовать второе? Если я пытаюсь еще определить в классе 2 объект класса 1, то компилятор выдает ошибку на строке с определение класса 2 в классе 1 "unexpected token, probably type is missing?", хотя выше по тексту есть #include "Class2.mqh". Ну я чувствую, что тут что-то фундаментально неправильное, но как сделать правильно?
 
What are Forward declarations in C++ - GeeksforGeeks
What are Forward declarations in C++ - GeeksforGeeks
  • www.geeksforgeeks.org
A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.
 
8vlma:
Господа, подскажите, пожалуйста! Не могу разобраться. У меня есть два класса, которые реализуют некоторый функционал. Создаются объекты обеих классов (автоматически). Мне хотелось бы обращаться к данным одного класса 1 из класса 2 и к данным класса 2 из класса 1. Очевидно, что первое реализуется, если я в классе 1 создаю объект класса 2. Но как при этом реализовать второе? Если я пытаюсь еще определить в классе 2 объект класса 1, то компилятор выдает ошибку на строке с определение класса 2 в классе 1 "unexpected token, probably type is missing?", хотя выше по тексту есть #include "Class2.mqh". Ну я чувствую, что тут что-то фундаментально неправильное, но как сделать правильно?
Не понятно, что именно Вы хотите достичь.
Не понятно, что за обращение к данным другого класса? Класс - тип данных, подобен структуре. В классе нет данных, данные в объектах.
Если Вы хотите из объекта класса A обращаться к данным объекта класса B, тогда Вы должны позаботиться:
1) о доступности этих данных вне области видимости класса;
2) о доступности объектов друг для друга.
Т.е., если я правильно понял Вашу проблему, в классах нужны ссылки на объекты, а также методы для установки их значений(типа, SetA(A &) и SetB(B &)). В программном коде связываете объекты посредством ссылок и обращаетесь к данным/методам объектов.

PS. Про декларации Вам уже подсказали.
PPS. То что Вы задумали с объектами внутри классов работать не будет.
 
8vlma:
Ну я чувствую, что тут что-то фундаментально неправильное, но как сделать правильно?

Написать класс 3 в котором использовать классы 1,2

 
 

Sergey Gridnev #:
Не понятно, что именно Вы хотите достичь

...

PPS. То что Вы задумали с объектами внутри классов работать не будет.
class CClass2;

class CClass1
{
        public:
                CClass2                 *C2;
                int                             A1;
                                                CClass1(void){};
                                                ~CClass1(void){};
                void                    PrintOwn(){Print("C1 own var A1 ", A1);};
                void                    PrintOther(){Print("From C1 A2 ", C2.A2);};
};

class CClass2
{
        public:
                CClass1                 *C1;
                int                     A2;
                                                CClass2(void){};
                                                ~CClass2(void){};
                void                    PrintOwn(){Print("C2 own var A2 ", A2);};
                void                    PrintOther(){Print("From C2 A1 ", C1.A1);};
};

void OnStart()
{
        CClass1 Class1;
        CClass2 Class2;
        
        Class1.C2 = &Class2;
        Class2.C1 = &Class1;
        Class1.A1 = 1;
        Class2.A2 = 2;
        
        Class1.PrintOwn();
        Class2.PrintOwn();

        Class1.PrintOther();
        Class2.PrintOther();
}

Работает с forward declarations. Спасибо!

 
8vlma:
Господа, подскажите, пожалуйста! Не могу разобраться. У меня есть два класса, которые реализуют некоторый функционал. Создаются объекты обеих классов (автоматически). Мне хотелось бы обращаться к данным одного класса 1 из класса 2 и к данным класса 2 из класса 1. Очевидно, что первое реализуется, если я в классе 1 создаю объект класса 2. Но как при этом реализовать второе? Если я пытаюсь еще определить в классе 2 объект класса 1, то компилятор выдает ошибку на строке с определение класса 2 в классе 1 "unexpected token, probably type is missing?", хотя выше по тексту есть #include "Class2.mqh". Ну я чувствую, что тут что-то фундаментально неправильное, но как сделать правильно?
Похоже вы пытаетесь написать спагетти код. Так делать нельзя. Черевато нулевой читаемостью кода и регулярными падениями. То, что вы пишите является так называемым ***. Пересмотрите архитектуру. 
 
Вадим Калашников #:
Похоже вы пытаетесь написать спагетти код. Так делать нельзя. Черевато нулевой читаемостью кода и регулярными падениями. То, что вы пишите является так называемым ***. Пересмотрите архитектуру. 

Это не всегда так. Порою перекресные ссылки необходимы.

 
как оказалось , решение напоминает "список"
 
Vasiliy Sokolov #:

Это не всегда так. Порою перекресные ссылки необходимы.

Приведите пример, когда без перекрестных ссылок не обойтись? Спагетти код всегда являлся "***", который усложняет дебаг и чтение кода. Если у вас не получается обойтись без перекрестных ссылок - значит у вас большая ошибка в архитектуре. В 100% случаев можно обойтись без этого.

 
Вадим Калашнков #:

Приведите пример, когда без перекрестных ссылок не обойтись?

Двунаправленный список.
Причина обращения: