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

Создать экземпляр класса, выбрав его из меню и нажав на кнопку

24.05.2014, 13:16. Показов 731. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть классы Dog и Cat, кнопка "Запись" и две "радиокнопки", опять таки Dog и Cat. Вот что я хочу сделать: например ты кликаешь на Dog/Cat, потом кнопка "Запись" - и соответсвенно создается обьект одного из классов. Как это реализовать?
И еще вопрос: есть какий-то элемент отображения нестатического текста?

Добавлено через 34 минуты
+ Еще такое.
Есть поле ввода, оно записывает текст в переменную типа СString. Потом СString я конвертирую в char*, и записываю в файл. А в файле текст превращается на цифры. В чем проблема?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.05.2014, 13:16
Ответы с готовыми решениями:

Создать экземпляр одного класса в Main, и передать его в экземпляр другого класса
Добрый день. Подскажите пожалуйста. есть несколько классов-файлов в одном пакете. class one class two class main... Нужно...

Создать экземпляр класса по его конструктору
Здравствуйте, допустим у нас есть метод: // Создает экземпляр класса по его конструктору (псевдокод) public function...

Как правильно создать экземпляр класса для доступа к его свойствам
Всем доброго времени суток. Сижу уже долго над этим участком. У меня есть класс Pinball, я создаю экземпляр этого класса PinMe. Нужно...

9
215 / 63 / 25
Регистрация: 30.04.2013
Сообщений: 865
Записей в блоге: 10
24.05.2014, 14:13
Цитата Сообщение от joemcjoe Посмотреть сообщение
СString я конвертирую в char*,
Цитата Сообщение от joemcjoe Посмотреть сообщение
В чем проблема?
Конвертировал так :

C++
1
2
3
   CString YourStr; 
    ...
   char t[] = YourStr.GetString();
Добавлено через 3 минуты
Не ..
C
1
2
3
CString TempVariable;
char lop1[200];
sprintf(lop1, "%S", TempVariable);
0
0 / 0 / 0
Регистрация: 09.11.2013
Сообщений: 26
24.05.2014, 15:10  [ТС]
вот через sprintf_s я и делал. Может проблема скорее в вытягивании их контейнера мультимап.
Вот тут:
C++
1
2
3
4
5
6
7
std::multimap< char*,int>::iterator i;
                for(i=mlist.begin(); i != mlist.end(); i++)
                {
 
                    sprintf_s(buf,"%s\n",*i);
                    file.WriteString(buf);
                }
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
26.05.2014, 11:25
joemcjoe, вообще-то итератор для мультимапы указывает на std::pair<key,value>, а не key. Который у Вас char*. Что тоже по себе довольно странно.
0
0 / 0 / 0
Регистрация: 09.11.2013
Сообщений: 26
26.05.2014, 22:20  [ТС]
А как надо тогда сделать?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
26.05.2014, 22:26
joemcjoe, не помешало бы пример заполнения mlist привести. Но если опираться на имеющийся тип итератора, то вывод может быть такой например:
C++
1
sprintf_s(buf,"%s\n",it->first);
0
0 / 0 / 0
Регистрация: 09.11.2013
Сообщений: 26
28.05.2014, 23:31  [ТС]
Заполнение так.
C++
1
2
3
char buf[100];
        sprintf_s(buf,"%s",m_nData);
        mlist.insert(mlist.end(),std::pair< char*,int>(buf,0))
где m_nData - переменная поля ввода


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

Еще мне при записи в файл выбивает ошибку Buffer too small. Указывает на этот фрагмент кода:
C++
1
2
3
4
catch (CInvalidArgException* ex)
            {
                MessageBoxA("Cannot open file");
                return;
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
29.05.2014, 07:13
joemcjoe, ключ указывается ПЕРВЫМ аргументом, RTFM. Заносить указатель в мапу и при этом херить сами данные (buf будет уничтожен при выходе из блока) - это ошибка.
0
0 / 0 / 0
Регистрация: 09.11.2013
Сообщений: 26
29.05.2014, 16:21  [ТС]
Спасибо, этот момент я исправил, но теперь другая проблема - текст то читается, но не тот, что надо. Все одинаковое, кроме того, что напрямую из поля ввода заносится в файл. Приложил главные фрагменты кода диалога чтобы было понятно , на украинский внимания не обращайте .
Кликните здесь для просмотра всего текста
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
// rsv2Dlg.cpp : файл реализации
//
 
 
void Crsv2Dlg::WriteData()
 
{
    // Записуємо значення з контролів в змінні
    UpdateData(true);
 
    // перевіряємо чи буфер не повний
    if (mlist.size()<4)
    {
        char buf[10];
        sprintf_s(buf,"%s\n",m_nData);
        mlist.insert(mlist.end(), std::pair<int,char*>(0,buf));
 
    }
    else
    {
 
        CFileDialog OpenDialog(false, "txt", NULL, 
            OFN_HIDEREADONLY,  
            "Text Files (*.txt)|*.txt||");
 
        if(OpenDialog.DoModal() == IDOK) // Якщо натиснули кнопку ОК в діалозі
        {
            char bufer[10];
 
            // Відкрити файл за заданим шляхом в режимі запису
            try
            {
                CStdioFile file(OpenDialog.GetPathName(), CFile::modeCreate |
 CFile::modeNoTruncate | CFile::modeWrite);
 
                // переміщуємося в кінець файлу
                file.SeekToEnd();
                
 
// записуємо дані з буфера (списку) в текстовий файл
                std::multimap<int,char*>::iterator i;
                for(i=mlist.begin(); i != mlist.end(); i++)
                {
                    file.WriteString(i->second);
                }
 
                // записуємо у файл останню порцію даних, яка не потрапила в буфер
                sprintf_s(bufer,"%s\n",m_nData);
                file.WriteString(bufer);
 
                // Закриваємо файл
                file.Close();
 
                // очистити буфер
                mlist.clear();
            }
            catch (CInvalidArgException* ex)
            {
                
                MessageBoxA("Cannot open file");
                return;
            }
            catch (CFileException* ex)
            {
                MessageBoxA("Error writing file");
                return;
            }
            catch (...)
            {
                MessageBoxA("Unknown error");
                return;
            }
        }
    }
}
 
 
void Crsv2Dlg::ReadData()
{
    int i=0;
    CString str;
    // Створюємо діалог вибору файлу для читання
    CFileDialog OpenDialog(true, "txt", NULL, 
        OFN_FILEMUSTEXIST |
        OFN_HIDEREADONLY,  
        "Text Files (*.txt)|*.txt||");
 
    // Якщо натиснули кнопку ОК в діалозі
    if(OpenDialog.DoModal() == IDOK) 
    {
        // Cтираємо весь вміст контрола
        m_DlgList.DeleteAllItems();
 
        // Відкриваємо файл за заданим шляхом в режимі читання
        CStdioFile file(OpenDialog.GetPathName(), CFile::modeRead);
        // переміщуємося на початок файлу
        file.SeekToBegin();
 
        // Читаємо по рядково файл до кінця
        while(file.ReadString(str))
        {
            m_DlgList.InsertItem(i++,str.GetBuffer(10));
        }
 
        // Закриваємо файл
        file.Close();
 
        // переносимо вміст об'єктів в контроли 
        UpdateData(false);
 
    }
 
}
 
 
 
 
void Crsv2Dlg::OnClose()
{
    {
    // Записуємо значення з контролів в змінні
    UpdateData(true);
 
    // Якщо буфер порожній то виходимо
    if (!mlist.empty())
    {
        // Створюємо діалог вибору файлу для запису
        CFileDialog OpenDialog(false, "txt", NULL, 
            OFN_HIDEREADONLY,  
            "Text Files (*.txt)|*.txt||");
 
// Якщо натиснули кнопку ОК в діалозі
        if(OpenDialog.DoModal() == IDOK) 
        {
            char buf[10];
 
            // Відкрити файл за заданим шляхом в режимі запису
            CStdioFile file(OpenDialog.GetPathName(), CFile::modeCreate |
 CFile::modeNoTruncate | CFile::modeWrite);
            // переміщуємося в кінець файлу
            file.SeekToEnd();
            // записуємо дані з буфера (списку) в текстовий файл
            std::multimap<int,char*>::iterator i;
            for(i=mlist.begin(); i != mlist.end(); i++)
            {
                sprintf_s(buf,"%s\n",i->second);
                file.WriteString(buf);
            }
 
            // Закриваємо файл
            file.Close();
 
            // очистити буфер
            mlist.clear();
        }
    }
 
 
    CDialogEx::OnClose();
    } }
 
 
    void Crsv2Dlg::OnWritetofileReadfromfile()
    {
        ReadData();
 
    }
 
 
    void Crsv2Dlg::OnMenyWritetofile()
    {
WriteData();
    }   
 
 
 
 
    void Crsv2Dlg::ChooseDog()
    {
        char buf[50];
        sprintf_s(buf,"%s",m_nData);
        objects[mlist.size()] = new Dog(buf);
 
    }
 
 
    void Crsv2Dlg::ChooseCat()
    {
        char buf[50];
        sprintf_s(buf,"%s",m_nData);
        
        objects[mlist.size()] = new Cat(buf);
    }
 
 
    void Crsv2Dlg::Call()
    {
        objects[mlist.size()]->Call();
 
    }
 
 
    void Crsv2Dlg::Feed()
    {
objects[mlist.size()]->Feed();
    }
 
 
    void Crsv2Dlg::DoStuff()
    {
        objects[mlist.size()]->DoAnimalStuff();
    }
0
0 / 0 / 0
Регистрация: 09.11.2013
Сообщений: 26
31.05.2014, 12:13  [ТС]
Ну так кто-нибудь сможет помочь?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
31.05.2014, 12:13
Помогаю со студенческими работами здесь

Как создать экземпляр класса внутри другого, явно не указывая его название
Как создать екземпляр класса внутри класса явно не указывая его название и не присваивая в переменную его название class Test{ ...

Как скрыть кнопку на form2, нажав на кнопку которая находится на form1
Как скрыть кнопку на form2, нажав на кнопку которая находится на form1? т.е. нажав на кнопку OpenFrm2, открывается форма Form2, и кнопка...

Создать экземпляр метода класса или доступ к методу из экземпляра класса
Всем доброго времени суток!) Уже месяца как 2 не сишарпил и подзабыл...собственно задача такая: Создать отдельный экземпляр класса для...

Создать экземпляр класса без явного указания членов класса
Если у меня есть два конструктора, один из которых по умолчанию, а второй явный. Я почему-то не могу создать экземпляр класса без явного...

Создать экземпляр класса по ссылке экземпляра класса
Есть класс для обработки клиентов // Абстрактный class ClientProcessing { }; Я создаю от него наследника class...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru