2016-02-05 2 views
1

Я создал класс, который в основном служит публичной структурой в этом примере, и, скажем, имя класса X. Я хочу объявить локальный объект в главной функции. Короткий вариант моего вопроса: я знаю, что мы можем сделать X foo;, но я думаю, что X foo(); (прикрепите пару круглых скобок) должен работать, и я думал, что первое использование на самом деле является сокращением второго использования. Весь код приведен ниже:Почему скобка после объявления переменной объекта вызывает ошибку (C++)?

#include <iostream> 

using namespace std; 

class X { 
    public: 
     int val1; 
     int val2; 
}; 

int main() { 
    X a; 
    X b(); // A warning here 
    X *c = new X; 
    X *d = new X(); 

    cout << "val of a: " << a.val1 << " " << a.val2 << endl; 
    cout << "val of b: " << b.val1 << " " << b.val2 << endl; // Compile error 
    cout << "val of c: " << c->val1 << " " << c->val2 << endl; 
    cout << "val of d: " << d->val1 << " " << d->val2 << endl; 

    return 0; 
} 

И компилятор жалуется:

11_stack.cpp:16:6: warning: empty parentheses interpreted as a function declaration [-Wvexing-parse] 
     X ab(); 
      ^~ 
11_stack.cpp:16:6: note: replace parentheses with an initializer to declare a variable 
     X ab(); 
      ^~ 
      {} 
11_stack.cpp:22:26: error: use of undeclared identifier 'b' 
     cout << "val of b: " << b.val1 << " " << b.val2 << endl; 
           ^
11_stack.cpp:22:43: error: use of undeclared identifier 'b' 
     cout << "val of b: " << b.val1 << " " << b.val2 << endl; 
               ^
1 warning and 2 errors generated. 

Мои первоначальные предположения являются следующие:

  1. В любом случае, мы не должны ставить пустой скобки после объявленной переменной.
  2. Он вызывает operator().

Но позже я опроверг обе гипотезы. Мы можем видеть первое недостоверствование в коде: и X *c = new X;, и X *d = new X(); работы. Для второго, я поставил дополнительный код, как это:

a(); 

Затем я получил сообщение об ошибке компиляции:

11_stack.cpp:26:2: error: type 'X' does not provide a call operator 
     a(); 
     ^

Так что же вызвать ошибку?

Рабочая среда:

  • Mac OS 10.11.3
  • г ++ с флагом C++ 11
  • Xcode версии 7.2 (7C68)

P.S. Пожалуйста, помогите мне кажется, лучше и описательный заголовок поста, если он слишком неоднозначны ...

+0

Фактически чтение предупреждения помогло бы. –

+0

Релевантно: http://stackoverflow.com/questions/17713124/what-does-aa-mean/17713134?s=14|0.6182#17713134 –

+1

См. [Most Vexing Parse] (https://en.wikipedia.org/ вики/Most_vexing_parse); поэтому C++ 11 представил [единообразный синтаксис инициализации] (https://en.wikipedia.org/wiki/C%2B%2B11#Uniform_initialization). – ShadowRanger

ответ

0

c и d являются указателями, так что вам нужно c->val1 вместо использования ..

+1

Это даже не проблема OP, хотя она будет когда-то OP решает другую проблему – Tas

+0

Спасибо, я имел в виду -> Я скорректировал соответственно – TimeString