C++,关于类和结构体中,成员访问属性(public,private)
今天发现一个的问题:
#include <vector> #include <iostream> #include <algorithm> #include <functional> struct State { State( int state ) : m_state( state ){} ~State() { std::cout << "~State(), m_state=" << m_state << std::endl; } void setState( int state ){ m_state = state; } int getState() const{ return m_state; } void print() const { std::cout << "State::print: " << m_state << std::endl; } private: int m_state; }; //void Print(State *pstate) //全局函数 //{ // pstate->print(); //} class Printer //改用仿函数 { void operator()(State *pstate) { pstate->print(); } }; /* class Printer //仿函数,用模板实现 { template<typename T> void operator()(T *pstate) { pstate->print(); } }; */ int main() { std::vector<State*> vect; vect.push_back( ) ); vect.push_back( ) ); vect.push_back( ) ); vect.push_back( ) ); std::vector<State*>::iterator it( vect.begin() ); std::vector<State*>::iterator ite( vect.end() ); // for ( ; it != ite; ++it ) // { // (*it)->print(); // } // std::for_each(it,ite,&Print); //调用函数指针 std::for_each(it,ite,Printer()); //调用仿函数 system( "pause" ); ; }
改成仿函数后,执行报错:提示error C2248: “Printer::operator ()”: 无法访问 private 成员(在“Printer”类中声明)
我以为是pstate->print(); 这里提示不能访问private成员m_state,后来一想,不可能啊,如果用全局函数的方式pstate->print()是可以运行的。肯定是仿函数有问题,后来网上查资料,终于知道原因了:
在类里面默认的是private。必须显示指定为public 。
解决方法:将仿函数加上public访问属性:
class Printer //改用仿函数 { public: //不能省略,不写public,默认为private void operator()(State *pstate) { pstate->print(); } };
但是还有个疑问:为什么State类中,可以不加public访问属性也能正确运行呢?后来一想,明白了,State不是一个类,而是一个结构体,默认的是public 。不必显示指定为public 。不信,加上private,马上报错。
C++,关于类和结构体中,成员访问属性(public,private)的更多相关文章
- Python进阶----类的结构(公有成员 , 私有成员(私有属性,私有方法),类方法,静态方法,属性) ,isinstance 和issubcalss ,元类(type())
Python进阶----类的结构(公有成员 , 私有成员(私有属性,私有方法),类方法,静态方法,属性) ,isinstance 和issubcalss ,元类(type()) 一丶类的结构细分 ...
- Swift3.0P1 语法指南——类和结构体
原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programmi ...
- 【Swift学习】Swift编程之旅---类和结构体(十三)
与其他编程语言所不同的是,Swift 并不要求你为自定义类和结构去创建独立的接口和实现文件.你所要做的是在一个单一文件中定义一个类或者结构体,系统将会自动生成面向其它代码的外部接口. 注意:通常一个类 ...
- swift 类 与 结构体
这两天突然有人问我 swift里面 类和 结构体 有什么区别? 说实在的本人目前不太看好swift,相信很多人也是,oc 都 很成熟了. 本人目前不打算深入了解swift的原因swift 语言 ...
- Swift语法学习之 类和结构体
类和结构体 本页包括内容: 类和结构体对照 结构体和枚举是值类型 类是引用类型 类和结构体的选择 集合(collection)类型的赋值与复制行为 与其他编程语言所不同的是,Swift 并不要求你为自 ...
- Swift 学习笔记 (类和结构体)
类和结构体是一种多功能且灵活的构造体.通过使用与现存常量 变量 函数完全相同的语法来在类和结构体中定义属性和方法以添加功能. Swift中不需要你为自定义的类和结构体创建独立的结构和实现文件.在Swi ...
- Welcome-to-Swift-09类和结构体(Classes and Structures)
类和结构体是人们构建代码所用的一种通用且灵活的构造体.为了在类和结构体中实现各种功能,我们必须要严格按照对于常量,变量以及函数所规定的语法规则来定义属性和添加方法. 与其他编程语言所不同的是,Swif ...
- 在C语言结构体中添加成员函数
我们在使用C语言的结构体时,经常都是只定义几个成员变量,而学过面向对象的人应该知道,我们定义类时,不只是定义了成员变量,还定义了成员方法,而类的结构和结构体非常的相似,所以,为什么不想想如何在C语言结 ...
- C# 8: 可变结构体中的只读实例成员
在之前的文章中我们介绍了 C# 中的 只读结构体(readonly struct)[1] 和与其紧密相关的 in 参数[2]. 今天我们来讨论一下从 C# 8 开始引入的一个特性:可变结构体中的只读实 ...
随机推荐
- C++Primer charpter1.
一.输入输出流 endl:会刷新buffer.刷新之后你才能看到.不手动用endl的话,就只能依靠系统自动刷.程序崩溃的话,你看到的调试信息可能是错误的. >>: 两个连续的符号 ci ...
- c语言实现BMP图像转换为灰度图
当初是自己要装X,非要用c来写信息隐藏作业,装了X,就得付出实践.查了好久资料,到期末才把作业交了,这里总结一下. 这道题是将真彩图转换为灰度图. 关于BMP文件结构,这是困扰了我好久的问题,上网查了 ...
- Spring碎点知识
1.依赖注入:不仅可以为Bean注入普通的属性值,还可以注入其他Bean的作用.通过配置文件组织在一起,这里的Bean是Java对象 说明:关于依赖注入与控制反转的这两个名字,表达的都是同一个意思,只 ...
- Update主循环、状态机的实现
从写一段程序,到写一个app,写一个游戏,到底其中有什么不同呢?一段程序的执行时间很短,一个应用的执行时间很长,仅此而已. 游戏中存在一个帧的概念. 这个概念大家都知道,类比的话,它就是电影胶卷的 ...
- Alias Method解决随机类型概率问题
举个例子,游戏中玩家推倒了一个boss,会按如下概率掉落物品:10%掉武器 20%掉饰品 30%掉戒指 40%掉披风.现在要给出下一个掉落的物品类型,或者说一个掉落的随机序列,要求符合上述概率. 一般 ...
- 【转】ArrayList和LinkedList的几种循环遍历方式及性能对比分析
原文网址:http://www.trinea.cn/android/arraylist-linkedlist-loop-performance/ 主要介绍ArrayList和LinkedList这两种 ...
- [LeetCode] 200. Number of Islands 解题思路
Given a 2d grid map of '1's (land) and '0's (water), count the number of islands. An island is surro ...
- React问答小demo
在学习react初期,看了一些视频和资料,react基础知识差不多学完,跟着网上的一个教程,做了一个小型的问答demo. 需求看图说: 1.点击"添加"按钮,显示问题输入表单,再次 ...
- 重写boost内存池
最近在写游戏服务器网络模块的时候,需要用到内存池.大量玩家通过tcp连接到服务器,通过大量的消息包与服务器进行交互.因此要给每个tcp分配收发两块缓冲区.那么这缓冲区多大呢?通常游戏操作的消息包都很小 ...
- js 截取字符串
转:http://blog.csdn.net/dotnet25/article/details/8331959 字符串:var s = "1,2,3,4,5," 目标:删除最后一个 ...