Форум программистов, компьютерный форум CyberForum.ru

Конструктор и скобки - C++

Восстановить пароль Регистрация
 
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
05.07.2013, 13:49     Конструктор и скобки #1
Есть код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <iostream>
#include <exception>
#include <istream>
#include <ostream>
 
 
class Point
{
public:
    Point () : x(0), y(0) { std::cout << "Constructor Point() called\n"; }
    Point (const int xx, const int yy) : x(xx), y(yy) { std::cout << "Constructor Point(const int, const int) called\n"; }
    int getX() { return x; }
    int getY() { return y; }
    void setX(int xx) { x = xx; }
    void setY(int yy) { y = yy; }
private:
    int x;
    int y;
};
 
 
std::istream& operator>> (std::istream& is, Point& p)
{
    int a, b;
    char t1, t2, t3; 
    is >> t1 >> a >> t2 >> b >> t3;
    
    if (t1 != '(' || t2 != ',' || t3 != ')')
    {
        is.clear(std::ios_base::failbit);
        return is;
    }
 
    p = Point(a, b);
    return is;
}
 
 
std::ostream& operator<< (std::ostream& os, Point& p)
{
    os << "(" << p.getX() << ", " << p.getY() << ")";
    return os;
}
 
 
int main()
{
    //Point a(2, 5);
    //std::cout << a << std::endl;
 
    Point b; //вот эта вот строка!
    std::cin >> b;
    std::cout << b << std::endl;
    return 0;
}
Если поставить скобки здесь: Point b(), то программа не скомпилируется и выводит ошибку
Цитата Сообщение от "Компилятор VS 2010'
error C2678: binary '>>' : no operator found which takes a left-hand operand of type 'std::istream' (or there is no acceptable conversion)
Если убрать скобки, то все гуд. Компилятор VS 2010.
В чем проблема, если поставить скобки?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
05.07.2013, 13:53     Конструктор и скобки #2
Все, что похоже на объявление функции им и является. В данном случае Point b(); является объявлением функции, а не созданием объекта.
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
05.07.2013, 13:57  [ТС]     Конструктор и скобки #3
Что-то я не понял. Это тоже похоже на функцию, но это компилится:
C++
1
2
3
4
int main()
{
    int b();
}
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
05.07.2013, 14:00     Конструктор и скобки #4
Объявлять функцию можно везде, где может быть размещен оператор. Ошибка компиляции у Вас не из за объявления функции внутри main, а из за попытки использовать имя функции как объект.

Вполне рабочий код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
 
int main() {
   int a();
   
   std::cout << a() << std::endl;
   
   return 0;
}
 
int a() {
   return 1;
}
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
05.07.2013, 14:05  [ТС]     Конструктор и скобки #5
Ага, а почему компилятор в первом случае (с Point) определил, что Point b() это функция, в моем примере с int a() - что это переменная, а в твоем опять как функцию?
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
05.07.2013, 14:07     Конструктор и скобки #6
Цитата Сообщение от Dani Посмотреть сообщение
Это тоже похоже на функцию, но это компилится:
C++
1
2
3
int b();
std::cin >> b;
std::cout << b << std::endl;
А это тоже типа компилится?
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
05.07.2013, 14:08     Конструктор и скобки #7
Dani, с чего Вы взяли, что компилятор оценил int b(); как объявление переменной? Это тоже самое объявление функции, просто она не используется и компилятору не на что ругаться. Вот так уже будет ошибка undefined reference:
C++
1
2
3
4
5
6
7
int main() {
   int b();
   
   b();
   
   return 0;
}
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
05.07.2013, 14:12  [ТС]     Конструктор и скобки #8
ааа... получается, что просто вместо Type variable() писать Type variable чтобы вызвать конструктор по умолчанию и избежать этого расценивания компилятором как функцию, да?
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
05.07.2013, 14:15     Конструктор и скобки #9
Ну, как бы да.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.07.2013, 14:25     Конструктор и скобки
Еще ссылки по теме:

C++ злые скобки
Проверка на скобки C++
Для каждой открывающей скобки найти позицию ей соответствующей закрывающей скобки C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
120°
12 / 10 / 1
Регистрация: 01.07.2013
Сообщений: 62
05.07.2013, 14:25     Конструктор и скобки #10
А у меня компилируется со скобками, но появляется предупреждение
C++
1
Point b();  // warning C4930: Point b(void): функция с прототипом не вызвана (предполагалось определение переменной?)
и конструктор не вызывается
Yandex
Объявления
05.07.2013, 14:25     Конструктор и скобки
Ответ Создать тему
Опции темы

Текущее время: 03:37. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru