Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 28.05.2018
Сообщений: 21

Пустые string после присваивания значения в инициализаторе

04.06.2020, 18:36. Показов 1395. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
После инициализации TextAction и Button строки становятся пустыми. Если поставить точку остановы в конце инициализатора, то в строках есть нужное значение. Но при вызове метода buildKeyboard() из класса Keyboard все строки в Button и TextAction становятся пустыми.

Пробовал: std::copy, string.copy, вместо std::string использовать const char*, string.substr, string.c_str, string.assign, string.append

Keyboard.h
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
#pragma once
 
#include <string>
 
#include "JSON/json.h"
 
class Action {
public:
    std::string type{};
 
    virtual Json::Value toJson() = 0;
};
 
class TextAction : public Action{
private:
    std::string getPayload() {
        std::string res;
        res += "{\"command\":\"";
        res += command.c_str();
        res += "\"}";
        return res;
    }
public:
    std::string command{};
    std::string label{};
 
    TextAction(std::string label, std::string command) {
        type = "text";
        this->label = label;
        this->command = command;
    }
 
    Json::Value toJson() {
        Json::Value value;
        value["type"] = type;
        value["label"] = label;
        value["payload"] = getPayload();
        return value;
    }
 
};
 
class Button {
public:
    Action *action;
    std::string color{};
 
    Button(std::string color, Action* action) {
        this->color = color.c_str();
        this->action = action;
    }
 
    Json::Value toJson() {
        Json::Value value;
        value["color"] = color;
        value["action"] = action->toJson();
        return value;
    }
};
 
class Keyboard {
private:
    Json::Value getButtons() {
        Json::Value value;
        for (int i = 0; i < buttons.size(); i++)
            value[i] = buttons[i]->toJson();
        return value;
    }
 
public:
    bool oneTime;
    std::vector<Button*> buttons;
    bool inlineButtons;
 
    Keyboard(std::vector<Button*> buttons, bool oneTime, bool inlineButtons) {
        this->oneTime = oneTime;
        this->inlineButtons = inlineButtons;
        this->buttons = buttons;
    }
 
    std::string buildKeyboard() {
        Json::Value value;
        if (inlineButtons)
            value["inline"] = inlineButtons;
        else value["one_time"] = oneTime;
        value["buttons"] = getButtons();
        std::string res{};
        std::stringstream stream{};
        stream << value;
        stream >> res;
        return res;
    }
 
};
Создание объекта Keyboard
C++
1
2
3
4
5
6
7
8
9
Keyboard keyboard{
    {
        &Button{"primary", &TextAction{"test", "test 1"}},
        &Button{"secondary", &TextAction{"test", "test 2"}},
        &Button{"negative", &TextAction{"test", "test 3"}},
        &Button{"positive", &TextAction{"test", "test 4"}}
    },
    false, true 
};
Миниатюры
Пустые string после присваивания значения в инициализаторе   Пустые string после присваивания значения в инициализаторе  
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.06.2020, 18:36
Ответы с готовыми решениями:

Пустые строки после String.split
Допустим есть строка математического выражения. Перед парсингом её надо разбить на лексемы. Я для этого использовал String.split с...

Какая разница между возвращением значения и присваивания значения?
Какая разница между возвращением значения и присваивания значения? Я всегда думал, что возвращение это одно и тоже что и присваивание, но...

Завершить класс String, добавив к нему оператор присваивания
Необходимо завершите класс String, добавив к нему оператор присваивания. Инвариант класса остается тем же (в size хранится размер строки...

7
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
04.06.2020, 18:49
Цитата Сообщение от NexSqaud Посмотреть сообщение
&Button{"primary", &TextAction{"test", "test 1"}}
Брать адрес у rvalue? Серьёзно? И компилятор молчит?
0
0 / 0 / 0
Регистрация: 28.05.2018
Сообщений: 21
04.06.2020, 18:59  [ТС]
Цитата Сообщение от zayats80888 Посмотреть сообщение
Брать адрес у rvalue?
То есть мне надо в отдельных переменных объявлять все объекты?
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
04.06.2020, 19:05
Лучший ответ Сообщение было отмечено NexSqaud как решение

Решение

Цитата Сообщение от NexSqaud Посмотреть сообщение
То есть мне надо в отдельных переменных объявлять все объекты?
Если просто, то да, и следить за тем, что бы они жили, пока на них кто либо ссылается.
Ну а если по хорошему, то вам нужно заменить "голые" указатели на "умные"(std::shared_ptr/std::unique_ptr)/
и создавать объекты в куче.
0
0 / 0 / 0
Регистрация: 28.05.2018
Сообщений: 21
04.06.2020, 19:30  [ТС]
Изначально я хотел это сделать без указателей, но на абстрактный класс нужен именно указатель. Возможно ли хранить объект абстрактного класса не как указатель на него?
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
04.06.2020, 19:32
Цитата Сообщение от NexSqaud Посмотреть сообщение
Возможно ли хранить объект абстрактного класса
Объект абстрактного класса вообще нельзя создать.
0
0 / 0 / 0
Регистрация: 28.05.2018
Сообщений: 21
04.06.2020, 19:42  [ТС]
Цитата Сообщение от zayats80888 Посмотреть сообщение
Объект абстрактного класса вообще нельзя создать.
В смысле объект дочернего класса как объект абстрактного класса.
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
04.06.2020, 19:53
Цитата Сообщение от NexSqaud Посмотреть сообщение
В смысле объект дочернего класса как объект абстрактного класса.
Объект дочернего класса будет хранится как...объект дочернего класса.
Но вы можете обращаться к нему через ссылку/указатель на абстрактный базовый класс.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.06.2020, 19:53
Помогаю со студенческими работами здесь

Странная команда присваивания значения переменной
В bat-файле выполняются такие команды: set VAR=d:\my\home\work\ set VAR=%VAR:/=\% echo %VAR% выводит d:\my\home\work\ т.е. результат...

Присваивания переменной внутри класса значения
class CPU_RegExp { private: int hozelt = { 8, -3, -5, 8, 0, -5, 1, -1 }; //....... }; ругается на int hozelt = { 8,...

Переменная удаляется после присваивания
После строки 85 переменная c почему-то удаляется. #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;string.h&gt; #include...

Ошибка присваивания switch значения полученного от сервера
Всем привет, делаю приложение для управления микроконтроллером (МК)... При запуске приложение отправляет запрос на МК, после чего...

Запись значения типа String^ в char* или std::string
String^ D1=textBox1-&gt;Text; Int32 D2=Convert::ToInt32(textBox2-&gt;Text); //god Int32 D3=Convert::ToInt32(textBox3-&gt;Text); //dochod ...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru