Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
1 / 1 / 3
Регистрация: 28.01.2013
Сообщений: 169
1

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

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

Author24 — интернет-сервис помощи студентам
Я видел похожу тему, но толком ответа не нашел. Сразу к делу. Есть функция 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.07.2013, 04:44
Ответы с готовыми решениями:

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

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

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

неизвестная функция
Здравствуйте ! Хочу откомпилировать код одной программы написанной на С на компиляторе borland...

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

Добавлено через 19 минут
Да и почему-то когда я пишу auto token; мне компилятор выдает, мол у token нет идентефикатора типа
0
415 / 411 / 95
Регистрация: 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
1 / 1 / 3
Регистрация: 28.01.2013
Сообщений: 169
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
415 / 411 / 95
Регистрация: 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
17 / 15 / 0
Регистрация: 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
1 / 1 / 3
Регистрация: 28.01.2013
Сообщений: 169
25.07.2013, 00:20  [ТС] 13
До момента первого использования этой функции, того что вы написали нет... Я проверял несколько раз. Но спасибо, мне это очень помогло.
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,495
Записей в блоге: 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
Ghost
174 / 174 / 40
Регистрация: 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.07.2013, 02:27
Помогаю со студенческими работами здесь

Функция CM_Request_Device_Eject из SETUPAPI.dll. Ошибка - неизвестная функция.
нужна ваша помощь есть функция CM_Request_Device_Eject при компиляции RAD 2010 матерится и выдает...

Неизвестная функция
В HTML есть строчка: &lt;form onSubmit=&quot;MakeLogin('Тут хэш'); return false;&quot;&gt; Не пойму что за...

Неизвестная функция
Да, я знаю, что подобных историй в интернете много, но я пробовал, искал, делал по теме, а исход...

Неизвестная функция Eval в выражении
Здравствуйте. Прошу подсказки, если кто знаком с проблемой: в VB.NET подключаюсь к Access через...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru