Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
Заблокирован

Возможен ли класс для обработки объекта другого класса?

18.10.2012, 03:59. Показов 2581. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Решил написать приложение в кот больше 10 строк... Куча классов получилась, запутался в данных и во всем, но главное не вэтом. Получилось так что первый класс должен обрабатывать объект второго класса, и наоборот, второй первого... Можно ли так сделать?

Вот допустим есть два класса, как убрать ошибку в функции void seta() в классе one?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <iostream>
class one
    {
    public:
    int geta()
        {
        return a;   
        }
    void seta(int _a)
        {
        a=_a;   
        }
    void seta()
        {
        a=b2.getb();
        /*вот здесь ругает*/
        }   
    private:
    int a;  
    };
    
class two
    {
    public:
    int getb()
        {
        return b;   
        }
    void seta(int _b)
        {
        b=_b;   
        }
    private:
    int b;  
    };  
    
int main()
    {
    one a1;
    two b2;
    return 0;   
    }
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.10.2012, 03:59
Ответы с готовыми решениями:

Вызвать процедуру\функцию из другого объекта\класса. Из одного класса\объекта сделать два
Здравствуйте. Подскажите что не правильно делаю, и возможно ли вообще - вызвать процедуру\функцию из другого объекта\класса, в турбо...

Передача объекта методу другого объекта другого класса
Всем привет. Есть у меня класс test1, который имеет конструкторы только с параметрами. Другой класс test2 имеет конструктор, который...

Объявление объекта класса fstream в качестве статической компоненты другого класса
Доброго времени суток. Есть задание, в котором говорится &quot;...Перепишите программы из упражнений 4 и 6 таким образом, чтобы использовать...

29
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,030
Записей в блоге: 1
18.10.2012, 06:38
если требуется доступ к приватным полям, то копайте в сторону friend
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
18.10.2012, 08:19
Определение класса two поставьте первым и :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
...
void seta(two &b2)
        {
        a=b2.getb();
        }  
...
    
int main()
    {
    one a1;
    two b2;
    a1.seta(b2);
    
    return 0;   
    }
1
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,030
Записей в блоге: 1
18.10.2012, 10:23
Если у Вас класс one зависит от класса two, при этом класс two зависит от класса one и объявлен после класса one, то при компиляции класса one компилятор еще ничего не знае про класс two, собственно по этому и возникает ошибка. Чтобы ошибки не было необходимо перед классом one поставить
C++
1
class two;
это скажет компилятору что класс two существует и объявлен где-то далее
1
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
18.10.2012, 10:34
Добавлено через 2 минуты
Цитата Сообщение от Croessmah Посмотреть сообщение
Чтобы ошибки не было необходимо перед классом one поставить: class two;
Это не помогает.
Цитата Сообщение от Croessmah Посмотреть сообщение
собственно по этому и возникает ошибка.
И не только поэтому. Как компилятор должен понять, что такое b2?
0
Заблокирован
18.10.2012, 10:36  [ТС]
Цитата Сообщение от alsav22 Посмотреть сообщение
Это не помогает.
ТОчно, а было бы решением всех проблеи я не могу поставить two перед one
тк класс two тоже должен вызывать объект класса one. Т.е. ситуация не поменяется...

Добавлено через 1 минуту
Цитата Сообщение от alsav22 Посмотреть сообщение
Как компилятор должен понять, что такое b2?
Я знаю, что проблема в этом, я не знаю как ее решить
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
18.10.2012, 10:39
Цитата Сообщение от AnreyKazakov Посмотреть сообщение
Я знаю, что проблема в этом, я не знаю как ее решить
Я вам написал как. Что не устраивает? Этот код выдаёт ошибку?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <iostream>
 
class two
    {
    public:
    int getb()
        {
        return b;   
        }
    void seta(int _b)
        {
        b=_b;   
        }
    private:
    int b;  
    };  
 
class one
    {
    public:
    int geta()
        {
        return a;   
        }
    void seta(int _a)
        {
        a=_a;   
        }
    void seta(two &b2)
        {
        a=b2.getb();
        }    
    private:
    int a;  
    };
    
 
    
int main()
    {
    one a1;
    two b2;
    a1.seta(b2);
    
    return 0;   
    }
0
Заблокирован
18.10.2012, 10:50  [ТС]
Цитата Сообщение от alsav22 Посмотреть сообщение
Я вам написал как. Что не устраивает? Этот код выдаёт ошибку?
Ну е мае написал же
Цитата Сообщение от AnreyKazakov Посмотреть сообщение
я не могу поставить two перед one
тк класс two тоже должен вызывать объект класса one
Там с классами с этими совсем чехарда получилась
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
18.10.2012, 10:55
Если пример кода выкладываете, то он должен соответствовать тому, с которым работает. Тут телепатов нет. Где у вас в коде two работает с one?
0
Заблокирован
18.10.2012, 11:01  [ТС]
Ок, тогда вопрос, можно ли убрать ошибку в функции void seta() в классе one НЕ меняя порядок расположения классов в программе? кстате так тоже не пашет

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>
 
class one
    {
    public:
    void seta();
    int geta()
        {
        return a;   
        }
    void seta(int _a)
        {
        a=_a;   
        }
    private:
    int a;  
    };
    
class two
    {
    public:
    int getb()
        {
        return b;   
        }
    void seta(int _b)
        {
        b=_b;   
        }
    private:
    int b;  
    };  
 
int main()
    {
    one a1;
    two b2;
    return 0;   
    }       
 
void one::seta()
        {
        a=b2.getb();
        /*вот здесь ругает*/
        }
Добавлено через 58 секунд
Цитата Сообщение от alsav22 Посмотреть сообщение
Где у вас в коде two работает с one
Это только пример, было бы можно классы местами поменять я бы наверно не спрашивал
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
18.10.2012, 11:04
Цитата Сообщение от AnreyKazakov Посмотреть сообщение
Это только пример, было бы можно классы местами поменять я бы наверно не спрашивал
Ещё раз повторяю, тут телепатов нет. Ответ даётся на конкретный впрос, по конкретному коду. Перед тем как пример выкладывать, нужно подумать, соответствует ли он тому, что хотите выяснить.
1
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,868
18.10.2012, 11:06
Цитата Сообщение от AnreyKazakov Посмотреть сообщение
я не могу поставить two перед one
тк класс two тоже должен вызывать объект класса one.
вот так это делается
C++
1
2
3
4
5
6
7
8
9
class one;
class two
{
............
}
class one
{
.........
}
1
Заблокирован
18.10.2012, 11:06  [ТС]
Решил общего наследника сделать, НО, как бэ проблема не решена. С такой структурой, если в таком духе работать получится каша сплошная...
0
Заблокирован
18.10.2012, 11:15  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение
вот так это делается
ну вот сделал я
так

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>
 
class one;
class two;
 
int main()
    {
    one a1;
    two b2;
    return 0;   
    }       
 
class one
    {
    public:
    void seta()
        {
        a=b2.getb();
        }   
    int geta()
        {
        return a;   
        }
    void seta(int _a)
        {
        a=_a;   
        }
    private:
    int a;  
    };
    
class two
    {
    public:
    int getb()
        {
        return b;   
        }
    void seta(int _b)
        {
        b=_b;   
        }
    private:
    int b;  
    };

0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,868
18.10.2012, 11:25
Цитата Сообщение от AnreyKazakov Посмотреть сообщение
ну вот сделал я
сам то можешь объяснить словами что ты делаешь или хотел сделать
кто такой b2 ???
еще раз взаимное использование классов
например так
C++
1
2
3
4
5
6
7
8
9
10
11
class one;
class two
{
one * A
............
}
class one
{
.two* B
........
}
или так
C++
1
2
3
4
5
6
7
8
9
10
11
class one;
class two
{
friend class one;
............
}
class one
{
 
........
}
1
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,030
Записей в блоге: 1
18.10.2012, 11:28
Да что ж за программисты то пошли такие... Вам уже два раза написали, что нужно
C++
1
class не_объявленный_класс;
все вам нужно разжевать и в рот положить. Отделите объявление классов от определений и будет Вам счастье...
1
Заблокирован
18.10.2012, 11:35  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение
все вам нужно разжевать и в рот положить.
Блин, я понимаю, что так надо. Видел, не слепой, что здесь писали, открыл книжки, там то же самое написано, но не прет и все тут. Я же пишу
ВОТ

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>
 
class one;
class two;
 
int main()
    {
    one a1;
    two b2;
    return 0;   
    }       
 
class one
    {
    public:
    void seta()
        {
        a=b2.getb();
        }   
    int geta()
        {
        return a;   
        }
    void seta(int _a)
        {
        a=_a;   
        }
    private:
    int a;  
    };
    
class two
    {
    public:
    int getb()
        {
        return b;   
        }
    void seta(int _b)
        {
        b=_b;   
        }
    private:
    int b;  
    };
код. А он не пашет, хоть что ты делай...
Цитата Сообщение от ValeryS Посмотреть сообщение
кто такой b2 ???
объект класса two
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,868
18.10.2012, 11:47
Цитата Сообщение от AnreyKazakov Посмотреть сообщение
объект класса two
ну и где та его создал? в Main
а где используешь? в методе класса
ты хоть передай его классу-то, чтобы он знал с чем работать
а данное решение показывает на неправильную архитектуру программы, ты не понимаешь что такое класс и с чем его едят.
Впихивать классы, потому что они есть, по крайней мере глупо

и не скрывай код под тегами, если хочешь чтобы его кто нибудь прочитал
1
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,030
Записей в блоге: 1
18.10.2012, 12:08
Я же написал, отделите объявления от определений, хотя бы так:
C++
1
2
3
4
5
6
7
8
9
class two;
class one{
//объявление функций и переменных
};
class two{
//объявление функций и переменных
};
 
//ОПРЕДЕЛЕНИЕ ФУНКЦИЙ классов one  и two
Добавлено через 17 минут

Не по теме:

Впихивать классы, потому что
они есть, по крайней мере
глупо
Для обучения можно )))

1
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
18.10.2012, 12:29
Цитата Сообщение от Croessmah Посмотреть сообщение
Я же написал, отделите объявления от определений, хотя бы так:
Так правильно будет?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <iostream>
 
class two;
 
class one
{
   public:
     int geta();
     void seta(int _a);
     void seta(two& b2);
   private:
    int a;  
};
 
class one;
 
class two
{
    public:
      int getb();
      void seta(int _b);
      void seta(one &a);
    private:
      int b;  
};  
    
int one::geta()
{
    return a;   
}
 
void one::seta(int _a)
{
    a=_a;   
}
 
void one::seta(two& b2)
{
    a=b2.getb();
}   
    
int two::getb()
{
    return b;   
}
 
    void two::seta(int _b)
{
    b=_b;   
}
 
void two::seta(one &a)
{
    b=a.geta();   
}
 
int main()
{
    one a1;
    two b2;
    a1.seta(b2);
    b2.seta(a1);
    
    return 0;   
}
Добавлено через 12 минут
Другой вариант: раскидать прототипы и реализацию по разным файлам. В заголовочном с прототипами сделать: class one; class two;
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.10.2012, 12:29
Помогаю со студенческими работами здесь

Создание объекта класса с полем являющимся объектом другого класса
Bill a; cin&gt;&gt;a;//тут я ввел с помощью перегруженного оператора ElementSpiska c; //поля у Spiska(Bill A,int,string,int) ...

Ошибка компиляции (преобразование объекта класса в объект другого класса)
Друзья, добрый день! Не могу понять почему выдается ошибка компиляции... Прога преобразует доллары США в старые Британские фунты. Но...

Вспомогательный класс для сокращения кода при создании другого класса
Добрый день. Есть код: template&lt;int floor&gt; struct Collection { template&lt;typename T&gt; struct WithBath { ...

Можно ли создать класс, который виден только для другого класса?
Здравствуйте. есть 3 класса namespace MyExp { class MyTree { //... }

Создание объекта класса, который будет содержать указанное количество объектов другого класса
Здравствуйте. Я сейчас только учусь, помогите, пожалуйста. Задача такая: необходимо создать класс кораблика из игры &quot;Морской...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru