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 开始引入的一个特性:可变结构体中的只读实 ...
随机推荐
- phpcms v9版本二次开发四步曲
今晚看了一下PHPCMS V9版本,做一个实例抛砖引玉,其实很简单,以下是二次开发的一个实例以旅游模块为例1. 在phpcms\modules目录下建立一个文件夹tour2. 在phpcms\m ...
- php批量上传图片并把图片名放入数据库
前几天工作中要做这样一个功能,有八百多个系统 生成的会员:给这八百多个系统会员上传图片:然后把图片名放入数据库. 第一步: 第一步肯定是首先把图片上传到对应的图片目录下,直接用框架中已经有的上传类: ...
- Flask源码阅读笔记(一)
作者:acezio链接:https://zhuanlan.zhihu.com/p/21358368来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. flask的url r ...
- Pycharm在创建py文件时,如何自动添加文件头注释(类似于钩子特性)?
在每次新建一个py文件的时候 1 如何自动添加/usr/bin/env python2 自动添加 coding=utf8 操作方法: File->settings->Editor-> ...
- 隐藏NGINX服务器名称 和版本号
隐藏NGINX服务器名称: 修改或隐藏服务器名称需要修改源码nginx.h,nginx.h在src/core/目录下 .具体操作如下: 把下面两个宏的值修改为自己设定的值,例如"NGX&qu ...
- ACM、OI等比赛中的程序对拍问题
多年前请教于ZXYTIM(zxy)大牛,现在把windows环境下的版本贴出来. 手动数据调试效率太低,程序对拍还是非常实用的,特别适用于OI.蓝桥杯等这些比赛规则.可以用于暴力与AC算法之间的对拍. ...
- ural 1333 Genie Bomber 2
#include <cstdio> #include <cstring> #include <algorithm> #define maxn 200 using n ...
- POJ_3009——冰球,IDS迭代加深搜索
Description On Planet MM-21, after their Olympic games this year, curling is getting popular. But th ...
- Q - Get The Treasury - HDU 3642 (扫面线求体积)
题意:求被三个或三个以上立方体重合的体积 分析:就是平面面积的加强,不过归根还是一样的,可以把z轴按照从小向大分区间N个,然后可以得到N个平面,用平面重复三次以上的在和高度计算体积. ******** ...
- 听说每天都要写随笔,word哥~
今天主要学习了html的基本知识,进制的转换,无序列表,有序列表和表格,都是很基本的东西,然后自己自习了表单. <!DOCTYPE html PUBLIC "-//W3C//DTD X ...