Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
AnreyKazakov
Заблокирован
#1

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

18.10.2012, 03:59. Просмотров 1160. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.10.2012, 03:59
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Возможен ли класс для обработки объекта другого класса? (C++):

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

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

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

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

Объявление объекта одного класса в описании другого класса - C++
Здравствуйте. Почему при объявлении Student s в классе Teacher не возникает ошибки? Ведь такой объект уже существует. И почему при...

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

29
Croessmah
Ушел
Эксперт CЭксперт С++
13554 / 7705 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
18.10.2012, 11:28 #16
Да что ж за программисты то пошли такие... Вам уже два раза написали, что нужно
C++
1
class не_объявленный_класс;
все вам нужно разжевать и в рот положить. Отделите объявление классов от определений и будет Вам счастье...
1
AnreyKazakov
Заблокирован
18.10.2012, 11:35  [ТС] #17
Цитата Сообщение от 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
ValeryS
Модератор
6709 / 5118 / 482
Регистрация: 14.02.2011
Сообщений: 17,213
18.10.2012, 11:47 #18
Цитата Сообщение от AnreyKazakov Посмотреть сообщение
объект класса two
ну и где та его создал? в Main
а где используешь? в методе класса
ты хоть передай его классу-то, чтобы он знал с чем работать
а данное решение показывает на неправильную архитектуру программы, ты не понимаешь что такое класс и с чем его едят.
Впихивать классы, потому что они есть, по крайней мере глупо

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

Не по теме:

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

1
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
18.10.2012, 12:29 #20
Цитата Сообщение от 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
m1Rr0r
247 / 230 / 15
Регистрация: 05.02.2010
Сообщений: 3,262
Завершенные тесты: 2
18.10.2012, 12:30 #21
Цитата Сообщение от AnreyKazakov Посмотреть сообщение
a=b2.getb();
Что это ? Может это объект класса two ? Тогда где он объявлен ? - В main... хД
alsav22, Запостил хороший выход из ситуации.
0
Croessmah
Ушел
Эксперт CЭксперт С++
13554 / 7705 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
18.10.2012, 12:39 #22
вы не понимаете разницу между объявлением функции и ее определением?

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
class two;
class one{ 
private:
     int a;
public:
     void seta(int);
     void seta(&b);
     int geta();
};
 
class two{
private:
     int b;
public:
     void setb(int);
     int getb();
};
 
void one::seta(int _a){
     a=_a;
}
void one::seta(two &b){
     a=b.getb();
}
int one::geta(){
     return a;
}
 
void two::setb(int _b){
     b=_b;
}
int two::getb(){
      return b;
}
Как-то так. Пишу с телефона, так что не проверял.
1
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
18.10.2012, 12:48 #23
Цитата Сообщение от Croessmah Посмотреть сообщение
вы не понимаете разницу между объявлением функции и ее определением?
Это кому вопрос?

Добавлено через 3 минуты
Цитата Сообщение от m1Rr0r Посмотреть сообщение
alsav22, Запостил хороший выход из ситуации.
Это не я. Просто написал, что предложил Croessmah в 19 посте. Я нашёл решение, чтобы прототипы и реализацию по файлам раскидать. Решение проблемы, насколько я понял, в том, что при предварительной декларации классов, реализации методов нужно располагать вне тела класса.
1
Croessmah
Ушел
Эксперт CЭксперт С++
13554 / 7705 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
18.10.2012, 12:51 #24
Это кому вопрос?
автору темы. Я ему два раза написал, а он все равно упорно пишет определения методов прямо в объявлении класса. Так и пришлось сенсор насиловать =)
1
AnreyKazakov
Заблокирован
18.10.2012, 13:02  [ТС] #25
Цитата Сообщение от alsav22 Посмотреть сообщение
Так правильно будет?
Во, от души, делал уже то же самое, но запутался и отложил было до лучших времен.... спасиб, щас только под свою задачу подправлю (уж надеюсь )

Добавлено через 1 минуту
Цитата Сообщение от Croessmah Посмотреть сообщение
Так и пришлось сенсор насиловать =)
нзато дошло =)
0
Croessmah
Ушел
Эксперт CЭксперт С++
13554 / 7705 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
18.10.2012, 13:14 #26
что при
предварительной декларации
классов, реализации методов
нужно располагать вне тела
класса.
Само собой, ведь инструкцией
C++
1
class two;
мы только даем понять, что такой класс существует. Но про его методы и переменные компилятору ничего не известно. Поэтому функции, где используются эти методы необходимо выносить.
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
18.10.2012, 13:27 #27
Цитата Сообщение от Croessmah Посмотреть сообщение
мы только даем понять, что такой класс существует. Но про его методы и переменные компилятору ничего не известно
Почему сам не посмотрит в объявлении класса, ведь он уже знает, что класс существует?

И ещё, AnreyKazakov, выносить, в данном случае, можно реализации только тех методов, для которых необходима предварительная декларация класса. Остальные можно оставить в теле класса.
0
AnreyKazakov
Заблокирован
18.10.2012, 13:38  [ТС] #28
Цитата Сообщение от alsav22 Посмотреть сообщение
AnreyKazakov, выносить, в данном случае, можно реализации только тех методов, для которых необходима предварительная декларация класса.
Я уж понял, моя ошибка была в том, что я либо выносил методы эти из класса, либо определял классы (ну сверху писал их названия, надеюсь прально сказал). Но чет не додумывался совместить...
0
Croessmah
Ушел
Эксперт CЭксперт С++
13554 / 7705 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
18.10.2012, 16:42 #29
Цитата Сообщение от alsav22 Посмотреть сообщение
И ещё, AnreyKazakov, выносить, в данном случае, можно реализации только тех методов, для которых необходима предварительная декларация класса. Остальные можно оставить в теле класса.
Но лучше выносить все. Класс - cpp и h фаил
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
18.10.2012, 17:40 #30
Цитата Сообщение от Croessmah Посмотреть сообщение
Но лучше выносить все. Класс - cpp и h фаил
Согласен. Мне кажется, это лучшее решение.
0
18.10.2012, 17:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.10.2012, 17:40
Привет! Вот еще темы с ответами:

Объявление в классе объекта другого класса - C++
какая-то фигня получается, допустим есть 2 класса - class1 и class2, в хедерах class1.h подключён class2.h, а в class2.h подключён...

Передача данных объекта одного класса , объекту другого - C++
Доброго времени суток. В общем, столкнулся с проблемой передачи данных от одного класса другому. Есть класс NewApp, создаю объект с...

Спрятать указатель на функцию класса в map и вызвать из другого объекта - C++
Товарищи, пишу примитивный &quot;tcp-сервер&quot;. В его задачи входит принятие соединений и получение сообщений. В зависимости от сообщения &quot;сервер&quot;...

Обрыв функции при вызове метода из объекта другого класса - C++
Почему выполнение функция обрывается на вызове метода из объекта другого класса? DataBuffer.cpp //Получаем класс FirstDlg void...


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru