1

我是 Java 新手(在 Android 上工作)。我见过这样的代码,

new DownloadFilesTask().execute(url1, url2, url3);

这里无名(我不确定我是否使用了正确的术语)对象用于调用 DownloadFilesTask 对象的执行方法。

同样,我尝试与 C++ 一起使用,以下是代码片段。

#include <iostream>
#include <vector>

using namespace std;

class Sam
{
public:
    void Access()
    {
        cout<<"Access";
    }
};

int main(int argc, char* argv[])
{
    (new Sam())->Access; //for Access method intillesence is working fine

    return 0;
}

当我尝试运行此代码时,出现编译错误,

错误 1 ​​错误 C3867:“Sam::Access”:函数调用缺少参数列表;使用 '&Sam::Access' 创建指向成员 c:\users\new-user\documents\visual studio 2012\projects\autoexample\autoexample\autoexample.cpp 18 1 autoExample 的指针

我不明白错误的含义和原因。这种类型的代码在 C++ 中是否可行?

谢谢。

4

1 回答 1

7

正如评论中所说,您缺少调用该方法所需的括号。

Access()
//    ^^ These

但是,这里要解决的一个更重要的问题是您使用new. 不要像现在一样使用它。通过这种方式使用它,您正在创建一个您永远无法希望回收的内存泄漏,因为您永远没有机会使用delete[1](除非您关闭您的程序......)。

要在 C++ 中使用临时对象,只需使用基于堆栈的自动存储对象(换句话说,普通对象):

  Sam().Access();
//^^^^^ This creates the temporary object

但是,您仍然必须注意不要在后续语句中使用该临时语句,这是在将它们与引用混合时经常遇到的问题。

Sam& bad_sam = Sam().I_Return_A_Reference_To_This_Object();
bad_sam.Access();   // Oh no!

在上面的例子中,由创建的临时对象Sam()将在语句结束时被销毁(因此是临时的)。bad_sam.Access();将是非法的,并会导致未定义的行为


[1] 啊哼说语言律师。当然你可以使用delete this;... 对 OP:不要!

于 2013-11-12T06:42:55.030 回答