我有成员Stack类和一个名为推送功能。
class STACK
{
int data;
public:
void push(int x)
{
data=x;
}
}
是什么c + +做这个声明转换:
s1.push(3);
至
s1.push(this,3);
基本上我的问题是引擎盖下会发生什么,生成this
指针,把它作为一个隐藏的参数?
其实我在C编码我的目标是有一个程序,它是接近OOP越好。 为此,我有函数指针作为结构的成员。 因此,我想知道是否有可能以某种方式有跟踪哪些结构调用的函数(如“this”指针)。 我不想做这样的事情:s1.push(s1,3); 因为被它打败了我的目的。
是否有可能转换s1.push(3); 到s1.push(1,3); 经由宏替换
首先第一件事情! 该声明:
s1.push(3);
是不是翻译为:
s1.push(this, 3);
但是,为了这样的事情:
STACK::push(&s1, 3);
其中STACK::push
可视为全球/或命名空间下的类/命名空间的静态函数STACK
,它的原型是:
push(STACK const* pThis, int arg);
在this
指针总是第一个参数的方法(功能)。 如果方法具有零的说法,它仍然有一个参数( this
指针类的)。
this = &s1
S1的地址是已知的,因此它可以通过堆叠::推。 就这么简单:)
C ++不完全转换报表(因为C ++是一门语言规范,你可以实现在许多方面是语言,甚至在纸上工作的奴隶人口-unethically-,你并不需要一台电脑,即使你想一个,有C ++)。 编译器(如GCC)转换语句的一些其他低层表示。 与海湾合作委员会,这是GIMPLE语句,GIMPLE表示可以进行检查,例如用MELT的探头或-fdump树,GIMPLE和其他选项(如-fdump-tree-all
或-fdump-tree-ssa
等...)
不幸的是,你必须明确或隐含指定C.指针
对于C ++,它是编译器的责任来设置隐含this
指针作为一个类成员函数的参数。 在你的代码中,成员函数错位为void STACK::push(STACK*, int)
由编译器自动编译,那么,当成员函数STACK::push
被调用时,编译器将设置目标地址( this
)作为参数(通常是第一一个)成员函数STACK::push
。
没有C编译器将提供上述功能,因此,它是用户的责任来设置指针。
您的编辑后,这个问题占用了另一个问题 - 在OOP C.这是困难的,类型不安全,但有可能实现。 你可以看一下GObject的库,它提供了对象系统C.我想这是大量使用宏。