原文地址:
今天又碰到这个问题,由于以前没有记笔记的习惯,所以碰到这个问题之后纠结了很久。友元函数本来就是给那些既需要访问类成员而又不能作为相关类的成员的函数或者类来访问类私有变量的方法。从这儿可以看出,友元函数会破坏类的封装性,所以还是少用为妙。
#include "iostream"
using namespace std;
class MyClass
{
public:
double val;
MyClass(){a = b = 0;}
MyClass(int x, int y)
{
a = x;
b = y;
val = 0.0;
}
~MyClass()
{
cout << "Destructing MyClass(" << a << ", " << b << ")" << endl;
}
int sum()
{
return a + b;
}
friend ostream &operator<<(std::ostream &strm, const MyClass &obj);
private:
int a, b;
};
ostream &operator<<(ostream &strm, const MyClass &obj)//
{
strm << "(" << obj.a << " " << obj.b << ")";
return strm;
}
int main(){
return 0;
}
当我在VC6.0上像这样写代码时,编译器报如下错误:
引用
Compiling...
test.cpp
D:\VCProject\FriendTest\test.cpp(33) : error C2248: 'a' : cannot access private member declared in class 'MyClass'
D:\VCProject\FriendTest\test.cpp(29) : see declaration of 'a'
D:\VCProject\FriendTest\test.cpp(33) : error C2248: 'b' : cannot access private member declared in class 'MyClass'
D:\VCProject\FriendTest\test.cpp(29) : see declaration of 'b'
上网一查,发现这是VC6.0的一个经典BUG,是VC6.0对友元函数的支持不够,同时跟namespace也有关系。
于是,有两种方式可以解决这个问题:
方式一:注释掉 using namespace std;加上如下声明:
using std::cout;
using std::endl;
using std::ostream;
完整代码如下:
#include "iostream"
//using namespace std;
using std::cout;
using std::endl;
using std::ostream;
class MyClass
{
public:
double val;
MyClass(){a = b = 0;}
MyClass(int x, int y)
{
a = x;
b = y;
val = 0.0;
}
~MyClass()
{
cout << "Destructing MyClass(" << a << ", " << b << ")" << endl;
}
int sum()
{
return a + b;
}
friend ostream &operator<<(std::ostream &strm, const MyClass &obj);
private:
int a, b;
};
ostream &operator<<(ostream &strm, const MyClass &obj)//
{
strm << "(" << obj.a << " " << obj.b << ")";
return strm;
}
int main(){
return 0;
}
方法二:在程序中不使用 namespace,把头文件替换为 .h , 如:
#include "iostream.h"
// using namespace std;
完整源代码如下:
#include "iostream.h"
//using namespace std;
class MyClass
{
public:
double val;
MyClass(){a = b = 0;}
MyClass(int x, int y)
{
a = x;
b = y;
val = 0.0;
}
~MyClass()
{
cout << "Destructing MyClass(" << a << ", " << b << ")" << endl;
}
int sum()
{
return a + b;
}
friend ostream &operator<<(std::ostream &strm, const MyClass &obj);
private:
int a, b;
};
ostream &operator<<(ostream &strm, const MyClass &obj)//
{
strm << "(" << obj.a << " " << obj.b << ")";
return strm;
}
int main(){
return 0;
}
分享到:
相关推荐
C++ 中友元函数与友元类详解 总的来说,友元分为两类:友元函数与友元类。友元是针对类而言,它提供了一种非类的成员函数来访问类的非公有成员的一种机制。可以把一个函数指定为某类的友元,这个函数称为这个类的...
类的成员函数是属于类的函数,它们可以访问类的所有成员,包括私有成员和保护成员。成员函数的原型要写在类体中,原型说明了函数的参数表和返回值类型。而函数的定义一般在类外面,也可以直接在类内部定义。前者与...
在C++编程语言中,友元(Friend)是一种特殊的机制,允许一个类访问另一个类的私有(private)和保护(protected)成员。这打破了封装的常规规则,但有时为了实现特定的功能或优化代码,它是必要的。下面我们将通过...
本文通过一个具体的例子,详细介绍了C++中友元函数和函数重载的概念及其应用。友元函数使得非成员函数能够访问类的私有成员,而函数重载则提高了代码的可读性和复用性。通过这个示例,我们可以更好地理解和掌握这两...
4. C++中友元函数和友元类的概念允许非成员函数或类访问类的私有成员,这在一定程度上破坏了封装性,但有时候可以提供方便。友元函数在C++中不是成员函数,但是被授予了访问类私有成员的权限。 5. C++模板是一种...
以下是对C++中友元函数的详细总结: 1. **友元函数的基本概念** - 友元函数的引入主要是为了在类之间实现数据共享,提高效率。当类A中的某个函数需要访问类B的私有或保护成员时,该函数可以被声明为类B的友元。 -...
在C++中,友元(Friend)是一种特殊的关系,它允许一个类访问另一个类的私有(private)或保护(protected)成员。这种机制打破了封装的常规规则,但有时为了提高代码的灵活性和效率,它是必要的。下面我们将深入...
【IBM助力中友百货信息化建设】这一项目展示了IBM在服务器和存储解决方案领域的专业实力,以及如何通过技术创新帮助企业提升商业竞争力。中友百货选择了IBM的eServer x系列服务器和TotalStorage解决方案,成功升级了...
以下是关于C++中友元函数和类设计的相关知识点: 1. **友元函数**: 友元是C++中一种特殊的关系,允许一个类访问另一个类的私有或保护成员。在这个场景中,友元函数被用来访问并操作`Boat`和`Car`类的私有属性——...
台湾中友百货作为一家知名的购物中心,其卫生间设计无疑是卖场布局中的一个重要组成部分。这份名为“卖场布局:台湾中友百货的卫生间设计”的文档,为我们揭示了如何通过精心规划卫生间来提升整体的商场环境和服务...
(罗中友)绿色施工技术在道路桥梁施工中的应用研究
相对于Java而言,友元是C++中特有的一种元素,很多教材上对其介绍的相对较少,因此初学的时候往往不能很快掌握,本文总结了友元的用法和一些注意的...1)Father类中创建的MyFriend对象允许直接访问MyFriend类中所有变量
探究网络安全态势感知系统关键技术.pdf
详细介绍了C++中友元的使用,适合C++入门者参考学习。
- 沟通不足:指出了在与团队成员沟通上的问题,导致了员工流失和中友店撤离事件。为解决这个问题,报告提出要增进与员工的交流,提高团队凝聚力,以减少离职率。 - 经营提升:报告认识到经营策略的不足,如未能...
递归通常用于解决那些可以分解为相似子问题的问题,通过不断将大问题分解成小问题来求解。 #### 二、递归的关键要素 递归包含两个关键部分: 1. **基本情况**(Base Case):递归调用必须有一个明确的停止条件,...
《O2O电子商务平台项目计划书》是一份详尽的文档,主要涵盖了关于长春中友软件有限公司在2015年1月提交的电子商务企业申报。这份70页的计划书深入探讨了O2O(线上到线下)模式在农村电商系列中的应用,旨在创建一个...