C++ 友元函数无权访问私有成员
C++ Friend Function Does Not Have Access To Private Member
友元函数无法访问声明它的 class 的私有成员
我正在尝试重新创建一个示例程序,我正在阅读一本演示如何使用友元函数的书。我在 "Intellisense" 和 Visual Studio 中遇到了一个错误,坦率地说我无法忍受,说我定义的友元函数无法访问友元函数声明所在的私有成员存在。不同文件中的代码如下:
Main.cpp:
#include "stdafx.h"
#include <iostream>
#include "Budget.h"
using namespace std;
int main() {
return 0;
}
Budget.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;
Auxi.h
#pragma once
class Budget;
class AuxillaryOffice {
public:
AuxillaryOffice() {
divisionBudget = 0;
}
void addBudget(double n, Budget &b);
private:
double divisionBudget;
};
Auxi.cpp
#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++ 代码还是我在这个例子中遗漏了什么?
谢谢。
您正在尝试将方法 (AuxillaryOffice::addBudget
) 声明为您的 class (Budget
) 的友元。我相信不可能将单个方法声明为友元。我可以在这里看到两个解决方案:
- 重组您的程序,使
AuxillaryOffice::addBudget
成为一个函数(而不是 class 方法)。
- 让 class
AuxillaryOffice
成为 class Budget
的朋友。
请考虑阅读 this 文章以获取有关朋友的更多信息。
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
。
Intellisense 使用另一个编译器来检查您的代码,因此它有时会给出不同的结果。它在这里给你的错误是错误的 - 你的代码有效。
只有一个错误可能会阻止您的代码编译。您在 header 中定义静态 corporateBudget
。这是一个问题,因为如果 header 被多次包含(就像你在这里所做的那样),它可能会被定义多次。
最干净的解决方案是创建一个文件 Budget.cpp 并在其中定义它。
友元函数无法访问声明它的 class 的私有成员
我正在尝试重新创建一个示例程序,我正在阅读一本演示如何使用友元函数的书。我在 "Intellisense" 和 Visual Studio 中遇到了一个错误,坦率地说我无法忍受,说我定义的友元函数无法访问友元函数声明所在的私有成员存在。不同文件中的代码如下:
Main.cpp:
#include "stdafx.h"
#include <iostream>
#include "Budget.h"
using namespace std;
int main() {
return 0;
}
Budget.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;
Auxi.h
#pragma once
class Budget;
class AuxillaryOffice {
public:
AuxillaryOffice() {
divisionBudget = 0;
}
void addBudget(double n, Budget &b);
private:
double divisionBudget;
};
Auxi.cpp
#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++ 代码还是我在这个例子中遗漏了什么?
谢谢。
您正在尝试将方法 (AuxillaryOffice::addBudget
) 声明为您的 class (Budget
) 的友元。我相信不可能将单个方法声明为友元。我可以在这里看到两个解决方案:
- 重组您的程序,使
AuxillaryOffice::addBudget
成为一个函数(而不是 class 方法)。 - 让 class
AuxillaryOffice
成为 classBudget
的朋友。
请考虑阅读 this 文章以获取有关朋友的更多信息。
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
。
Intellisense 使用另一个编译器来检查您的代码,因此它有时会给出不同的结果。它在这里给你的错误是错误的 - 你的代码有效。
只有一个错误可能会阻止您的代码编译。您在 header 中定义静态 corporateBudget
。这是一个问题,因为如果 header 被多次包含(就像你在这里所做的那样),它可能会被定义多次。
最干净的解决方案是创建一个文件 Budget.cpp 并在其中定义它。