Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Dani
1393 / 637 / 57
Регистрация: 11.08.2011
Сообщений: 2,290
Записей в блоге: 2
Завершенные тесты: 1
#1

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

05.07.2013, 13:49. Просмотров 510. Ответов 9
Метки нет (Все метки)

Есть код:
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.
В чем проблема, если поставить скобки?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.07.2013, 13:49
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Конструктор и скобки (C++):

Для каждой открывающей скобки найти позицию ей соответствующей закрывающей скобки - C++
Доброго времени суток. Подскажите пожалуйста алгоритм или путь к решению задачи, используя СТЕК Дана ПСП, ваша задача для каждой...

Фигурные скобки: Мне пишут что ошибка в закрытие скобки после return. - C++
#include &lt;iostream&gt; using namespace std; int main(){ int *ptr_number = new int; int *sum = new int(0); cin &gt;&gt; *ptr_number; ...

Дана строка, содержащая латинские буквы и скобки. Если скобки расставлены правильно - вывести 0. Иначе - номер позиции, где есть ошибочная скобка - C++
Дана строка, содержащая латинские буквы и круглые скобки. Если скобки расставлены правильно (то есть каждой открывающей соответству-ет одна...

Не могу сделать чтобы класс содержал основной конструктор и конструктор копирования - C++
Разработать класс ThreeAngle для работы с плоскими треугольниками. В качестве членов-данных задаются длины трех сторон треугольника. Класс...

this(Всегда ли вызывается конструктор при не явной передачи объекта в конструктор) - C++
class Test { int i; public: void test(int i) { this -&gt; i = i; } }; Конструктор Test::Test всегда вызывается...

Будет ли определен компилятором конструктор по умолчанию, если есть конструктор с дефолтным параметром? - C++
Добрый день, сразу к делу, есть некий класс class some { int x; public: some(int y = 1) : x(y) {} };

9
Toshkarik
1143 / 860 / 51
Регистрация: 03.08.2011
Сообщений: 2,390
Завершенные тесты: 1
05.07.2013, 13:53 #2
Все, что похоже на объявление функции им и является. В данном случае Point b(); является объявлением функции, а не созданием объекта.
2
Dani
1393 / 637 / 57
Регистрация: 11.08.2011
Сообщений: 2,290
Записей в блоге: 2
Завершенные тесты: 1
05.07.2013, 13:57  [ТС] #3
Что-то я не понял. Это тоже похоже на функцию, но это компилится:
C++
1
2
3
4
int main()
{
    int b();
}
0
Toshkarik
1143 / 860 / 51
Регистрация: 03.08.2011
Сообщений: 2,390
Завершенные тесты: 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;
}
1
Dani
1393 / 637 / 57
Регистрация: 11.08.2011
Сообщений: 2,290
Записей в блоге: 2
Завершенные тесты: 1
05.07.2013, 14:05  [ТС] #5
Ага, а почему компилятор в первом случае (с Point) определил, что Point b() это функция, в моем примере с int a() - что это переменная, а в твоем опять как функцию?
0
Schizorb
510 / 462 / 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;
А это тоже типа компилится?
2
Toshkarik
1143 / 860 / 51
Регистрация: 03.08.2011
Сообщений: 2,390
Завершенные тесты: 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;
}
1
Dani
1393 / 637 / 57
Регистрация: 11.08.2011
Сообщений: 2,290
Записей в блоге: 2
Завершенные тесты: 1
05.07.2013, 14:12  [ТС] #8
ааа... получается, что просто вместо Type variable() писать Type variable чтобы вызвать конструктор по умолчанию и избежать этого расценивания компилятором как функцию, да?
0
Toshkarik
1143 / 860 / 51
Регистрация: 03.08.2011
Сообщений: 2,390
Завершенные тесты: 1
05.07.2013, 14:15 #9
Ну, как бы да.
1
120°
12 / 10 / 1
Регистрация: 01.07.2013
Сообщений: 62
05.07.2013, 14:25 #10
А у меня компилируется со скобками, но появляется предупреждение
C++
1
Point b();  // warning C4930: Point b(void): функция с прототипом не вызвана (предполагалось определение переменной?)
и конструктор не вызывается
0
05.07.2013, 14:25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.07.2013, 14:25
Привет! Вот еще темы с ответами:

Создать класс. Написать конструктор по умолчанию, конструктор с параметрами. Перегрузить операции «меньше» и «равно» - C++
Помогите пожалуйста, хоть с одним из заданий. 1. Создать класс. Написать конструктор по умолчанию, конструктор с параметрами....

Не могу правильно сделать конструктор и конструктор копирования и принадлежность точки с заданными координатами треугольнику - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;windows.h&gt; #include &lt;math.h&gt; #include &lt;algorithm&gt; using...

Можно ли использовать конструктор по умолчанию и конструктор инициализации одновременно? - C++
Можно ли использовать конструктор по умолчанию и конструктор инициализации одновременно?

Конструктор производного класса требует конструктор предка - C++
Выдаёт вот такую вот ошибку: no matching function for call to 'Cube::Cube()' class Cube { protected: int magInt; bool...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru