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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
Azazzelo
4 / 4 / 1
Регистрация: 14.11.2010
Сообщений: 31
#1

Один класс не видит другой - C++

03.01.2012, 22:38. Просмотров 1385. Ответов 3
Метки нет (Все метки)

Есть 2 класса, унаследованные от общего родителя. Один из классов-потомков не видит второй, объявленный ниже.
Попытки обвиться его заранее в виде class girl и использовать в сlass man контейнер girl *g не принесли результата.
Собственно проблема в функции void reaction(girl& g) класса man.
Как заставить их видеть друг друга?Как передать объект класса в параметре функции?

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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include <iostream>
#include <iostream>
using namespace std;
 
class human
{
public:
    virtual void reaction()
    {cout << "No one cares";};
};
 
class man : public human
{public:
    int age;
    float k;
    char *name;
    man(int a,char *n)
    {
     name = new char[20];
    strcpy(name,n);
     age =a;
     k= rand()% 10;
    };
    ~man()
    {
    delete[] name;
    age=0;
    k=0;    
    };
    man(man& m)
    {
    m.name = new char[20];
    strcpy(m.name, name);
    m.age=age;
    m.k=k;
    };
    void reaction(girl& g)
    {
    if (g.k <=4) cout << "r1" << endl;
    else if (g.k >4 || g.k <=7) cout << "r2" << endl;
    else cout << "r3" << endl;
    };
};
 
class girl : public human
{public:
    int age;
    float k;
    char *name;
    girl(int a,char *n)
    {
     name = new char[20];
     strcpy(name,n);
     age =a;
     k= rand()% 10;
    };
    ~girl()
    {
    delete[] name;
    age=0;
    k=0;
    };
    girl(girl& g)
    {
    g.name = new char[20];
    strcpy(g.name, name);
    g.age=age;
    g.k=k;
    };
    void reaction(man& m)
    {
    
        if (m.k<4) cout << "r1" << endl;
        else if (m.k>5 || m.k<= 8) cout << "r2" << endl;
        else cout << "r3" << endl;
    };
};
 
 
int main()
{   
    girl a(18,"masha");
    man b(19, "alex");
    a.reaction(b);
    b.reaction(a);
 
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.01.2012, 22:38     Один класс не видит другой
Посмотрите здесь:
C++ Область видимости. один класс не видит другой класс
C++ Один класс не видит другой. Преобразование класса
C++ Дан массив из 10 элементов.Перенести в один другой массив четные числа.Затем перенести в еще один другой масси
Описать абстрактный класс породить от него еще два,один должен остаться абстрактным,другой должен быть способен пораждать объекты C++
C++ Если елементы массива соседние одинаковы то один из них заменяется на 0 а другой увеличиваетмя на один
C++ Перенести в один другой массив четные числа.Затем перенести в еще один другой массив нечетные числа.
Класс создающий другой класс (ошибка) C++
C++ Не видит класс итераторов
Почему не видит класс C++
Преобразование типов. Не конструктор не видит класс C++
Скопировать один файл в другой C++
C++ Производный класс не видит перегруженную операцию базового класса

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
NoMasters
Псевдослучайный
1744 / 1087 / 71
Регистрация: 13.09.2011
Сообщений: 3,115
03.01.2012, 23:06     Один класс не видит другой #2
Разделить объявление и реализацию, не?
Roof
154 / 154 / 10
Регистрация: 03.11.2010
Сообщений: 393
04.01.2012, 00:08     Один класс не видит другой #3
2 Azazzelo.
Ваш код мне хоть и не нравится ( ведь удобнее разделять объявление и определение, да еще и в файлы заголовков и файлы исходников ), но я постарался только минимальные изменения в него внести, сохранив Ваш стиль.
Есть такой прием - предварительное объявление. Предварительно объявив мы получаем незавершенный тип.

По коду.
Комментарий 1.
Использование незавершенного типа весьма ограничено. Мы тут еще не можем использовать объект типа girl, так как объекты такого типа не могут быть определены.
Незавершенный тип можно использовать только для определения указателей или ссылок, а также для объявления ( но не для определения ) функций, которые используют этот тип как параметр или возвращаемое значение.

Комментарий 2.
А вот в определении функции, вынесенным за пределы тела класса мы уже можем вполне использовать объект типа girl, так как к этому моменту класс girl уже завершен.

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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;
 
class human
{
public:
        virtual void reaction()
        {cout << "No one cares";};
};
 
class girl;
 
class man : public human
{public:
        int age;
        float k;
        char *name;
        man(int a,char *n)
        {
     name = new char[20];
        strcpy(name,n);
         age =a;
         k= rand()% 10;
        };
        ~man()
        {
        delete[] name;
        age=0;
        k=0;
        };
        man(man& m)
        {
        m.name = new char[20];
        strcpy(m.name, name);
        m.age=age;
        m.k=k;
        };
        
        // 1
        void reaction(girl& g);/* 
        {
        if (g.k <=4) cout << "r1" << endl;
        else if (g.k >4 || g.k <=7) cout << "r2" << endl;
        else cout << "r3" << endl;
        };*/
};
 
class girl : public human
{public:
        int age;
        float k;
        char* name;
        girl(int a,char *n)
        {
         name = new char[20];
         strcpy(name,n);
         age =a;
         k= rand()% 10;
        };
        ~girl()
        {
        delete[] name;
        age=0;
        k=0;
        };
    girl(girl& g)
        {
        g.name = new char[20];
        strcpy(g.name, name);
        g.age=age;
        g.k=k;
        };
        void reaction(man& m)
        {
 
                if (m.k<4) cout << "r1" << endl;
                else if (m.k>5 || m.k<= 8) cout << "r2" << endl;
                else cout << "r3" << endl;
        };
};
// 2
void man::reaction( girl& g){
    if (g.k <=4) cout << "r1" << endl;
    else if (g.k >4 || g.k <=7) cout << "r2" << endl;
    else cout << "r3" << endl;
}
 
int main()
{
    char name1[20] = "masha";
    char name2[20] = "alex";
        girl a(18, name1);
        man b(19, name2);
 
        a.reaction(b);
        b.reaction(a);
 
        return 0;
}
И обратите внимание на предупреждение компилятора для классов.
Код
Class '[C@946049' has virtual method 'reaction' but non-virtual destructor
Azazzelo
4 / 4 / 1
Регистрация: 14.11.2010
Сообщений: 31
04.01.2012, 00:14  [ТС]     Один класс не видит другой #4
Roof, благодарю за столь быстрый и полезный ответ.
Обещаю, что буду в дальнейшем стараться писать лучше)
П.С.
Я пробовал до этого разделять их по разным файлам, но тогда я получал ошибку " глубина рекурсии при вызове заголовочных фалов" (не дословно так, но смысл сохранился). После я добавил
C++
1
#pragma once
, но тогда классы перестали друг друга видеть. Сейчас я понял в чем была ошибка(в руках)
Yandex
Объявления
04.01.2012, 00:14     Один класс не видит другой
Ответ Создать тему
Опции темы

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