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

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

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

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

22.05.2012, 20:02. Просмотров 452. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Функция друг (C++):

функция - друг - C++
Вообщем набиваю руку по конструкторам ,деструкторам и функциям - друзьям... Вот придумал условие: Нужно найти сумму элементов в тех...

функция друг, перегрузка << - C++
Доброго времени суток, Господа! Имеется следующий код: class Time { private: int hours; int minutes;...

Функция друг принимает три аргумента - C++
Когда функция друг принимает два аргумента, проблем нет, как только появляется третий, &quot;Error: отсутствуют экземпляры перегруженная функция...

Функция-друг не видит члены класса private - C++
#include &lt;iostream&gt; using namespace std; class Phone{ friend ostream &amp; operator&lt;&lt;(ostream&amp;,const Phone&amp;); private: int number; ...

Функция-друг одно класса, член другого. - C++
Привет. Не поможете как сделать чтобы функция одного класса была функцией-другом другого класса? я сделал так: Класс snake: ...

Функция, возвращающая х случайных, не равных друг другу, чисел из диапазона от y до z - C++
Нужна функция желательно на разных языках (С, С++, perl, php) которая бы возвращала х случайных не равных друг другу чисел из диапазона...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Nick Alte
Эксперт С++
1636 / 1008 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 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
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
01.06.2012, 16:35 #5
строка 132
C++
1
cout<<sum(p,n);
переменная n не инициализирована.
учитесь пользоваться дебагером.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.06.2012, 16:35
Привет! Вот еще темы с ответами:

Функция удаления текста в скобках [2], непосредственно функция + 12кб вложений - C++
Доброго времени суток, случилось так, что пришлось работать с с-строками (лаба, угу), в которой нужно удалить весь текст в скобках,...

Функция sqrt: существует более одного экземпляра. Функция перегруженная - C++
#include &lt;iostream&gt; #include &lt;math.h&gt; #include &lt;iomanip&gt; using namespace std; int main(){ float s, p; int c, a; s=0; ...

Перегрузка операций: friend-функция или функция-член класса - C++
Здравствуйте, меня интересует вопрос, в чем разница при перегрузке операторов через operator и friend. Вот к примеру такой код. class...

какую библиотеку надо подключать чтоб работала функция _getch() и функция cin.get() - C++
какую библиотеку надо подключать чтоб работала функция _getch() и функция cin.get()


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

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

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