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

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

Войти
Регистрация
Восстановить пароль
 
ququ_smile
1 / 1 / 0
Регистрация: 28.01.2013
Сообщений: 162
#1

Неизвестная функция. Книга. Страуструп - C++

24.07.2013, 04:44. Просмотров 875. Ответов 14
Метки нет (Все метки)

Я видел похожу тему, но толком ответа не нашел. Сразу к делу. Есть функция get_token(). Она не из стандартной библиотеки, т.е. её нужно написать. Как я понял из коментов в его коде, то она должна считывать объекты класса Token из потока cin . Этой функции нет. Я не знаю что Страуструп хотел этим сказать, но не могли бы вы мне показать тело функции, которая должна считывать объекты класса Token из потока cin? Вот мой код:
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
class Token {
public:
    char kind;
    double value;
    Token(char ch) :kind(ch), value(0){}
    Token(char ch, double val) :kind(ch), value(val){}
};
 
Token get_token();
std::vector<Token> tok;
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    while(std::cin)
    {
        Token t = get_token();
        tok.push_back(t);
    }
    while(true)
    {
        start();
    }
    std::cout<<"Epic win\n";
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.07.2013, 04:44
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Неизвестная функция. Книга. Страуструп (C++):

Книга после Бьярне Страуструп - C++
а что можно почитать после Программирование: принципы и практика использования C++ , исправленное издание, Бьярне Страуструп

Книга Страуструп Программирование Принципы и практика - C++
У кого есть книга Страуструп Программирование Принципы и практика? сбросьте пожалуйста 333 страницу из книги

Неизвестная функция - C++
#include &quot;std_lib_facilities.h&quot; class Token { public: char kind; double value; Token(char ch) ...

неизвестная функция - C++
Здравствуйте ! Хочу откомпилировать код одной программы написанной на С на компиляторе borland билдер с++ 6 версии,но появлются следующие...

Страуструп. задание - C++
насколько я понял задание - есть класс class STC { unexpected_handler old; public: STC(unexpected_handler h) { ...

Страуструп и Графика - C++
Начал читать Страуструпа. По настоянию автора подключил его заголовочные файлы и библиотеку FLTK. Но программа не работает: ...

14
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 832
24.07.2013, 05:26 #2
Цитата Сообщение от ququ_smile Посмотреть сообщение
Как я понял из коментов в его коде, то она должна считывать объекты класса Token из потока cin
Наверное он имел в виду считать несколько объектов Token из потока и вернуть вектор.
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
#include <vector>
#include <iostream>
 
class Token
{
private:
    char kind;
    double value;
 
public:
    Token(char ch) :kind(ch), value(0){}
    Token(char ch, double val) :kind(ch), value(val){}
};
 
std::vector<Token> get_tokens()
{
    char c;
    double x;
    std::vector<Token> tokens;
    while (std::cin >> c && std::cin >> x)
        tokens.emplace_back(c, x);
    return tokens;
}
 
int main()
{
    auto tokens = get_tokens();
    return 0;
}
Добавлено через 1 минуту
http://ideone.com/RqKzMT
0
ququ_smile
1 / 1 / 0
Регистрация: 28.01.2013
Сообщений: 162
24.07.2013, 06:29  [ТС] #3
У меня вопрос по двум строчкам:
1) tokens.emplace_back(c, x); - что делает функция emplace_back() и чем она отличается от push_back()?
2) auto tokens = get_tokens(); - что такое auto и зачем оно?
0
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 832
24.07.2013, 07:04 #4
1)
emplace_back форвардит переданные аргументы (char, double) конструктору Token создавая обьект в конце вектора.
push_back создает копию переданного обьекта(const Token&) в конце вектора. Разницы в производительности, благодаря семантике перемещения, вообще никакой.
push_back( Token(c,x) ) тоже самое, что push_back( {c,x} ) и тоже самое, что emplace_back({c,x}) тоже самое, что emplace_back( Token(c,x) ). Эти 4 варианта используют перемещающий конструктор класса Token (и аналогично аргументы конструктора, если они временные обьекты) для смены владельца. Но emplace_back(c,x) использует перемещающие конструкторы переданных аргументов (если переданный аргумент - временный, в противном случае - копирующий) для перемещения их в конструктор Token. И на том месте конструируется обект Token.
Вообще, не вникайте пока что. Юзайте push_back({})

2) auto подставляет необходимый тип переменной. Погуглите. Там на 5 мин
2
ququ_smile
1 / 1 / 0
Регистрация: 28.01.2013
Сообщений: 162
24.07.2013, 15:59  [ТС] #5
На счет auto: он помогает автоматом определять тип переменной при инициализации, да?
0
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 832
24.07.2013, 16:00 #6
ququ_smile, да, именно при инициализации.
Например, вот такое недопустимо:
C++
1
auto x;
0
ququ_smile
1 / 1 / 0
Регистрация: 28.01.2013
Сообщений: 162
24.07.2013, 20:08  [ТС] #7
А обязательно было писать auto? Нельзя написать std::vector <Token> tokens = get_tokens() ?

Добавлено через 19 минут
Да и почему-то когда я пишу auto token; мне компилятор выдает, мол у token нет идентефикатора типа
0
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 832
24.07.2013, 20:14 #8
Цитата Сообщение от ququ_smile Посмотреть сообщение
А обязательно было писать auto? Нельзя написать std::vector <Token> tokens = get_tokens() ?
можно писать и так. просто с auto получается короче)
Цитата Сообщение от ququ_smile Посмотреть сообщение
Да и почему-то когда я пишу auto token; мне компилятор выдает, мол у token нет идентефикатора типа
скорее всего нет поддержки C++11
0
ququ_smile
1 / 1 / 0
Регистрация: 28.01.2013
Сообщений: 162
24.07.2013, 20:23  [ТС] #9
еще один вопрос: вот у меня есть класс
Token :
C++
1
2
3
4
5
6
7
8
class Token {
public:
    char kind;
    double value;
    Token(char ch) :kind(ch), value(0){}
    Token(char ch, double val) :kind(ch), value(val){}
    Token(double val) : kind('0'), value(val){}
};
Объекты которого состоят из объектов типа char и double. Если я захочу вывести один объект класса Token, который является елементом вектора, то как мне это сделать? Этот вариант моему компилятору не нравится(23 строка):
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
std::vector<Token> get_token()
{
    char ch;
    double val;
    int i=0;
    std::vector<Token> tokens;
    while(std::cin>>ch && std::cin>>val)
    {
        if(i==3) break;
        tokens.push_back({ch,val});
        i++;
    }
    return tokens;
}
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    std::cout<<"Вводи вектор, засранец \n";
    std::vector<Token> token = get_token();
    for(unsigned int i=0; i<token.size();i++)
        std::cout<<token.kind[i]<<' '<<token.value[i]<<std::endl; //2  ошибки (см. ниже)
    while(true)
    {
        start();
    }
    std::cout<<"Epic win\n";
    return 0;
}
error: 'class std::vector<Token>' has no member named 'kind' и error: 'class std::vector<Token>' has no member named 'value' . И как мне обращаться к элементам класса?
0
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 832
24.07.2013, 20:24 #10
C++
1
token[i].kind
0
ququ_smile
24.07.2013, 20:38  [ТС]
  #11

Не по теме:

Мир - боль

0
Discoverer
16 / 14 / 2
Регистрация: 05.07.2013
Сообщений: 27
24.07.2013, 21:05 #12
Читайте книгу внимательней. Там все есть.
Скопировал, но не гарантирую, что поможет Вам:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Token get_token()    // read a token from cin
{
    char ch;
    cin >> ch;    // note that >> skips whitespace (space, newline, tab, etc.)
 
    switch (ch) {
    case '(': case ')': case '+': case '-': case '*': case '/': 
        return Token(ch);        // let each character represent itself
    case '.':
    case '0': case '1': case '2': case '3': case '4':
    case '5': case '6': case '7': case '8': case '9':
        {    
            cin.putback(ch);         // put digit back into the input stream
            double val;
            cin >> val;              // read a floating-point number
            return Token('8',val);   // let '8' represent "a number"
        }
    default:
        error("Bad token");
    }
}
1
ququ_smile
1 / 1 / 0
Регистрация: 28.01.2013
Сообщений: 162
25.07.2013, 00:20  [ТС] #13
До момента первого использования этой функции, того что вы написали нет... Я проверял несколько раз. Но спасибо, мне это очень помогло.
0
Kuzia domovenok
1892 / 1747 / 119
Регистрация: 25.03.2012
Сообщений: 5,936
Записей в блоге: 1
25.07.2013, 02:11 #14
Цитата Сообщение от Olivеr Посмотреть сообщение
2) auto подставляет необходимый тип переменной. Погуглите. Там на 5 мин
Вообще-то auto это по стандарту спецификатор класса памяти.
То есть чтобы объявить локальную переменную в функции main можно писать
C++
1
2
3
4
5
6
auto int z=0;//ошибка! переменные надо объявлять в функции main!
int main(){
  auto int x=0;//так правильно!
  auto y=0;//ошибка! не указан тип int
  return 0;
}
0
Belfegor
Ghost
173 / 173 / 6
Регистрация: 16.09.2012
Сообщений: 526
25.07.2013, 02:27 #15
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Вообще-то auto это по стандарту спецификатор класса памяти.
Под auto подразумевался спецификатор хранения переменной. То есть, auto находился в одном ряду с register, static, extern, и указывал на то, что переменная имеет локальное время жизни. Об этом почти не знают начинающие, так как любая переменная объявленная в некотором блоке неявно определяется как auto.
Например, следующие два объявления абсолютно идентичны:
C++
1
2
3
4
5
void foo()
{
    auto int x = 0;  // явно указывается `auto`
    int y = 0;       // не явно указывается `auto`
}
Стандарт C++11 принес более полезное значение этому ключевому слову. Теперь auto позволяет не указывать тип переменной явно. За определение типа отвечает компилятор, который вычисляет его на основе типа инициализируемого значения.
C++
1
2
3
4
5
6
7
void foo()
{
    auto x = 5;  // тип переменной x будет int
    x = "foo";   // ошибка! не соответствие типов
 
    auto y = 4, z = 3.14; // ошибка! нельзя объявлять переменные разных типов
}
Введение auto ужасно повышает читабельность кода, так как теперь нет необходимости писать длинные шаблонные типы. Например, при получении итератора:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
// c++03 решение
for (std::vector<std::map<int, std::string>>::const_iterator it = container.begin();
     it != container.end();
     ++it)
{
    // do something
}
 
// c++11 решение
for (auto it = container.begin(); it != container.end(); ++it)
{
    // do something
}
0
25.07.2013, 02:27
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.07.2013, 02:27
Привет! Вот еще темы с ответами:

Задача:Страуструп. 4.11.4 - C++
1.Напишите программу,которая печатает символы от 'a' до 'z' и цифры от '0' до '9' и их целые значения. 2.Проделайте то же самое для...

Страуструп или С++ за 21 дней? - C++
Народ,подскажите,что лучше страуструп или Вильямс?мне кажется мне щас подойдет Вильямс,я думаю что щас нуждаюсь в основе...

Страуструп. Грамматики. Парсер - C++
Собственно начал читать этого дядьку и наткнулся на парсер. Он объясняет суть парсинга с использование грамматик. Однако с грамматиками я...

дайте подсказку. Страуструп - C++
10. (*2) Напишите класс или шаблон, подходящий для реализации обратного вызова. 11. (*2.5) Напишите класс Lock (блокировка) для...


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

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

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