C ++ Friend函数无权访问私有成员

时间:2015-04-07 23:14:17

标签: c++ class oop private friend

Friend函数无法访问声明它的类的私有成员

我正在尝试重新创建一个示例程序,我正在一本书中阅读,演示了如何使用友元函数。我在使用Visual Studio的烦人的“智能感知”中遇到错误,我坦率地说不能忍受,说我定义的朋友函数无法访问其中存在friend函数声明的私有成员。不同文件中的代码如下:

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 ++代码还是我在这个例子中缺少的东西?

感谢。

3 个答案:

答案 0 :(得分:1)

您正在尝试将方法(AuxillaryOffice::addBudget)声明为您班级的朋友(Budget)。我认为不可能将单个方法声明为朋友。我可以在这里看到两个解决方案:

  1. 重构AuxillaryOffice::addBudget成为函数(不是类方法)的程序。
  2. 让班级AuxillaryOffice成为班级Budget的朋友。
  3. 请考虑阅读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并在那里定义它。