Я компилировал программу C++ в Cygwin с помощью g ++, и у меня был класс, у конструктора которого не было аргументов. У меня были строки:
MyClass myObj();
myObj.function1();
И при попытке скомпилировать его, я получил сообщение:
error: request for member 'function1' in 'myObj', which is of non-class type 'MyClass ()()'
После небольшого исследования я нашел, что фиксация должна была изменить ту первую строку на
MyClass myObj;
Я мог поклясться, что сделал объявления пустого конструктора с круглыми скобками в C++ прежде. Это - вероятно, ограничение компилятора, я использую или делаю стандарт языка, действительно говорят, не используют круглые скобки для конструктора без аргументов?
Всегда начинается с измерения. Пока вы не знаете, где какие-то узкие места, вы не знаете, что улучшить. «Даже не просмотрев какие-либо данные о производительности» вы вряд ли сделаете правильный звонок - или, по крайней мере, я часто нахожу, что я делаю неверные догадки о том, где производительность вредит. Может быть, вы лучше догадываетесь, чем я:) (Конечно, это вполне может быть в базе данных в вашем коде...)
Измерительные инструменты могут быть такими же простыми, как операторы журнала, чтобы увидеть, сколько времени занимает различные типы запросов, к полным профилировщикам, анализаторам запросов и т.д. На стороне базы данных вы почти наверняка захотите использовать ПОЯСНИТЬ для просмотра планов выполнения запроса... но перед этим вы захотите узнать, какие запросы вредят вам в первую очередь, и более того, какие запросы к самой веб-службе являются дорогостоящими.
-121--4667582-Стандарт не требует круглых скобок.
int* x = new int;
- правовой синтаксис.
В вашем случае myobj ();
является прототипом функции. В то время как myobj;
является переменной.
Хотя MyClass myObj ();
может быть проанализировано как определение объекта с пустым инициализатором или объявлением функции, стандарт языка указывает, что неоднозначность всегда разрешается в пользу объявления функции. Инициализатор в пустых скобках допускается в других контекстах, например, в выражении new
или при создании временного инициализируемого значением .
Это называется самой сложной проблемой парсинга. Когда парсер видит
MyClass myObj();
он думает, что вы объявляете функцию под названием myObj
, которая не имеет параметров и возвращает MyClass
.
Чтобы обойти это, используйте:
MyClass myObj;
Это является довольно известной проблемой и не зависит от компилятора. По сути, вы объявляли функцию, возвращающую тип MyObj. Неудивительно, что вы не могли вызвать ее конструктор. См. C ++ faq lite за хорошее объяснение
Еще один самый-вечный-разбор. Смотрите, например, Sort function does not work with function object created on stack?
Ваша строка заставляет компилятор думать, что вы объявляете функцию с именем myObj
, которая не принимает аргументов и возвращает MyClass
. Это разрешение двусмысленности действительно раздражает.
Стандарт не требует скобок.
int* x = new int;
- это допустимый синтаксис.
В вашем случае myclass myobj ();
является прототипом функции. В то время как myclass myobj;
- это переменная.
Я нашел это в стандарте C++ (§8.5.8):
Объект, инициализатором которого является пустой набор круглых скобок, т.е. (), должен быть инициализирован значением.
[Примечание: поскольку () не допускается синтаксис для инициализатора,
X a ();
является не объявлением объекта класса X, а объявление функции, не принимающей аргумента и возвращающей X. Форма () допускается в некоторых других контекстах инициализации (5.3.4, 5.2.3, 12.6.2). -конец примечания ]
MyClass myObj();
Это проанализировано как объявление функции, функция называется myObj, не принимает аргументов и возвращает объект MyClass. Я никогда не видел, чтобы компилятор принимал это. С другой стороны, MyClass * myPtr = new MyClass ();
приемлемо, может быть, это вас запутало?