我正在尝试重新创建一个示例程序,我正在一本书中阅读,演示了如何使用友元函数。我在使用Visual Studio的烦人的“智能感知”中遇到错误,我坦率地说不能忍受,说我定义的朋友函数无法访问其中存在friend函数声明的私有成员。不同文件中的代码如下:
#include "stdafx.h"
#include <iostream>
#include "Budget.h"
using namespace std;
int main() {
return 0;
}
#pragma once
#include "Auxi.h"
class Budget {
public:
Budget() {
divisionBudget = 0;
}
double getDivisionBudget() const {
return divisionBudget;
}
void addBudget(int n) {
divisionBudget += n;
corporateBudget += n;
}
double getCorporateBudget() {
return corporateBudget;
}
static void setCorporateBudget(double n) {
corporateBudget = n;
}
friend void AuxillaryOffice::addBudget(double, Budget &);
private:
static double corporateBudget;
double divisionBudget;
};
double Budget::corporateBudget = 0;
#pragma once
class Budget;
class AuxillaryOffice {
public:
AuxillaryOffice() {
divisionBudget = 0;
}
void addBudget(double n, Budget &b);
private:
double divisionBudget;
};
#include "stdafx.h"
#include "Auxi.h"
#include "Budget.h"
// class Budget; Do I need this here?
void AuxillaryOffice::addBudget(double n, Budget &b) {
divisionBudget += n;
b.corporateBudget += n; // THIS IS THE ERROR LINE
}
在紧接上面的Auxi.cpp
文件中,我在b.corporateBudget += n;
行收到错误消息,表明corporateBudget无法访问。这是所有合法的C ++代码还是我在这个例子中缺少的东西?
感谢。
答案 0 :(得分:1)
您正在尝试将方法(AuxillaryOffice::addBudget
)声明为您班级的朋友(Budget
)。我认为不可能将单个方法声明为朋友。我可以在这里看到两个解决方案:
AuxillaryOffice::addBudget
成为函数(不是类方法)的程序。AuxillaryOffice
成为班级Budget
的朋友。请考虑阅读this文章以获取有关朋友的更多信息。
答案 1 :(得分:1)
Butget.h
#pragma once
#include "Auxi.h"
class Budget {
public:
Budget() {
divisionBudget = 0;
}
double getDivisionBudget() const {
return divisionBudget;
}
void addBudget(int n) {
divisionBudget += n;
corporateBudget += n;
}
double getCorporateBudget() {
return corporateBudget;
}
static void setCorporateBudget(double n) {
corporateBudget = n;
}
friend void AuxillaryOffice::addBudget(double, Budget &);
private:
static double corporateBudget;
double divisionBudget;
};
double Budget::corporateBudget = 0; // HERE ERROR!!!
您应该将double Budget::corporateBudget = 0
移至Auxi.cpp
。
答案 2 :(得分:0)
Intellisense使用另一个编译器检查您的代码,因此它有时可以提供不同的结果。它给你的错误是错误的 - 你的代码有效。
只有一个错误可能会阻止您的代码编译。您可以在标头中定义静态corporateBudget
。这是一个问题,因为如果多次包含标题可能会多次定义(就像你在这里所做的那样)。
最干净的解决方案是创建一个文件Budget.cpp并在那里定义它。