
我尝试过这种方法,先声明一个基类,其他类在其基础上进行派生:
class CCtrlBase{
public:
// Constructor/Deconstructor
CCtrlBase(CCtrlBase ptr=NULL); // 构建函数的ptr用于填写其派生类的对象指针,从而允许反向调用和访问
virtual ~CCtrlBase();
// Attributes
// 下列变量由基类和派生类的构建函数设置,用于为每个对象的信息维护提供支持
// 由对象的构建函数自动调用基类构建函数设置或其管理对象调用本对象的SetCallBack
private:
CCtrlBase pParent; // 管理本对象的对象的指针,由维护或管理该对象的对象在创建此对象时设置
protected:
static bool bRunOnce ;
static int m_process_id; // 进程号,将作为CEmulator的m_object_index。
static int m_object_num; // 维护进程所创建的所有CCtrlBase对象总数
CLASS_ID class_id_; // 基类和派生类的类型标识
CString class_name_; // 基类和派生类的类型名
int m_object_index; // 对象的索引值;对于无管理对象的独立对象该值由基类构建函数维护,否则由管理对象维护
public:
// Implementations
private:
protected:
int GetSize(voidp); // 根据内存指针计算临时内存分配的空间大小(bytes)。
CString GetClassName(); // 用于获取当前对象的类名字串
CUDPSocket GetUDPSocketPtr(); // 根据ptrClass指针获得Node实例指针,注意ptrClass的ClassID class_id_必须是_CNode
public:
CLASS_ID GetClassID();// 用于获取当前对象的类名属性值(枚举类型标识)
int SetObjID();// 用于设置ptr对象的m_object_index,当ptr为NULL时,设置为自动累加的值,否则设为其派生类或管理类中的列表索引值
int GetObjID();// 用于查询并ptr对象的m_object_index,当ptr为NULL时,返回其派生类或管理类中的m_object_index,否则返回该对象在派生类或管理类的列表索引值,实际上通过调用其派生类或管理类的该函数以获取该值。
CCtrlBaseGetParentPtr();// 返回其管理类对象的指针,即控制者指针
void SetCallBack(CCtrlBase ptr, bool bReplace=true);
/
// 调用方法:pObj->SetCallBack(this)
// 用于指定使用本对象的管理者类函数的实例对象指针。
/
}
声明一个方向的枚举,包含四个枚举值: 东/西/南/北
Swift 的枚举成员在被创建时本身就是完备的值,这些值的类型是已经明确定义好的 Direction 类型 不会像 Objective-C 一样被赋予一个默认的整型值。在上面的 Direction 例子中,east、west 、north、south不会被隐式地赋值为 0,1,2 和 3。
Swift 中的枚举更加灵活,不必给每一个枚举成员提供一个值。如果给枚举成员提供一个值(称为原始值),则该值的类型可以是:字符串、字符、任意的整数值或浮点类型。
Swift的枚举类型提供了一个叫原始值(RawValues)的实现,它为枚举项提供了一个默认值,这个默认值在编译期间就是确定的。
通过原值值获取的枚举项是可选类型的,所以需要用if let 做一下判断。
未指定枚举值类型
隐式原始值
隐式原始值下枚举项使用系统的分配值:
显式原始值
隐式 + 显式原始值
这里使用了属性观察者,Swift里面的枚举更像一个对象,因此可以很方便的使用属性观察者对枚举值进行监听。
在 Swift 中,还可以定义这样的枚举类型,它的每一个枚举项都有一个附加信息,来扩充这个枚举项的信息表示,这又叫做关联值。
一定要学会使用关联值,这一点很重要。具体的使用后面的第九节会细说
通常情况下枚举是很容易进行相等判断的。一旦为枚举增加了关联值,Swift就没法正确的比较了,需要自己对该枚举实现 == 运算符。
借助 Comparable 协议,来实现枚举的比较。
遵守 CaseIterable 协议的swift枚举是可以遍历的,通过allCases获取所有的枚举成员
app里面的接口地址,如果都放一起,命名或者寻找都不方便,可以用枚举的嵌套来设计。可以分散在多个文件中,方便维护和管理。
用枚举来管理系统里面的常量是一个不错的选择。
枚举中不能使用存储属性,但是可以使用计算属性,计算属性的内容是在枚举值或者枚举关联值中得到的。
在这里,可以认为枚举是一个类,introduced是一个成员方法,AppleDeivceiPhone 就是一个AppleDeivce的实例,case们是它的属性。introduced里面的switch self,其实就是遍历这个匿名属性的所有场景,如iPad,iPhone等,然后根据不同的场景返回不同的值。
可以做枚举的自定义构造方法。
系统的打印协议
让枚举遵守这个协议
枚举可以进行扩展。可以将枚举中的case与method/protocol分隔开,阅读者可以快速消化枚举的内容。
设计一个网络类下的错误信息的处理功能。
在项目中经常使用 UserDefaults 来存储一下简单的用户信息。但是对 Key 的维护不会很方便。而且会想不起来。用枚举+结构体就能很好的解决这个问题。
这么设计APP的存储模块,是不是更有层级感,更加方便使用呢?
递归枚举是拥有另一个枚举作为枚举成员关联值的枚举。当编译器 *** 作递归枚举时必须插入间接寻址层。可以在声明枚举成员之前使用 indirect关键字来明确它是递归的。 也可以声明在整个枚举前,让所有的枚举成员都是递归的。
在后台java代码中获取web上下文对象(以及session、request、response等对象),可以使用ActionContext类:
ActionContext context=ActionContextgetContext(); --得到Action执行的上下文
在获取了context后,还可以继续获取session等对象:
Map request=(Map)contextget("request");--得到>
一, 从controller往视图传递值,controller---->视图
1)简单类型,如int, String,直接写在controller方法的参数里,是无法传递到视图页面上的(经测试)。
(而用@RequestParam("name")注解,可以从视图上,或地址中加name=传递到controller方法里)
2)可以用Map<String, Object>,其键值可以在页面上用EL表达式${键值名}得到,
3)也可以用Model类对象来传递,有addAttribute(key, value)方法,其键值可以在页面上用EL表达式${键值名}得到,
如果用addAttribute(value)这个方法,会将类型名的首字母改成小写后,作为键值名传递过去,例如"ok"在页面上用${string}得到,而一个复合类对象,如User类对象,页面上用${user}得到该对象,用${userpropertyName}得到其属性,这是用Model的一大优势。
例如,modeladdAttribute(new User("my姓名","我的爱好有游泳打球"));
这样页面上就能用${username}和${userhobby}打印对应属性
@RequestMapping(value={"/","/hello"})
public String hello(int id,Map<String,Object> map) {
Systemoutprintln(id);
Systemoutprintln("hello");
mapput("hello", "world");
return "hello";
}
@RequestMapping(value="/say")
public String say(@RequestParam int id,Model model) {
Systemoutprintln("say");
modeladdAttribute("hello", "value");
//使用Object的类型作为key,String-->string
modeladdAttribute("ok");
return "hello";
} >
以上就是关于如何在c++中动态获得对象的名称全部的内容,包括:如何在c++中动态获得对象的名称、Swift-细说枚举(Enum)、如何获取ServletContext对象等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)