Почему использование безымянного объекта дает ошибку?

Я новичок в Java (работаю на Android). Я видел код, как,

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

Здесь безымянный (Я не уверен, что использую правильную терминологию) объект используется для вызова метода execute объекта 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 ++?

Благодарю.

1

Решение

Как уже говорилось в комментариях, вам не хватает скобок, необходимых для вызова метода.

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;… К ОП: не надо!

7

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]