为什么使用无名对象会出错?

时间:2013-11-12 06:36:41

标签: java c++ compiler-errors language-features

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

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

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

同样我尝试使用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':函数调用缺少参数   列表;使用'&amp; Sam :: Access'创建指针   成员c:\ users \ new-user \ documents \ visual studio   2012 \ projects \ autoexample \ autoexample \ autoexample.cpp 18 1 autoExample

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

感谢。

1 个答案:

答案 0 :(得分: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] Ahem 说语言律师。当然你可以使用delete this; ...对OP:不要!