我有一个包含成员的堆栈类和一个名为push的函数。
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);通过MACRO替换
答案 0 :(得分:5)
首先要做的事情!声明:
s1.push(3);
未翻译为:
s1.push(this, 3);
但对于这样的事情:
STACK::push(&s1, 3);
其中STACK::push
可以在class / namespace STACK
下被视为全局/名称空间或静态函数,其原型将是:
push(STACK const* pThis, int arg);
this
指针始终是方法(函数)的第一个参数。如果method有零参数,它仍然有一个参数(类的this
指针)。
答案 1 :(得分:3)
没有魔法
s1.push(3);
只是
的语法STACK::push(&s1, 3);
答案 2 :(得分:0)
this = &s1
s1的地址是已知的,因此可以传递给STACK :: push。就这么简单:)
答案 3 :(得分:0)
C ++并不完全转换语句(因为C ++是一种语言规范,你可以通过多种方式实现该语言,甚至是 - 与一群奴隶在纸上工作;你不需要计算机,即使你想要一个,拥有C ++)。编译器(例如GCC)将语句转换为某些其他较低级别的表示。对于GCC,它是Gimple语句,并且可以检查Gimple表示,例如使用MELT's probe或-fdump-tree-gimple以及其他选项(例如-fdump-tree-all
或-fdump-tree-ssa
等...)
答案 4 :(得分:0)
不幸的是,您必须在C中显式或隐式指定指针。
对于C ++,编译器有责任将隐式this
指针设置为类成员函数的参数。在您的代码中,成员函数在编译时自动编译为void STACK::push(STACK*, int)
,然后,当调用成员函数STACK::push
时,编译器将设置对象地址(this
)作为成员函数STACK::push
的参数(通常是第一个)。
没有C编译器会提供上述功能,因此,用户有责任设置指针。
答案 5 :(得分:0)
编辑完成后,问题会出现另一个问题--C中的OOP。这很难且类型不安全,但可以实现。你可以看看GObject库,它提供了C语言中的对象系统。我猜它会大量使用宏。