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 开始引入的一个特性:可变结构体中的只读实 ...
随机推荐
- 正则-匹配获取url参数
1.根据指定参数名获取参数值 A页面向连接到B页面的url为: http://www.189dg.com/ajax/sms_query.ashx?action=smsdetail&sid=22 ...
- centos 下使用sublime
CentOS 之 Sublime text3 安装及配置(不支持中文输入) sublime text 的界面友好,自动补全功能也不错. (本来用vim+php_function.txt的形式进行补全的 ...
- python查看模块及相关函数帮助
Question: 如何查看正则表达式模块re及其相关函数的意义 1.终端命令行下 python >> import re >> help(re) Help on module ...
- AudioServicesPlaySystemSound音频服务—b
对于简单的.无混音音频,AVAudio ToolBox框架提供了一个简单的C语言风格的音频服务.你可以使用AudioservicesPlaySystemSound函数来播放简单的声音.要遵守以下几个规 ...
- 转:Red Hat JBoss团队发布WildFly 8,全面支持Java EE 7并包含全新的嵌入式Web服务器
原文来自于:http://www.infoq.com/cn/news/2014/02/wildfly8-launch Red Hat的JBoss部门今天宣布WildFly 8正式发布.其前身是JBos ...
- C# and android
http://www.cnblogs.com/GoodHelper/archive/2011/07/08/android_socket_chart.html http://blog.csdn.net/ ...
- android之针对fragment多次调用onCreateView的问题
private View rootView; @Override public View onCreateView(LayoutInflater inflater, ViewGroup contain ...
- rnqoj-28-合唱队形-最长上升子序列
想当年大一的时候,一个最长上升子序列的问题使得我的罚时上升了不少....当年还是图样啊 这道题目本质就是求最长上升子序列 #include<stdio.h> #include<str ...
- HDOJ 1303 Doubles(简单题)
Problem Description As part of an arithmetic competency program, your students will be given randoml ...
- 使用java创建kafka的生产者和消费者
创建一个Kafka的主题,连接到zk集群,副本因子3,分区3,主题名是test111 [root@h5 kafka]# bin/kafka-topics.sh --create --zo ...