Из-за чего возникает ошибка: "Выражение должно иметь тип класса"?
#include <iostream>
#include <string>
using namespace std;
struct Date {
int year;
int month;
int day;
};
class Cooperator {
protected:
string name;
Date birthday;
public:
Cooperator()
{
name = "noname";
}
Cooperator(string n, Date& d)
{
name = n;
birthday.year = d.year;
birthday.month = d.month;
birthday.day = d.day;
}
Date getDate()
{
return birthday;
}
string getName()
{
return name;
}
void setDate(int y, int m, int d)
{
birthday.year = y;
birthday.month = m;
birthday.day = d;
}
void setName(string n)
{
name = n;
}
friend ostream& operator<<(ostream& out, Cooperator& d)
{
out << d.name << " is name, " << d.birthday.year << " is date";
return out;
};
};
class Brigadier : public Cooperator {
int workers;
public:
Brigadier() : Cooperator()
{
workers = 0;
};
Brigadier(int w) : Cooperator()
{
workers = w;
}
Brigadier(string n, Date& b, int w) : Cooperator(n, b)
{
name = n;
workers = w;
}
friend ostream& operator<<(ostream& out, Brigadier& df)
{
out << df.name << " is name, " << df.birthday.year << " is date," << df.workers << " is count of workers";
return out;
};
};
class Firma
{
int workers;
public:
Brigadier ff;
Cooperator *cc;
Firma()
{}
Firma(int w)
{
workers = w;
cc = new Cooperator[w];
}
friend ostream& operator <<(ostream& out, Firma& f)
{
out << "count of workers: " << f.workers;
return out;
}
};
int main()
{
Firma KFC;
KFC.cc.setName("chicken"); //выражение должно иметь тип класса
KFC.ff.setName("kotleta");
cout << KFC.ff.getName() << endl;
Cooperator c;
Date d;
d.year = 2000;
d.month = 11;
d.day = 30;
Date b;
b.year = 1965;
b.month = 6;
b.day = 4;
Cooperator d1("Andrey", d);
cout << d1 << endl;
Brigadier d2("Sergey", b, 5);
cout << d2 << endl;
};
Ответы (2 шт):
Автор решения: KoVadim
→ Ссылка
Потому что cc - это указатель. Поэтому, строка должна быть переписана где то так
KFC.cc->setName("chicken");
Правда, у меня есть подозрения, что cc не инициализировано и оно не будет работать, но это другой вопрос.
Но судя по коду, сс - это некий массив. Поэтому, я бы переписал вот так
Firma KFC(1);
KFC.cc[0].setName("chicken");
Что бы не было утечек, я бы дописал деструктор и чуточку поправил конструктор
Firma()
{cc = nullptr;}
~Firma() { delete[] cc;}
Автор решения: n1tr0xs
→ Ссылка
- Как и сказал @KoVadim, вам нужно использовать
KFC.cc->setName("chicken");вместо `KFC.cc.setName("chicken"). - У вас
Firma::ccхранит "ничего". Исправить это можно так:
Firma()
{
cc = new Cooperator;
}
- Для единообразия лучше будет сделать так:
class Firma
{
int workers;
public:
Brigadier ff;
Cooperator *cc;
Firma(int w=1) : workers(w)
{
cc = new Cooperator[w];
}
friend ostream& operator <<(ostream& out, Firma& f)
{
out << "count of workers: " << f.workers;
return out;
}
};
- Обращаться к "
cc" лучше через индексацию:KFC.cc[0].setName("chicken"); // KFC.cc[1].setName("chicken1");