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

Ошибка в методе, как исправить? - C++

Восстановить пароль Регистрация
 
main.c
24 / 24 / 4
Регистрация: 05.04.2012
Сообщений: 233
10.06.2012, 14:20     Ошибка в методе, как исправить? #1
C++
1
2
3
4
5
6
7
void Point::Read()
{
    int _x,_y;
    cin>>"(">>_x>>",">>_y>>")";
    SetX(_x);
    SetX(_y);
}
Вот метод класса Point, хотел вводить координаты в формате (10,20), само собой надо пропускать (,)
Но компилятор выдаёт:
C++
1
error C2678: бинарный ">>": не найден оператор, принимающий левый операнд типа "std::istream" (или приемлемое преобразование отсутствует)
Как мне это исправить?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.06.2012, 14:20     Ошибка в методе, как исправить?
Посмотрите здесь:

Ошибка, не знаю как исправить C++
C++ Ошибка в методе, помогите исправить
ошибка подскажите как исправить!! C++
в чём ошибка ? и как исправить ? C++
C++ в чём ошибка и как ёё исправить?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
soft.creator
 Аватар для soft.creator
103 / 103 / 4
Регистрация: 17.10.2010
Сообщений: 283
10.06.2012, 14:21     Ошибка в методе, как исправить? #2
Думаю, что допустимо только
C++
1
cin >> _x >> _y;
Скорее всего, компилятор не понимает, как ему ввести данные в константные строки.
Что касается исправления, я бы считал весь ввод в строку, заменил символы (), на пробелы, и ввел _x и _y через std::istringstream.
main.c
24 / 24 / 4
Регистрация: 05.04.2012
Сообщений: 233
10.06.2012, 14:27  [ТС]     Ошибка в методе, как исправить? #3
Ну должен же быть способ,например в Си это бы выглядело:
C
1
scanf("(%d,%d)",&_x,&_y);
В паскале тоже есть подобная штука, в большинстве языков это есть, и в С++ по-любому есть, просто я что-то не так делаю.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
10.06.2012, 14:34     Ошибка в методе, как исправить? #4
Цитата Сообщение от main.c Посмотреть сообщение
Ну должен же быть способ,например в Си это бы выглядело:
C
1
scanf("(%d,%d)",&_x,&_y);
В паскале тоже есть подобная штука, в большинстве языков это есть, и в С++ по-любому есть, просто я что-то не так делаю.
Паскаль тоже вводит не что попало и не позволяет мешать клавиатурный ввод с готовыми константами. Вообще ни один язык этого не умеет. А сканф - функция, она как раз так и делает: вводит строку и парсит по указанному ей шаблону. Подпрограмму форматированного ввода можно сделать на чём угодно, хоть на асме. К языку это не имеет ни какого отношения.
main.c
24 / 24 / 4
Регистрация: 05.04.2012
Сообщений: 233
10.06.2012, 14:36  [ТС]     Ошибка в методе, как исправить? #5
Цитата Сообщение от taras atavin Посмотреть сообщение
А разве можно вводить в стринготоерминальную константу? Введи нормально строку и парсь её на составляющие.
Само собой нельзя вводить в константу, но cin так же как и scanf умеет пропускать символы во входном потоке, когда найду как,я напишу.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
10.06.2012, 14:44     Ошибка в методе, как исправить? #6
Если б умел, то не также. scanf парсит по шаблону всё, что ему подсовывают, а не пропускает.

Добавлено через 2 минуты
Кури парсинг и регулярные выражения.
main.c
24 / 24 / 4
Регистрация: 05.04.2012
Сообщений: 233
10.06.2012, 14:50  [ТС]     Ошибка в методе, как исправить? #7
Цитата Сообщение от taras atavin Посмотреть сообщение
Если б умел, то не также. scanf парсит по шаблону всё, что ему подсовывают, а не пропускает.
Ну я имел ввиду не то, что реализация такая же, а то что цель у них одна.
Но всё равно спасибо.
Bers
Заблокирован
10.06.2012, 14:58     Ошибка в методе, как исправить? #8
Цитата Сообщение от main.c Посмотреть сообщение
Само собой нельзя вводить в константу, но cin так же как и scanf умеет пропускать символы во входном потоке, когда найду как,я напишу.
Входной поток тут не причем. Смотри:

cin >> val;

Аналогично: cin.GetVal(val);

Другими словами, val здесь - просто переменная некоторого типа, которую ты скармливаешь объекту класса, и который туда что-то пытается записать.

Теперь так:

cin.GetVal("trololo"); //попытка записать в константу.

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

cin.GetVal("trololo"); //теперь можно, но происходить ничего не будет

Однако не понятно: какое право имеет на существование метод, который принимает нелогичные аргументы, и ничего не делает. Зачем нужно такое извращение?

Реально, ты можешь сам сделать перегрузки для стандартных стримов, и оно заработает.
Однако, есть предположение, что если тебе такое понадобилось, то возможно, тебе стоит ещё раз переосмыслить свои взаимоотношения с логикой и здравым смыслом.

В действительности же, есть правило: то, чего быть не должно, не должно произойти в принципе.
Это превентивная форма защиты от возможных ошибок.

То бишь, если в константу писать нельзя. Значит не должно быть даже способа это сделать, и даже намека на него. Поэтому стандартные стримы не обладают таким идиотским методом. И не предоставляют "сомнительные возможности" ценой потери здравого смысла.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
10.06.2012, 15:08     Ошибка в методе, как исправить? #9
Как уже говорили, можно воспользоваться регулярками
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <string>
#include <boost/regex.hpp>
 
int main()
{
    std::string str;
    std::getline(std::cin, str);
    boost::regex reg("^\\((\\d+), ?(\\d+)\\)$");
    boost::smatch res;
    if(boost::regex_match(str, res, reg))
        std::cout << res[1] << ' ' << res[2] << std::endl;
    else
        std::cout << "Wrong input" << std::endl;
}
Bers
Заблокирован
10.06.2012, 15:11     Ошибка в методе, как исправить? #10
Цитата Сообщение от soon Посмотреть сообщение
Как уже говорили, можно воспользоваться регулярками
Пардоне.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
10.06.2012, 15:19     Ошибка в методе, как исправить? #11
Попробуй так:
Попробуй так:
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
class Point
{
 ...
 friend std::ifstream &operator >> (std::ifstream &s, Point p);
 ...
};
...
std::ifstream &operator >> (std::ifstream &s, Point p)
{
 int ib;
 std::string b;
 s>>b;
 unsigned int i, L, start, end, delimetr;
 flag fs, fd, fe;
 char c;
 for (fs=false, fd=false, fe=false, L=s.lenght(), i=1; i<=L; ++i)
 {
  c=s[i];
  switch (с)
  {
   case '(': start   =i;
             fs      =true;
             break;
   case ',': delimetr=i;
             fd      =true;
             break;
   case ')': end     =i;
             fe      =true;
             break;
  }
  if (fe)
  {
   break;
  }
 }
 if (fs&&fd&&fe&&(end>delimetr)&&(delimetr>start))
 {
  for (i=start+1, i<delimetr; ++i)
  {
   c=s[i];
   switch (с)
   {
    case '0':
    case '1':
    case '2':
    case '3':
    case '4':
    case '5':
    case '6':
    case '7':
    case '8':
    case '9':
    case 'e':
    case 'E':
    case '+':
    case '-': putback (c);
   }
  }
  s>>ib;
  SetX(ib);
  for (i=delimetr+1, i<end; ++i)
  {
   c=s[i];
   switch (с)
   {
    case '0':
    case '1':
    case '2':
    case '3':
    case '4':
    case '5':
    case '6':
    case '7':
    case '8':
    case '9':
    case 'e':
    case 'E':
    case '+':
    case '-': putback (c);
   }
  }
  s>>ib;
  SetX(ib);
  for (i=end+1, i<=L; ++i)
  {
   putback (s[i]);
  }
  return s;
 }
 for (i=1, i<=L; ++i)
 {
  putback (s[i]);
 }
 return s;
}
Добавлено через 4 минуты
Цитата Сообщение от Bers Посмотреть сообщение
Однако, есть предположение, что если тебе такое понадобилось, то возможно, тебе стоит ещё раз переосмыслить свои взаимоотношения с логикой и здравым смыслом.
Тебе. Точка - единый объект, в математике его принято писать в скобках и через запятую и логично именно такой интерфейс и предоставить, то есть, если пользователь хочет сказать программе, что точка имеет координаты x=10, y=20, то он должен ввести
Код
(10, 20)
, а не
Код
10
20
. Пользователя учить не надо, это программа должна вести себя, как пользователю привычней.
soon
10.06.2012, 15:21
  #12

Не по теме:

Цитата Сообщение от Bers Посмотреть сообщение
Пардоне.
Поясните, не понял. Я всего лишь дополнил слова taras atavin

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.06.2012, 15:26     Ошибка в методе, как исправить?
Еще ссылки по теме:

Нужно чтобы введённый студент в методе in вывелся на экран как в методе out C++
C++ Ошибка в методе обрабатывающем бинарное дерево
Организация поиска в списке. Исправить ошибку в методе поиска C++

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

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
10.06.2012, 15:26     Ошибка в методе, как исправить? #13
Я обошолся без регулярки.

Добавлено через 2 минуты
Но мой оператор парсит.
Yandex
Объявления
10.06.2012, 15:26     Ошибка в методе, как исправить?
Ответ Создать тему
Опции темы

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