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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
Azazzelo
 Аватар для Azazzelo
4 / 4 / 1
Регистрация: 14.11.2010
Сообщений: 31
03.01.2012, 22:38     Один класс не видит другой #1
Есть 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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
NoMasters
Псевдослучайный
1737 / 1080 / 69
Регистрация: 13.09.2011
Сообщений: 3,093
03.01.2012, 23:06     Один класс не видит другой #2
Разделить объявление и реализацию, не?
Roof
 Аватар для 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
 Аватар для 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     Один класс не видит другой
Ответ Создать тему
Опции темы

Текущее время: 11:44. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru