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

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

Войти
Регистрация
Восстановить пароль
 
 
Sledovatel
0 / 0 / 0
Регистрация: 13.02.2012
Сообщений: 22
#1

Объявление взаимодействующих классов - C++

06.10.2012, 21:19. Просмотров 1082. Ответов 15
Метки нет (Все метки)

Здравствуйте. Возникла проблема с объявлением классов. Вот код (суть описана в комментариях):

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
#include <iostream>
using namespace std;
 
class Word{
    public:
    int length;
    //метод увеличения длины объекта на величину другого объекта l с помощью сумматора s (передаём сумматор и другой объект)
    int sum (Summator * s, Word *l){
        //в метод сумматора передаём ссылку на сам объект и на другой объект
        s -> result(*this, Word *l);
    }
};
 
class Summator{
    public:
    //сумматор увеличивает длину первого объекта на величину длины второго объекта
    void result (Word * w1, Word * w2){
        w1 -> length += w2 -> length;
    }
}
 
int main(){
 
    //создаём два объекта класса Word
    Word * a = new Word();
    Word * b = new Word();
 
    //инициализируем длину каждого объекта
    a -> length = 1;
    b -> length = 2;
 
    //выводим значение длины a
    cout << a -> length << endl;
 
    //создаём объект сумматора
    Sum *s = new Sum();
 
    //длину объекта a с помощью сумматора s увеличиваем на длину объекта b
    a -> sum(s, b);
 
    //выводим значение длины a
    cout << a -> length;
}
Компилятор выдаёт следующие ошибки:

|8|error: 'Summator' has not been declared| (От этой ошибки, похоже, идут все остальные. Получается, классы надо объявлять "одновременно"? Как сделать правильно?)

||In member function 'int Word::sum(int*, Word*)':|
|10|error: request for member 'result' in '* s', which is of non-class type 'int'|
|10|error: expected primary-expression before '*' token|

||In function 'int main()':|
|36|error: 'Sum' was not declared in this scope|
|36|error: 's' was not declared in this scope|
|36|error: expected type-specifier before 'Sum'|
|36|error: expected ';' before 'Sum'|

Заранее большое спасибо за помощь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.10.2012, 21:19
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Объявление взаимодействующих классов (C++):

Объявление классов - C++
Только начинаю изучать С++, смотрю видеоуроки. Там показано такое объявление классов (среда разработки Microsoft Visual C++ 2010) ...

Объявление и определение классов - C++
Всем здрасти! Имеем простецкий код: class Node; class HeadNode; class TailNode; class Node { public: Node() {}

Объявление статических констант шаблонных классов - C++
Что-то я туплю - дан шаблонный класс, принимающий в качестве аргументов шаблона типы Type1 и Type2. В классе есть статическая константа...

Работа с классами. Объявление классов наследования - C++ - C++
На языке С++ разработать класс, описывающий точку на плоскости. Реализовать методы ввода и изменения параметров точки, методы ...

Предварительное объявление классов. Вызвать функцию до реализации класса - C++
Приветствую, народ. Пытаюсь реализовать структуру типа патерна &quot;Посредник&quot;. И при реализации взаимодействий возникла проблемка. ...

С++, объявление классов - C++
Здравствуйте товарищи. Возникла следующая проблема: пусть есть два класса: А и В; в классе А есть переменная типа В, в классе В есть...

15
doctor_lecter
280 / 153 / 8
Регистрация: 22.09.2012
Сообщений: 283
06.10.2012, 21:24 #2
Компилятор еще "не знает" что есть такой класс, потому что он объявлен ниже. Для этого нужно объявить этот класс выше
C++
1
2
3
4
5
class Summator;
 
class Word {
//...
};
0
Sledovatel
0 / 0 / 0
Регистрация: 13.02.2012
Сообщений: 22
06.10.2012, 21:27  [ТС] #3
Делал так. Тоже проблемы.
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>
using namespace std;
 
class Summator;
 
class Word{
    public:
    int length;
    //метод увеличения длины объекта на величину другого объекта l с помощью сумматора s (передаём сумматор и другой объект)
    int sum (Summator * s, Word *l){
        //в метод сумматора передаём ссылку на сам объект и на другой объект
        s -> result(*this, Word *l);
    }
};
 
class Summator{
    public:
    //сумматор увеличивает длину первого объекта на величину длины второго объекта
    void result (Word * w1, Word * w2){
        w1 -> length += w2 -> length;
    }
};
 
int main(){
 
    //создаём два объекта класса Word
    Word * a = new Word();
    Word * b = new Word();
 
    //инициализируем длину каждого объекта
    a -> length = 1;
    b -> length = 2;
 
    //выводим значение длины a
    cout << a -> length << endl;
 
    //создаём объект сумматора
    Sum *s = new Sum();
 
    //длину объекта a с помощью сумматора s увеличиваем на длину объекта b
    a -> sum(s, b);
 
    //выводим значение длины a
    cout << a -> length;
}
||In member function 'int Word::sum(Summator*, Word*)':|
|12|error: invalid use of incomplete type 'struct Summator'|
|4|error: forward declaration of 'struct Summator'|
|12|error: expected primary-expression before '*' token|
||In function 'int main()':|
|38|error: 'Sum' was not declared in this scope|
|38|error: 's' was not declared in this scope|
|38|error: expected type-specifier before 'Sum'|
|38|error: expected ';' before 'Sum'|
||=== Build finished: 7 errors, 0 warnings ===|
0
doctor_lecter
280 / 153 / 8
Регистрация: 22.09.2012
Сообщений: 283
06.10.2012, 21:35 #4
C++
1
s->sum(this, l);
первый параметр указатель на Word, а *this это конкретный объект, а this - указатель.
0
Sledovatel
0 / 0 / 0
Регистрация: 13.02.2012
Сообщений: 22
06.10.2012, 21:39  [ТС] #5
Это в какой строке? В 12? Если заменить *this на this, ошибки не уйдут.
0
doctor_lecter
280 / 153 / 8
Регистрация: 22.09.2012
Сообщений: 283
06.10.2012, 21:40 #6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Summator;
 
class Word {
// код
int sum (Summator * s, Word *l){
        //в метод сумматора передаём ссылку на сам объект и на другой объект
        s -> result(this, l);
        //еще этот метод должен что-то возвращать
    }
//
};
 
void Summator::result(Word * w1, Word * w2){
        w1 -> length += w2 -> length;
    }
и метод sum должен возвращать значение
0
Sledovatel
0 / 0 / 0
Регистрация: 13.02.2012
Сообщений: 22
06.10.2012, 21:57  [ТС] #7
Метод int sum переделал в int void, чтобы он не возвращал ничего.
void Summator::result - его так и писать наряду с объявлением классов? Так вроде бы ещё больше ошибок получается.
0
doctor_lecter
280 / 153 / 8
Регистрация: 22.09.2012
Сообщений: 283
06.10.2012, 22:01 #8
Да, так и писать
0
Sledovatel
0 / 0 / 0
Регистрация: 13.02.2012
Сообщений: 22
06.10.2012, 22:15  [ТС] #9
А в самом классе Summator оставлять определение этого метода?

Добавлено через 11 минут
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
#include <iostream>
using namespace std;
 
class Summator;
 
class Word{
    public:
    int length;
    //метод увеличения длины объекта на величину другого объекта l с помощью сумматора s (передаём сумматор и другой объект)
    void sum (Summator * s, Word *l){
        //в метод сумматора передаём ссылку на сам объект и на другой объект
        s -> result(this, l);
    }
};
 
class Summator{
    public:
    //сумматор увеличивает длину первого объекта на величину длины второго объекта
    void result (Word * w1, Word * w2);
};
 
void Summator::result(Word * w1, Word * w2){
    w1 -> length += w2 -> length;
}
 
int main(){
 
    //создаём два объекта класса Word
    Word * a = new Word();
    Word * b = new Word();
 
    //инициализируем длину каждого объекта
    a -> length = 1;
    b -> length = 2;
 
    //выводим значение длины a
    cout << a -> length << endl;
 
    //создаём объект сумматора
    Summator *s = new Summator();
 
    //длину объекта a с помощью сумматора s увеличиваем на длину объекта b
    a -> sum(s, b);
 
    //выводим значение длины a
    cout << a -> length;
}
||In member function 'void Word::sum(Summator*, Word*)':|
|12|error: invalid use of incomplete type 'struct Summator'|
|4|error: forward declaration of 'struct Summator'|

Всё-таки есть проблема с объявлением сумматора и с типами данных, которые передаём в sum.
0
doctor_lecter
280 / 153 / 8
Регистрация: 22.09.2012
Сообщений: 283
06.10.2012, 22:25 #10
так должно работать
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Word;
class Summator{
    public:
    //сумматор увеличивает длину первого объекта на величину длины второго объекта
    void result (Word * w1, Word * w2);
};
 
class Word{
    public:
    int length;
    //метод увеличения длины объекта на величину другого объекта l с помощью сумматора s (передаём сумматор и другой объект)
    void sum (Summator * s, Word *l){
        //в метод сумматора передаём ссылку на сам объект и на другой объект
        s -> result(this, l);
    }
};
 
void Summator::result(Word * w1, Word * w2){
    w1 -> length += w2 -> length;
}
1
tihonya
11 / 7 / 1
Регистрация: 30.05.2012
Сообщений: 107
06.10.2012, 22:27 #11
А на*** здесь тот сумматор?
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 Summator;
#include <iostream>
using namespace std;
class Word{
    public:
    int length;
    //метод увеличения длины объекта на величину другого объекта l с помощью сумматора s (передаём сумматор и другой объект)
 
  Word* operator + (Word l){
      Word *R = new Word();
      R->length =this->length+l.length;
      return R;
  }
 
};
 
int main(){
 
    //создаём два объекта класса Word
    Word * a = new Word();
    Word * b = new Word();
 
    //инициализируем длину каждого объекта
    a -> length = 1;
    b -> length = 2;
 
    //выводим значение длины a
    cout << a -> length << endl;
    // Складываем
    a= *a+*b ;
  
    //выводим значение длины a
    cout << a -> length;
}
Вот код складывает два объекта Word..
0
Sledovatel
0 / 0 / 0
Регистрация: 13.02.2012
Сообщений: 22
06.10.2012, 22:32  [ТС] #12
Да, действительно. Так работает.
Теперь остаётся понять, почему такой вариант работает, а предыдущий - с объявлением Summator'a - нет.

Добавлено через 1 минуту
Цитата Сообщение от tihonya Посмотреть сообщение
А на*** здесь тот сумматор?
Мой пример - искусственный, для того чтобы разобраться в объявлении взаимодействующих классов. Но спасибо за пример перегрузки оператора.

Добавлено через 2 минуты
doctor_lecter, такой вариант проходит, а другой нет, потому что Summator не использует методы Word'a? А если бы это было не так, и сумматору приходилось бы запрашивать методы Word'a?
0
doctor_lecter
280 / 153 / 8
Регистрация: 22.09.2012
Сообщений: 283
06.10.2012, 22:40 #13
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
#include <iostream>
using namespace std;
 
class A;
class B;
 
class A {
public:
    int a;
    int mA(B* b);
};
 
class B {
public:
    int b;
    int mB(A* a);
};
 
int A::mA(B* b) {
    return b->b;
}
 
int B::mB(A* a) {
    return a->a;
}
 
int main() {
    A a;
    B b;
    a.a = 1;
    b.b = 2;
    cout << a.mA(&b) << endl
        << b.mB(&a) << endl;
    return 0;
}
Пример когда классы используют методы и ссылки друг на друга.

Тут в начале можно не объявлять class A;
1
Sledovatel
0 / 0 / 0
Регистрация: 13.02.2012
Сообщений: 22
06.10.2012, 22:54  [ТС] #14
Все методы одного класса, вызываемые объектом другого класса, должны быть обязательно определены вне класса?
0
doctor_lecter
280 / 153 / 8
Регистрация: 22.09.2012
Сообщений: 283
06.10.2012, 22:55 #15
Хотя пример получился такой же как и у вас, Summator методы Word не вызывает, но обращается к его свойствам.
0
06.10.2012, 22:55
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.10.2012, 22:55
Привет! Вот еще темы с ответами:

Переплетение классов: объявление и инициализация - C++
вощм... пишу программу... есть у меня например 2 класса: Object (объект) и tck (точка) мне необходимо сделать так чтобы в объекте...

Разработать иерархию классов, демонстрирующее работу с коллекцией объектов разных классов - C++
Задание: Разработать в соответствии с индивидуальным заданием иерархию классов и приложение, демонстрирующее работу с коллекцией объектов...

Вынести методы из классов Panel и PictureBox (явная реализация методов базовых абстрактных классов) - C++
Тема: Множественное наследование. Явная реализация методов базовых абстрактных классов. Как вынести методы из классов Panel и...

Реализация отношения классов типа двунаправленная ассоциация, UML, порядок объявления классов, неполный класс - C++
Доброго времени суток! Осваивая UML, решил реализовать отношение двунаправленной ассоциации по диаграмме: У одного владельца...


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

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

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