【问题标题】:C++ Friend Function Does Not Have Access To Private MemberC++ Friend 函数无权访问私有成员
【发布时间】:2015-06-12 17:25:42
【问题描述】:

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

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

Main.cpp:

#include "stdafx.h"
#include <iostream>
#include "Budget.h"
using namespace std;

int main() {

    return 0;
}

预算.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;

辅助.h

#pragma once

class Budget;
class AuxillaryOffice {
public:
    AuxillaryOffice() {
        divisionBudget = 0;
    }

    void addBudget(double n, Budget &b);

private:
    double divisionBudget;
};

辅助.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++ 代码还是我在这个例子中遗漏了什么?

谢谢。

【问题讨论】:

  • 你真的得到了编译错误还是只是 IntelliSense 抱怨?
  • 您可以将两个类声明为好友。我认为在你的情况下它更合适。
  • @Brian 这是一个编译器错误,抱怨一些它不知道的奇怪的不存在的符号(不存在)以及我想尝试的智能感知,一个不属于的函数到一个班级朋友的班级,看看这是否可行。

标签: c++ class oop private friend


【解决方案1】:

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

  1. 重构您的程序,使AuxillaryOffice::addBudget 成为一个函数(而不是类方法)。
  2. 让班级AuxillaryOffice成为班级Budget的朋友。

请考虑阅读this 文章以获取有关朋友的更多信息。

【讨论】:

    【解决方案2】:

    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

    【讨论】:

    • 好的,所以当一个未初始化的变量的值被称为奇怪的事情发生时,这是有道理的,这就是为什么我在 Budget.h 文件中添加double Budget::corporateBudget = 0,但是为什么它在那里不起作用并且只在 Auxi.cpp 中工作?是不是在.h文件中没有调用,必须在实现文件中?
    • 您在头文件Budget.h 中定义静态变量corporatebudget,这意味着包含此头文件的每个*.cpp 文件都定义了自己的定义。因此,您应该在单个 *.cpp 文件中定义静态数据成员。
    【解决方案3】:

    Intellisense 使用另一个编译器来检查您的代码,因此它有时会给出不同的结果。它在这里给你的错误是错误的 - 你的代码有效。

    只有一个错误可能会阻止您的代码编译。您在标题中定义静态corporateBudget。这是一个问题,因为如果多次包含标头(就像您在此处所做的那样),它可能会被多次定义。

    最简洁的解决方案是创建一个文件 Budget.cpp 并在其中定义它。

    【讨论】:

      猜你喜欢
      • 2018-01-07
      • 1970-01-01
      • 2019-07-12
      • 1970-01-01
      • 2012-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      相关资源
      最近更新 更多