Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
430 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,641
Записей в блоге: 14

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

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

Студворк — интернет-сервис помощи студентам
Первая тема превратилась в гору флуда, попробую еще раз. Модераторы, простите за дубль. Вероятно, я плохо объяснил задачу.
Есть два класса: 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.03.2018, 18:43
Ответы с готовыми решениями:

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

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

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

4
73 / 86 / 40
Регистрация: 02.11.2017
Сообщений: 379
06.03.2018, 18:47
В си - никак. нужно сначала определить класс, а потом уже его юзать. Здесь однопроходная компиляция. Максимум - сослаться на еще не определенный класс при помощи указателя.
0
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,245
06.03.2018, 19:39
Примерно так:
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
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
06.03.2018, 19:58
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
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
430 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,641
Записей в блоге: 14
06.03.2018, 21:55  [ТС]
При попытке вызвать gn() компиляция проходит нормально, но уже во время запуска выпрыгивает ошибка:
Необработанное исключение: System.AccessViolationException: Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена.
Что вообще такое "защищенная память"? Возможно, эта ошибка не имеет никакого отношения к взаимодействию классов? Если так, то в чем ее причина? И как ее исправить?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.03.2018, 21:55
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru