Объявление функции C ++ между двумя отдельными файлами - PullRequest
1 голос
/ 06 сентября 2011

Мне было поручено создать два класса: Customer и Barber, у Barber должна быть функция: cutHair (), которая может изменять значение приватного члена hairLength в Customer.

Customer.h

#ifndef CUSTOMER_H
#define CUSTOMER_H
#include "barber.h"
#include <iostream>
#include <string>
using namespace std;  

class Customer{
    public:
        friend void Barber::cutHair(Customer &someGuy);
        Customer(string name, double hairLength);
        string getName();
        double getHair();
        void setHair(double newHair);
    private:
        string name;
        double hairLength;
};
#endif

Barber.h

#ifndef BARBER_H
#define BARBER_H
#include <iostream>
#include <string>
#include "customer.h"
using namespace std;
class Customer;
class Barber{
    public:
        Barber(string barberName);
        void cutHair(Customer &someGuy);
    private:
        string name;
        double takings;
};
#endif

barber.cpp РЕДАКТИРОВАТЬ: я изменил реализацию cutHair (), чтобы воспользоватьсяобъявление друга вместо доступа к закрытым членам класса Customer через его общедоступные методы доступа

#include "barber.h"
#include <string>

Barber::Barber(string barberName){
        name = barberName;
        takings = 0;
}
void Barber::cutHair(Customer &someGuy){
        takings += 18;
        someGuy.hairLength = someGuy.hairLength * 80 / 100; 
}

customer.cpp

#include "customer.h"
#include <string>

Customer::Customer(string customerName, double custHairLength){
        name = customerName;
        hairLength = custHairLength;
}
double Customer::getHair(){
        return hairLength;
}
void Customer::setHair(double newLength){
        hairLength = newLength;
}

при попытке построить я получаю сообщение об ошибке

customer.h(10): error C2653: 'Barber' : is not a class or namespace name

в течение нескольких дней проводил исследования и устранял проблемы один за другим.надеюсь, кто-нибудь может прийти мне на помощь :)

Ответы [ 3 ]

3 голосов
/ 06 сентября 2011

У вас есть циклическая зависимость здесь. Вы включаете barber.h из customer.h и customer.h из barber.h.

В barber.h используйте

class Customer;

вместо

#include "customer.h"
0 голосов
/ 24 октября 2011

Когда вы делаете предварительное объявление, такое как class Customer в Barber.h, вы сообщаете компилятору, если видите имя, которое Customer игнорирует на данный момент при объявлении, если вам не нужно знать размер предмет. Однако в вашем случае, когда вы объявляете функцию CutHair, вы используете фактический объект Customer в аргументе. Если вы измените код таким образом, чтобы указатель указывал на Customer в качестве аргумента, и избавились от зависимостей включения, ваш код скомпилируется.

Я бы также предположил, что в вашем случае вам не понадобится функция друга, если у вас определена функция setHair, если только у вас нет веской причины не использовать эту функцию.

0 голосов
/ 06 сентября 2011

В Barber.h вы объявляете клиента вперед (class Customer;) И в том числе #include Customer.h".Попробуйте удалить включение.Конечно, вам нужно будет добавить включение в Barber.cpp

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...