C++问题:主函数中无法调用类的友元函数(多文件项目)
解决C++友元函数无法调用的问题
咱们来搞定这个友元函数getWins()无法在main里调用的问题,你的代码里有两个关键问题需要修正:
问题1:全局函数缺少前置声明
在BullCow.h里,你只把getWins()声明为BullCow类的友元,但并没有在全局作用域声明这个函数的原型。这就导致BullCowMain.cpp里调用getWins()时,编译器根本不知道这个函数的存在,会报“未定义标识符”的错误。
问题2:静态成员访问方式错误
Wins是BullCow类的静态成员,它属于类本身而不是某个对象。哪怕是友元函数,也必须通过BullCow::Wins的方式来访问它,直接写Wins编译器会找不到这个变量。
修改后的完整代码:
BullCow.h
#pragma once #include <iostream> #include <cstdlib> #include <stdlib.h> #include <time.h> // 先在全局作用域声明函数原型 int getWins(); class BullCow { public: BullCow(); // 声明为类的友元 friend int getWins(); static int Wins; private: int Attempts; };
BullCow.cpp
#include "stdafx.h" #include "BullCow.h" // 初始化静态成员 int BullCow::Wins = 0; int getWins() { // 通过类作用域访问静态成员 return BullCow::Wins; }
BullCowMain.cpp
#include "stdafx.h" #include "BullCow.h" int main() { srand(time(NULL)); std::cout << getWins(); return 0; }
补充说明:
- 友元声明的作用仅仅是赋予函数访问类私有/保护成员的权限,不会自动创建函数的全局声明,所以必须在头文件里单独声明函数原型,这样其他源文件才能识别这个函数。
- 静态成员变量的初始化必须在类外部进行(像你已经做的那样),访问时也必须明确指定类作用域,因为它不属于任何对象实例。
内容的提问来源于stack exchange,提问作者Destin715
相关产品推荐
相关产品推荐

