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

Функция друг - C++

Восстановить пароль Регистрация
 
Lewis_Husk
 Аватар для Lewis_Husk
0 / 0 / 0
Регистрация: 28.03.2012
Сообщений: 13
22.05.2012, 20:02     Функция друг #1
Здравствуйте. У меня проблемы с преобразованием типов для функции друг(а может и не сними) компилятор говорит: request for member `getname' in `*((+(((unsigned int)i) * 4u)) + array)', which is of non-class type `Detail*' . Я пытался наобум изменять значения типов и прочие радости, но ничего данным шаманством не получилось сделать. Прощу вас, объяснить, где же я простреливаю себе ногу?
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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#include <iostream>
#include <cstring>
using namespace std;
 
//Basic class Detail
class Detail
{
public:
    Detail(const char* name, int firm);
    virtual ~Detail() {}
    virtual void Display();                     //view data for party of detail
    friend int sum(Detail* array,int n);            //all number of details for name of detail
    const char* getname();
 
protected:
    char name[80];//name of detail
    int firm;     //digit of workshop
};
 
Detail::Detail(const char* _name, int _firm) : firm(_firm)
{
    strncpy(name, _name, 80);
}
 
const char* Detail::getname() { return name; };
 
void Detail::Display()
{
    cout << "Detail, name is - " << name << endl;
    cout << "Firm is - "         << firm << endl;
}
 
//Child of Detail Detail1
class Detail1 : public  Detail
{
public:
    Detail1(const char*, int, bool);
    ~Detail1(){};
    void Display();//view data for party of detail
    friend int sum(Detail** array,int n);
 
private:
    bool coating;
};
 
Detail1::Detail1(const char* _name, int firm, bool _coating) : Detail(_name, firm), coating(_coating)
{
    strncpy(name, _name, 80);
}
 
void Detail1::Display()
{
    cout << "Detail1, name is -"<< name         << endl;
    cout << "Firm is -"         << firm         << endl;
    cout << "Coated is  -"      << coating      << endl;
}
 
//Child of Detail Detail2
class Detail2 : public  Detail
{
public:
    Detail2(const char*, int, float);
    ~Detail2(){}
    void Display();
    friend int sum(Detail** array,int n);
 
private:
    float resist; //digit of detail2 resist
};
 
Detail2::Detail2(const char* _name, int _firm, float _resist) : Detail(_name, firm), resist(_resist)
{
    strncpy(name, _name, 80);
}
 
void Detail2::Display()
{
    cout << "Detail2, name is - " << name   << endl;
    cout << "Firm is - "          << firm   << endl;
    cout << "Resistance - "       << resist << endl;
}
 
int sum(Detail** array,int n)
{
    char name[80];
    int k=0;
        cout << "Input name: "; cin>>name;
    for(int i=0; i<n; i++)
        if(strcmp(array[i].getname(),name)==0)
                        {k++;}
            cout<<k;
}
 
int main()
{
    int nMenu, flag = 1, N;
    int i = 0; //The new
    int n;
    Detail* p[100];
    cout <<"\nNumbers of details: ";    cin >> N;
    while(i < N && flag)
    {
        //Menu
        cout << "\nNew detail. Enter: " << endl; 
        cout << "1-for detail,2-detail1,3-detail2,4 - sum, 5 - exit\n"; 
        cin >> nMenu;
        string name; int firm; bool coating; float resist;
        if(nMenu > 0 && nMenu < 4)
        {
            cout << "Name?(char) "; cin >> name; cout << endl;
            cout << "Firm?(digit) "; cin >> firm; cout << endl;
        }
        switch (nMenu)
        {
            case 1 :
                p[i++] = new Detail(name.c_str(), firm);
                break;
 
            case 2 :
                cout << "Coated?(1-yes, 0-no) "; cin >> coating; cout << endl;
                p[i++] = new Detail1(name.c_str(), firm, coating);
                break;
 
            case 3 :
                cout << "Resistance? "; cin >> resist; cout << endl;
                p[i++] = new Detail2(name.c_str(), firm, resist);
                break;
            case 4:
                cout << "Sum! - "; cout<<sum(p,n);      
            default : flag = 0; break;
        }
    }
    for (int id = 0; id < N; id++)
    {
        p[id]->Display();
        delete p[id];
    }
    cin.get();
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nick Alte
Эксперт С++
1591 / 983 / 116
Регистрация: 27.09.2009
Сообщений: 1,898
Завершенные тесты: 1
22.05.2012, 20:24     Функция друг #2
Не вдаваясь в прочие детали, сразу замечу: надо было написать array[i]->getname(); вместо array[i].getname()
"Простреливание ноги" - метафора, относящаяся к ошибкам времени выполнения, а не времени компиляции.
Lewis_Husk
 Аватар для Lewis_Husk
0 / 0 / 0
Регистрация: 28.03.2012
Сообщений: 13
27.05.2012, 19:28  [ТС]     Функция друг #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
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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#include <iostream>
#include <cstring>
using namespace std;
 
//Basic class Detail
class Detail
{
public:
    Detail(const char* name, int firm);
    virtual ~Detail() {}
    virtual void Display();                     //view data for party of detail
    [COLOR="Lime"]friend int sum(Detail* array,int n);          //all number of details for name of detail
    const char* getname();[/COLOR]
 
protected:
    char name[80];//name of detail
    int firm;     //digit of workshop
};
 
Detail::Detail(const char* _name, int _firm) : firm(_firm)
{
    strncpy(name, _name, 80);
}
 
const char* Detail::getname() { return name; };
 
void Detail::Display()
{
    cout << "Detail, name is - " << name << endl;
    cout << "Firm is - "         << firm << endl;
}
 
//Child of Detail Detail1
class Detail1 : public  Detail
{
public:
    Detail1(const char*, int, bool);
    ~Detail1(){};
    void Display();//view data for party of detail
    friend int sum(Detail** array,int n);
 
private:
    bool coating;
};
 
Detail1::Detail1(const char* _name, int firm, bool _coating) : Detail(_name, firm), coating(_coating)
{
    strncpy(name, _name, 80);
}
 
void Detail1::Display()
{
    cout << "Detail1, name is -"<< name         << endl;
    cout << "Firm is -"      << firm        << endl;
    cout << "Coated is  -"      << coating      << endl;
}
 
//Child of Detail Detail2
class Detail2 : public  Detail
{
public:
    Detail2(const char*, int, float);
    ~Detail2(){}
    void Display();
    friend int sum(Detail** array,int n);
 
private:
    float resist; //digit of detail2 resist
};
 
Detail2::Detail2(const char* _name, int _firm, float _resist) : Detail(_name, firm), resist(_resist)
{
    strncpy(name, _name, 80);
}
 
void Detail2::Display()
{
    cout << "Detail2, name is - " << name   << endl;
    cout << "Firm is - "          << firm   << endl;
    cout << "Resistance - "       << resist << endl;
}
 
int sum(Detail** array,int n)
{
    char name[80];
    int k=0;
        cout << "Input name: "; cin>>name;
    for(int i=0; i<n; i++)
       if(strcmp(array[i]->getname(),name)==0)
            {k++;}      
            cout<<k;
            return 0;
}
 
int main()
{
    int nMenu, flag = 1, N;
    int i = 0; //The new
    int n;
    Detail* p[100];
    cout <<"\nNumbers of details: ";    cin >> N;
    while(i < N && flag)
    {
        //Menu
        cout << "\nNew detail. Enter: " << endl; 
        cout << "1-for detail,2-detail1,3-detail2, 4- sum 0 - exit\n"; 
        cin >> nMenu;
        string name; int firm; bool coating; float resist;
        if(nMenu > 0 && nMenu < 4)
        {
            cout << "Name?(char) "; cin >> name; cout << endl;
            cout << "Firm?(digit) "; cin >> firm; cout << endl;
        }
        switch (nMenu)
        {
            case 1 :
                p[i++] = new Detail(name.c_str(), firm);
                break;
 
            case 2 :
                cout << "Coated?(1-yes, 0-no) "; cin >> coating; cout << endl;
                p[i++] = new Detail1(name.c_str(), firm, coating);
                break;
 
            case 3 :
                cout << "Resistance? "; cin >> resist; cout << endl;
                p[i++] = new Detail2(name.c_str(), firm, resist);
                break;
            default : flag = 0; break;
        }
    }
    cout<<sum(p,n);
    for (int id = 0; id < N; id++)
    {
        p[id]->Display();
        delete p[id];
    }
    cin.get();
}
Миниатюры
Функция друг  
Lewis_Husk
 Аватар для Lewis_Husk
0 / 0 / 0
Регистрация: 28.03.2012
Сообщений: 13
01.06.2012, 16:21  [ТС]     Функция друг #4
Bump. Ниасиливаю.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
01.06.2012, 16:35     Функция друг #5
строка 132
C++
1
cout<<sum(p,n);
переменная n не инициализирована.
учитесь пользоваться дебагером.
Yandex
Объявления
01.06.2012, 16:35     Функция друг
Ответ Создать тему
Опции темы

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