Из-за чего возникает ошибка: "Выражение должно иметь тип класса"?

#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
  1. Как и сказал @KoVadim, вам нужно использовать KFC.cc->setName("chicken"); вместо `KFC.cc.setName("chicken").
  2. У вас Firma::cc хранит "ничего". Исправить это можно так:
Firma()
{
   cc = new Cooperator;
}
  1. Для единообразия лучше будет сделать так:
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;
    }

};
  1. Обращаться к "cc" лучше через индексацию: KFC.cc[0].setName("chicken"); // KFC.cc[1].setName("chicken1");
→ Ссылка