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

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

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

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

03.01.2012, 22:38. Просмотров 1441. Ответов 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;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.01.2012, 22:38
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Один класс не видит другой (C++):

Область видимости. один класс не видит другой класс - C++
Добрый день! такая проблема. Есть базовый класс Q. От него наследуется 2 класса Р и G. Класс P имеет два конструктора 1 принимает...

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

Один класс не видит другой. Преобразование класса - C++
Всем доброго времени суток. В общем вот есть такой код: #include &lt;cmath&gt; using namespace std; class Decart; class Polar { ...

Дан массив из 10 элементов.Перенести в один другой массив четные числа.Затем перенести в еще один другой масси - C++
Дан массив из 10 элементов.Перенести в один другой массив четные числа.Затем перенести в еще один другой массив нечетные числа.Помогите с...

Описать абстрактный класс породить от него еще два,один должен остаться абстрактным,другой должен быть способен пораждать объекты - C++
Знает кто как сделать?

Если елементы массива соседние одинаковы то один из них заменяется на 0 а другой увеличиваетмя на один - C++
#include &quot;stdafx.h&quot; #include&lt;string&gt; #include &lt;cmath&gt; #include &lt;iostream&gt; #include&lt;locale&gt; using namespace std; const int...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
NoMasters
Псевдослучайный
1754 / 1097 / 72
Регистрация: 13.09.2011
Сообщений: 3,134
03.01.2012, 23:06 #2
Разделить объявление и реализацию, не?
1
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
1
Azazzelo
4 / 4 / 1
Регистрация: 14.11.2010
Сообщений: 31
04.01.2012, 00:14  [ТС] #4
Roof, благодарю за столь быстрый и полезный ответ.
Обещаю, что буду в дальнейшем стараться писать лучше)
П.С.
Я пробовал до этого разделять их по разным файлам, но тогда я получал ошибку " глубина рекурсии при вызове заголовочных фалов" (не дословно так, но смысл сохранился). После я добавил
C++
1
#pragma once
, но тогда классы перестали друг друга видеть. Сейчас я понял в чем была ошибка(в руках)
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.01.2012, 00:14
Привет! Вот еще темы с ответами:

Перенести в один другой массив четные числа.Затем перенести в еще один другой массив нечетные числа. - C++
Дан массив из 10 элементов.Перенести в один другой массив четные числа.Затем перенести в еще один другой массив нечетные числа.Помогите с...

Класс создающий другой класс (ошибка) - C++
Начал писать прогу, суть в том, что один класс должен создавать группу объектов другого класса, написал один класс - работало, а во втором...

Не видит класс итераторов - C++
Предметная область: Множество натуральных чисел, Реализованное через Хеш таблицы С цепочками. В классе &quot;myhash&quot; не воспринимается...

Почему не видит класс - C++
Уже второй день немогу понять в чем проблема Exception.hpp #include &quot;IThrowable.hpp&quot; #include &quot;../../Object.hpp&quot; #include...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
04.01.2012, 00:14
Ответ Создать тему
Опции темы

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