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

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

Восстановить пароль Регистрация
 
ququ_smile
1 / 1 / 0
Регистрация: 28.01.2013
Сообщений: 153
24.07.2013, 04:44     Неизвестная функция. Книга. Страуструп #1
Я видел похожу тему, но толком ответа не нашел. Сразу к делу. Есть функция 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.07.2013, 04:44     Неизвестная функция. Книга. Страуструп
Посмотрите здесь:

C++ Задача:Страуструп. 4.11.4
C++ Страуструп
C++ Страуструп
C++ неизвестная функция
Страуструп. задание C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
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
ququ_smile
1 / 1 / 0
Регистрация: 28.01.2013
Сообщений: 153
24.07.2013, 06:29  [ТС]     Неизвестная функция. Книга. Страуструп #3
У меня вопрос по двум строчкам:
1) tokens.emplace_back(c, x); - что делает функция emplace_back() и чем она отличается от push_back()?
2) auto tokens = get_tokens(); - что такое auto и зачем оно?
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
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 мин
ququ_smile
1 / 1 / 0
Регистрация: 28.01.2013
Сообщений: 153
24.07.2013, 15:59  [ТС]     Неизвестная функция. Книга. Страуструп #5
На счет auto: он помогает автоматом определять тип переменной при инициализации, да?
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
24.07.2013, 16:00     Неизвестная функция. Книга. Страуструп #6
ququ_smile, да, именно при инициализации.
Например, вот такое недопустимо:
C++
1
auto x;
ququ_smile
1 / 1 / 0
Регистрация: 28.01.2013
Сообщений: 153
24.07.2013, 20:08  [ТС]     Неизвестная функция. Книга. Страуструп #7
А обязательно было писать auto? Нельзя написать std::vector <Token> tokens = get_tokens() ?

Добавлено через 19 минут
Да и почему-то когда я пишу auto token; мне компилятор выдает, мол у token нет идентефикатора типа
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
24.07.2013, 20:14     Неизвестная функция. Книга. Страуструп #8
Цитата Сообщение от ququ_smile Посмотреть сообщение
А обязательно было писать auto? Нельзя написать std::vector <Token> tokens = get_tokens() ?
можно писать и так. просто с auto получается короче)
Цитата Сообщение от ququ_smile Посмотреть сообщение
Да и почему-то когда я пишу auto token; мне компилятор выдает, мол у token нет идентефикатора типа
скорее всего нет поддержки C++11
ququ_smile
1 / 1 / 0
Регистрация: 28.01.2013
Сообщений: 153
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' . И как мне обращаться к элементам класса?
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
24.07.2013, 20:24     Неизвестная функция. Книга. Страуструп #10
C++
1
token[i].kind
ququ_smile
24.07.2013, 20:38  [ТС]
  #11

Не по теме:

Мир - боль

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");
    }
}
ququ_smile
1 / 1 / 0
Регистрация: 28.01.2013
Сообщений: 153
25.07.2013, 00:20  [ТС]     Неизвестная функция. Книга. Страуструп #13
До момента первого использования этой функции, того что вы написали нет... Я проверял несколько раз. Но спасибо, мне это очень помогло.
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 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;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.07.2013, 02:27     Неизвестная функция. Книга. Страуструп
Еще ссылки по теме:

Книга после Бьярне Страуструп C++
Неизвестная функция C++
Книга Страуструп Программирование Принципы и практика C++

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

Или воспользуйтесь поиском по форуму:
Belfegor
Ghost
 Аватар для Belfegor
172 / 172 / 6
Регистрация: 16.09.2012
Сообщений: 524
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
}
Yandex
Объявления
25.07.2013, 02:27     Неизвестная функция. Книга. Страуструп
Ответ Создать тему
Опции темы

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