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) 的友元。我相信不可能将单个方法声明为友元。我可以在这里看到两个解决方案:

  1. 重组您的程序,使 AuxillaryOffice::addBudget 成为一个函数(而不是 class 方法)。
  2. 让 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 并在其中定义它。