两个独立文件之间的C ++友元函数声明

时间:2011-09-06 07:43:35

标签: c++ compiler-errors

我被指示创建两个类:Customer和Barber, 理发师应该有一个函数:cutHair(),可以在Customer中更改私有成员hairLength的值。

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 个答案:

答案 0 :(得分:3)

这里有循环依赖。您包括来自customer.h的barber.h和来自barber.h的customer.h。

在barber.h中使用

class Customer;

而不是

#include "customer.h"

答案 1 :(得分:0)

Barber.h中,您正在声明客户(class Customer;)并包括#include Customer.h"。尝试删除包含。当然,您必须在Barber.cpp

中添加包含

答案 2 :(得分:0)

当您在class Customer中执行Barber.h之类的前向声明时,只要您不需要,就会告诉编译器您是否在申报时看到客户忽略它的名称知道对象的大小。但是,在您声明CutHair函数的情况下,您正在使用参数中的实际Customer对象。如果以某种方式更改代码以将Customer指针作为参数,并删除包含依赖项,则代码将进行编译。

我还建议,如果您定义了setHair函数,则不需要友元函数,除非您有充分理由不具备该函数。