0

我有一个包含成员的堆栈类和一个名为 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); 通过宏替换

4

6 回答 6

6

最重要的事情!该声明:

s1.push(3);

不翻译为:

 s1.push(this, 3);

但是对于这样的事情:

STACK::push(&s1, 3); 

whereSTACK::push可以被视为 class/namespace 下的 global/namespace 或 static 函数STACK,其原型为:

push(STACK const* pThis, int arg);

this指针始终是方法(函数)的第一个参数。如果方法的参数为零,它仍然有一个参数(this类的指针)。

于 2013-03-10T12:42:10.813 回答
3

没有魔法

s1.push(3);

只是语法

STACK::push(&s1, 3);
于 2013-03-10T12:37:12.717 回答
0
this = &s1

s1 的地址是已知的,因此可以将其传递给 STACK::push。就这么简单:)

于 2013-03-10T12:36:18.050 回答
0

C++ 不能完全转换语句(因为 C++ 是一种语言规范,您可以通过多种方式实现该语言,即使是不道德的,也有大量奴隶在纸上工作;您不需要计算机,即使您想要一台, 拥有 C++)。编译器(例如 GCC)将语句转换为其他一些较低级别的表示。使用 GCC,它是 Gimple 语句,并且可以检查 Gimple 表示,例如使用MELT 的探针-fdump-tree-gimple和其他选项(如-fdump-tree-all-fdump-tree-ssa等...)

于 2013-03-10T12:37:38.413 回答
0

在您编辑之后,这个问题又涉及到另一个问题 - C 中的 OOP。这很困难且类型不安全,但可以实现。您可以查看 GObject 库,它在 C 中提供对象系统。我猜它大量使用宏。

于 2013-03-10T17:21:03.587 回答
0

不幸的是,您必须在 C 中显式或隐式指定指针。

对于 C++,编译器负责将隐式this指针设置为类成员函数的参数。在您的代码中,成员函数void STACK::push(STACK*, int)在编译时被编译器自动修改,然后,当STACK::push调用成员函数时,编译器会将对象地址(this)设置为成员函数的参数(通常是第一个)STACK::push

没有 C 编译器会提供上述功能,因此,设置指针是用户的责任。

于 2013-03-10T13:35:14.487 回答