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

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

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

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

22.05.2012, 20:02. Просмотров 443. Ответов 4
Метки нет (Все метки)

Здравствуйте. У меня проблемы с преобразованием типов для функции друг(а может и не сними) компилятор говорит: 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();
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.05.2012, 20:02     Функция друг
Посмотрите здесь:

Функция, возвращающая х случайных, не равных друг другу, чисел из диапазона от y до z C++
C++ Функция-друг одно класса, член другого.
C++ Ребус друг гурд
C++ друг функции
C++ функция - друг
C++ функция друг, перегрузка <<
объявления друг в друге C++
C++ Класс-друг
Класс - друг C++
Друг шаблона C++
C++ Функция-друг не видит члены класса private
C++ Функция друг принимает три аргумента

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nick Alte
Эксперт С++
1605 / 997 / 118
Регистрация: 27.09.2009
Сообщений: 1,923
Завершенные тесты: 1
22.05.2012, 20:24     Функция друг #2
Не вдаваясь в прочие детали, сразу замечу: надо было написать array[i]->getname(); вместо array[i].getname()
"Простреливание ноги" - метафора, относящаяся к ошибкам времени выполнения, а не времени компиляции.
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
0 / 0 / 0
Регистрация: 28.03.2012
Сообщений: 13
01.06.2012, 16:21  [ТС]     Функция друг #4
Bump. Ниасиливаю.
DU
1480 / 1056 / 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     Функция друг
Ответ Создать тему
Опции темы

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