Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
Труд вопреки насмешкам
190 / 173 / 40
Регистрация: 13.07.2017
Сообщений: 3,564
Записей в блоге: 8
1

Обмен информацией между классами. Попытка 2

06.03.2018, 18:43. Показов 637. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Первая тема превратилась в гору флуда, попробую еще раз. Модераторы, простите за дубль. Вероятно, я плохо объяснил задачу.
Есть два класса: Class1 и Class2. Они должны использоваться друг в друге. В классе Class2 Class1 используется в переменных, функциях, параметрах функций множество раз (десятки-сотни). В классе Class1 оператор "=" и одна-две статических функции вызывают статическую функцию класса Class2. Что-то похожее на это:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Class1 {
public:
    Class1 operator=(Class1 _Ptr) {
        return *this = Class2::gn(_Ptr);
    }
    static Class1 f(Class1 x) {
        return Class2::gn(x);
    }
};
class Class2 {
public:
    Class1 a1, a2, ..., an;
    static Class1 g1(int x) {}
    static int g2(Class1 x) {}
    ...
    static Class1 gn(Class1 x) {}
};
Ошибки:
d:\***\***.cpp(13): error C2653: Class2: не является именем класса или пространства имен
d:\***\***.cpp(13): error C3861: gn: идентификатор не найден
d:\***\***.cpp(16): error C2653: Class2: не является именем класса или пространства имен
d:\***\***.cpp(16): error C3861: gn: идентификатор не найден
Что нужно добавить/заменить, чтобы их не было?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.03.2018, 18:43
Ответы с готовыми решениями:

Обмен информацией между классами
Кто знает, как сделать, чтобы можно было в некотором классе использовать члены некоторого другого...

Попытка разобраться с классами в C++
Доброго времени суток Читаю книгу Дейтел С++ дошел до классов и в первом же упражнении впал в...

Знакомство с классами, попытка реализации класса матриц
Собственно выдает следующую вещь "Необработанное исключение в "0x00411805" в...

Обмен информацией с файлами и модульный принцип программирования
Модифицировать данную программу используя потоки файлового ввода / вывода для считывания входящей...

4
73 / 86 / 40
Регистрация: 02.11.2017
Сообщений: 379
06.03.2018, 18:47 2
В си - никак. нужно сначала определить класс, а потом уже его юзать. Здесь однопроходная компиляция. Максимум - сослаться на еще не определенный класс при помощи указателя.
0
Модератор
Эксперт С++
13692 / 10897 / 6470
Регистрация: 18.12.2011
Сообщений: 29,085
06.03.2018, 19:39 3
Примерно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Class1;// предварительное объявление класса
 
class Class2 {
public:
    Class1 *a1, *a2;
    static Class1& g1(int x) {}
    static int g2(Class1& x) {}
    static Class1& gn(Class1& x) {}
};
class Class1 {
public:
    Class1 operator=(Class1& _Ptr) {
        return *this = Class2::gn(_Ptr);
    }
    static Class1 f(Class1& x) {
        return Class2::gn(x);
    }
};
В смысл написанного не вникал
0
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
06.03.2018, 19:58 4
zss, с предварительным объявлением класса нельзя писать реализацию функций до полного объявления второго класса. То есть нужно что-то типа

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Class2;// предварительное объявление класса
class Class1 {
public:
    Class1 operator=(Class1& _Ptr);
    static Class1 f(Class1& x);
};
class Class2 {
public:
    Class1 a1, a2, ..., an;
    static Class1 g1(int x) {}
    static int g2(Class1 x) {}
    ...
    static Class1 gn(Class1 x) {}
};
 
Class1 Class1::operator=(Class1& _Ptr) {
        return *this = Class2::gn(_Ptr);
}
Class1 Class1::f(Class1& x) {
        return Class2::gn(x);
}
Добавлено через 2 минуты
Или в файлы реализаций (сpp) добавлять заголовочные обоих классов, в которых используются предварительные объявления.

Добавлено через 4 минуты
//class1.h с классом Class1
C++
1
2
3
4
5
6
class Class2;
class Class1 {
public:
    Class1 operator=(Class1& _Ptr);
    static Class1 f(Class1& x);
};
//class2.h с классом Class2
C++
1
2
3
4
5
6
7
8
9
10
11
#include "class1.h" //это нужно, потому что есть члены класса a1, a2, ..., an
// для того, чтоб было предварительное объявление class Class1, нужно заменить их на указатели
// (которые могут быть полями даже без полного определения Class1) и создавать динамически уже в реализации.
class Class2 {
public:
    Class1 a1, a2, ..., an;
    static Class1 g1(int x);
    static int g2(Class1 x);
    ...
    static Class1 gn(Class1 x);
};
И общая реализация (в одном или двух файлах, но с одинаковыми include'ами)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include "class1.h"
#include "class2.h"
 
Class1 Class1::operator=(Class1& _Ptr) {
        return *this = Class2::gn(_Ptr);
}
Class1 Class1::f(Class1& x) {
        return Class2::gn(x);
}
 
Class1 Class2::g1(int x) {return Class1();}
int Class2::g2(Class1 x) {return 0;}
 
Class1 Class2::gn(Class1 x) {return Class1();}
1
Труд вопреки насмешкам
190 / 173 / 40
Регистрация: 13.07.2017
Сообщений: 3,564
Записей в блоге: 8
06.03.2018, 21:55  [ТС] 5
При попытке вызвать gn() компиляция проходит нормально, но уже во время запуска выпрыгивает ошибка:
Необработанное исключение: System.AccessViolationException: Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена.
Что вообще такое "защищенная память"? Возможно, эта ошибка не имеет никакого отношения к взаимодействию классов? Если так, то в чем ее причина? И как ее исправить?
0
06.03.2018, 21:55
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.03.2018, 21:55
Помогаю со студенческими работами здесь

Связь между 2 классами
Есть 2 класса: Class A { private: B** arrayB;/нужно раньше объявить класс И ... }; A*...

Взаимодействие между классами
При попытке создать указатель на объект класса в public секции другого класса из которого будет...

Взаимодействие между классами
Суть проблемы такова: в одном файле classy.h объявлено несколько классов (classcontrol, class1,...

Передача данных между классами
Здравствуйте! Программирую графику на C++ под DirectX9, если точнее то пытаюсь написать простой...

Отличия между структурами и классами
Объясните пожалуйста, в С++, получается, что структура отличается от класса только тем, что у нее...

Реализация отношений между классами is-a, has-a, uses-a в С++
Где можно найти информацию по отношениям между объектами классов is-a, has-a, uses-a и и их...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru