Moving From Objective-C to C++
1. virtual method or not:
- It’s better to declare all cpp member methods without “virtual” keyword;
- But when you’re writing a cpp header file, please check if any methods of the parent class are overrided by your current work. Make sure to change them into virtual methods;
- If you inherit a virtual method from parent class, make sure that it inherits the “virtual” keyword.
2. methods of public/protected/private:
- By default, declare all member methods as “public” ;
- If any of the folowing conditions is satisfied, the method must be private;
- this method is declared in .m file;
- this method is in a category named “private”;
3. member variables of public/protected/private:
- Declare all member variables as “protected”, without any other choice
4. two-phase construction
- HOW TO:
- 1st-phase: set default value for all member variables in the constructor initialization list. But don’t do write any logic init in the constructor.
- 2nd-phase: write logic init in a “CMyClass* init(…)” function. If the init failed, return NULL.
- WHY:
- We decided to abandon the usage of try-catch exception mechanism in C++. Do this to reduce the footprint and binary size. As the result, any exception occurring in C++ construction will not be reported to the invoker.
- WHEN:
- two-phase construction isn’t force to implement in each class, but just for those classes who have logic step in initialization. In the other words, writing logical initialization in constructor IS FORBIDDEN, especially the situation may return false.
- FOR INVOKERS:
- If the class you will invoke has a “bool init(…)” function, call it immediately after construction.
1#define CCX_BREAK_IF(cond) if(cond) break;
2#define CCX_SAFE_DELETE(p) if(p) {delete (p); (p) = NULL;}
3
// declaration
5class CCar
6{
public:
8 CCar();
9 bool init();
10 virtual ~CCar();
11
protected:
13 CEngine* m_pEngine;
14 bool m_bStarted;
15 bool m_bLocked;
16};
17
// 1st-phase construction
// only set the default value & alloc memory
20CCar::CCar()
21:m_pEngine(new CEngine)
22,m_bStarted(false)
23,m_bLocked(true)
24{
printf(“CCar constructor\n”);
26}
27
// 2st-phase construction
// do logical initialization
30bool CCar::init()
31{
32 bool bRet = false;
33
34 do
35 {
36 m_bLocked = false;
37
38 CCX_BREAK_IF( !m_pEngine ); // defensive
39 CCX_BREAK_IF( !m_pEngine->start() ); // logic
40
41 // success
42 bRet = true;
43
44 } );
45
46 printf(“CCar init\n”);
47 return bRet;
48}
49
// destruction
51CCar::~CCar()
52{
53 if (m_pEngine)
54 {
55 delete m_pEngine;
56 m_pEngine = NULL;
57 }
58
printf(“CCar destructor\n”);
60}
61
// invoker
63int _tmain(int argc, _TCHAR* argv[])
64{
// in heap
66 CCar* pCar = new CCar;
67 if (!pCar->init())
68 {
69 CCX_SAFE_DELETE(pCar);
70 }
71
// in stack
73 CCar car;
74 if (!car.init())
75 {
76 // do sth.
77 }
78
79 ;
80}
download sample code: attachment:TwoPhaseConstruction.zip This project is tested in win32 enviroment via VS2008
5. property of objc
/** CCX_PROPERTY_READONLY is used to declare a protected variable.
We can use get method to read the variable.
@param varType : the type of variable.
@param varName : variable name.
@param funName : “get + funName” is the name of the get method.
@warning : The get method is a public virtual function, you should override it first.
The variables and methods declared after CCX_PROPERTY_READONLY are all public.
If you need protected or private, please declare.
9*/
10#define CCX_PROPERTY_READONLY(varType, varName, funName)\
11 protected: varType varName;\
12 public: virtual varType get##funName(void);
13
/** CCX_PROPERTY is used to declare a protected variable.
We can use get method to read the variable, and use the set method to change the variable.
@param varType : the type of variable.
@param varName : variable name.
@param funName : “get + funName” is the name of the get method.
“set + funName” is the name of the set method.
@warning : The get and set methods are public virtual functions, you should override them first.
The variables and methods declared after CCX_PROPERTY are all public.
If you need protected or private, please declare.
23*/
24#define CCX_PROPERTY(varType, varName, funName)\
25 protected: varType varName;\
26 public: virtual varType get##funName(void);\
27 public: virtual void set##funName(varType var);
28
/** CCX_SYNTHESIZE_READONLY is used to declare a protected variable.
We can use get method to read the variable.
@param varType : the type of variable.
@param varName : variable name.
@param funName : “get + funName” is the name of the get method.
@warning : The get method is a public inline function.
The variables and methods declared after CCX_SYNTHESIZE_READONLY are all public.
If you need protected or private, please declare.
37*/
38#define CCX_SYNTHESIZE_READONLY(varType, varName, funName)\
39 protected: varType varName;\
40 public: inline varType get##funName(void){ return varName; }
41
/** CCX_SYNTHESIZE is used to declare a protected variable.
We can use get method to read the variable, and use the set method to change the variable.
@param varType : the type of variable.
@param varName : variable name.
@param funName : “get + funName” is the name of the get method.
“set + funName” is the name of the set method.
@warning : The get and set methods are public inline functions.
The variables and methods declared after CCX_SYNTHESIZE are all public.
If you need protected or private, please declare.
51*/
52#define CCX_SYNTHESIZE(varType, varName, funName)\
53 protected: varType varName;\
54 public: inline varType get##funName(void){ return varName; }\
55 public: inline void set##funName(varType var){ varName = var; }
6. id
some functions in objc return “id”, translate to cpp, we return this “bool” instead. In objc, you can write code just like [[MyClass alloc] init] autorelease]. you don’t mind if init failed and return nil, in that case [nil autorelease] will not crash the programe. But in cpp, we return bool to prevent developers write pClass = (new MyClass())->init()->foo(). If init failed and return null, null->fool() will crash and jump out the program in cpp. In the other hand, if the return value of foo() isn’t MyClass*, for example, return bool, and the invoker will lost the pointer of “new MyClass” then can’t delete it from heap. That’s dangerous.
@interface CTest
-(id) foo();
must be translated to
class CTest
{
bool foo();
}
Moving From Objective-C to C++的更多相关文章
- Automake
Automake是用来根据Makefile.am生成Makefile.in的工具 标准Makefile目标 'make all' Build programs, libraries, document ...
- Artistic Style 3.1 A Free, Fast, and Small Automatic Formatter for C, C++, C++/CLI, Objective‑C, C#, and Java Source Code
Artistic Style - Index http://astyle.sourceforge.net/ Artistic Style 3.1 A Free, Fast, and Small Aut ...
- Moving Computation is Cheaper than Moving Data
https://hadoop.apache.org/docs/r1.2.1/hdfs_design.html Introduction The Hadoop Distributed File Syst ...
- [LeetCode] Moving Average from Data Stream 从数据流中移动平均值
Given a stream of integers and a window size, calculate the moving average of all integers in the sl ...
- Moving Average from Data Stream
Given a stream of integers and a window size, calculate the moving average of all integers in the sl ...
- 卡通图像变形算法(Moving Least Squares)附源码
本文介绍一种利用移动最小二乘法来实现图像变形的方法,该方法由用户指定图像中的控制点,并通过拖拽控制点来驱动图像变形.假设p为原图像中控制点的位置,q为拖拽后控制点的位置,我们利用移动最小二乘法来为原图 ...
- Objective C中的ARC的修饰符的使用---- 学习笔记九
#import <Foundation/Foundation.h> @interface Test : NSObject /** * 默认的就是__strong,这里只是做示范,实际使用时 ...
- Objective的字符串拼接 似乎没有Swift方便,但也可以制做一些较为方便的写法
NSString *str1 = @"字符串1"; NSString *str2 = @"字符串2"; //在同样条件下,Objective的字符串拼接 往往只 ...
- LeetCode Moving Average from Data Stream
原题链接在这里:https://leetcode.com/problems/moving-average-from-data-stream/ 题目: Given a stream of integer ...
- [转] 从 C 到 Objective C 入门1
转自: http://blog.liuhongwei.cn/iphone/objective-c/ 进军iPhone开发,最大的难点之一就是怪异的Objective C语法了.不过,了解之后才发现,原 ...
随机推荐
- Java [leetcode 23]Merge k Sorted Lists
题目描述: Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complex ...
- ORACLE参数文件
一.oracle pfile/spfile区别 pfile 默认的名称为“init+例程名.ora”文件路径:E:\oracle\product\10.2.0\db_1\dbs,这是一个文本文件 ...
- 【转】 C++中如何在一个构造函数中调用另一个构造函数
在C++中,一个类的构造函数没法直接调用另一个构造函数,比如: #ifndef _A_H_ #define _A_H_ #include <stdio.h> #include <ne ...
- 设计模式Day02
1.生成器模式 生成器模式也称为建造者模式.生成器模式的意图在于将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示. 生成器模式的编程步骤: (1)定义一个产品类: 由于不在该类完 ...
- (十二)学习CSS之box-sizing 属性
参考:http://www.w3school.com.cn/cssref/pr_box-sizing.asp CSS3 box-sizing 属性 定义和用法 box-sizing 属性允许您以特定的 ...
- [selenium webdriver Java]隐式的等待同步
Selenium WebDriver提供了隐式等待来同步测试.当使用了隐式等待执行测试的时候,如果WebDriver没有在DOM中找到元素,将继续等待,超出设定时间后,抛出找不到元素异常 即,当元素没 ...
- VTL说明文档
关于这个指南 这个指南是针对Velocity模版语言(VTL)的说明.更多其它的信息,请参考Velocity用户指南(http://velocity.apache.org/engine/release ...
- js中的继承2--原型继承
一. 原型与构造函数 Js所有的函数都有一个prototype属性,这个属性引用了一个对象,即原型对象,也简称原型.这个函数包括构造函数和普通函数,我们讲的更多是构造函数的原型,但是也不能否定普通函数 ...
- [LeetCode]Linked List Cycle II解法学习
问题描述如下: Given a linked list, return the node where the cycle begins. If there is no cycle, return nu ...
- EM算法原理简析——图解
一. 扯淡 转眼间毕业快一年了,这期间混了两份工作,从游戏开发到算法.感觉自己还是喜欢算法,可能是大学混了几年算法吧!所以不想浪费基础... 我是个懒得写博客的人,混了几年coding,写的博客不超过 ...