С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++/CLI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/21: Рейтинг темы: голосов - 21, средняя оценка - 4.62
 Аватар для VoltDeMar
18 / 18 / 4
Регистрация: 05.06.2012
Сообщений: 1,020

Различные методы подключения string

14.04.2015, 13:44. Показов 4002. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую.
Хочу понять особенности строк в C++.
Прочел несколько статей, однако на практике появляются не понятные мне вещи.
Верно ли:
в C++ строки задаются массивом символов char?
<string> - специальный класс для операций над строками?
<string> - можно подключить к любому приложению на С++ ??


В чем разница между System::String , <string> и namespace std ??

Вопрос касательно реального примера:
Получаю такую ошибку error C2871: 'std' : a namespace with this name does not exist
вот в таком коде:
C++
1
2
3
4
5
6
7
8
9
10
11
12
#pragma once
 
namespace Заполнитель {
    using namespace System;
    using namespace System::ComponentModel;
    using namespace System::Collections;
    using namespace System::Windows::Forms;
    using namespace System::Data;
    using namespace System::Drawing;
    using namespace System::Diagnostics ;
    using namespace System::Threading;      
    using namespace std;
почему?

Если же убрать строку
C++
1
using namespace std;
, добавить #include<string> и попытаться выполнить такое преобразование:
C++
1
string str(str_array[cell]);
, то ошибка муттирует в 'string' : undeclared identifier. почему?


Углубляясь в поиски информации об использовании строк я нашел информацию о том что существуют:
ссылочный тип (char^) , тип значения (char) и тип нативного указателя (char*).

Почему в приложении WindowsForms появляется такая ошибка:
System::String' : cannot use this type here without a top-level '^'
при таком объявлении:
C++
1
String enumChars = "0123456789ABCDEF";
и почему объявление работает при создании переменной ссылочного типа ??
C++
1
String^ enumChars = "0123456789ABCDEF";


Почему объявить массив строк удается таким образом:
C++
1
2
3
char* str_array [18];
str_array[0] = "Arial";
....
и не удается таким:
C++
1
2
3
char str_array [18];
str_array[0] = "Arial";
....
???

Почему конвертировать такую строку не удается ?
C++
1
 MessageBox::Show(System::String::ToString(str_array[cell]));
Каковы основные правила при создании и использовании строковых переменных (когда нужно использовать ^, когда*, а когда просто тип)?

Попутный вопрос, такое объявления массива объектов я взял из примера в интернете:
C++
1
array<Object^>^myObjArray =...
что из себя представляет этот объект? это переменная ссылочного типа указывающая на экземпляр класса array содержащий переменные ссылочного типа? Почему не удается создать их типом значений ?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.04.2015, 13:44
Ответы с готовыми решениями:

Различные варианты подключения к Sybase
Доброго времени суток! Передо мной стоит вопрос: как я могу подключится к Sybase базе (стандартная процедура подключения известна:...

Написать программу, в которой реализуются различные методы сортировки массивов
Здравствуйте! Да, тема сортировка массивов, но не всё так просто. Получил такое задание: Написать программу, в которой реализуются...

Создать универсальный класс Search, содержащий различные методы поиска в массиве
Вроде бы задание не сложное но что то не могу понять что надо сделать. И как это вобще реализовать сравнение объектов произвольных...

9
Заблокирован
14.04.2015, 13:52
Цитата Сообщение от VoltDeMar Посмотреть сообщение
в C++ строки задаются массивом символов char?
<string> - специальный класс для операций над строками?
<string> - можно подключить к любому приложению на С++ ??
да
да
да
Цитата Сообщение от VoltDeMar Посмотреть сообщение
В чем разница между System::String , <string> и namespace std ??
Функционально? Ну это же совсем разные классы, и что главное - один класс шарповый, другой С++.
Открой https://msdn.microsoft.com/ru-... .110).aspx и почитай про шарповый стринг,
потом открой http://www.cplusplus.com/reference/string/string/ и почитай про С++ стринг.
В общем то С# на С++ мало чем похож, он больше похож на убогую Java.
В С++ нет никаких гарбедж коллекторов, везде указатели и динамическая память, да и ваще полный хардкор

Цитата Сообщение от VoltDeMar Посмотреть сообщение
Вопрос касательно реального примера:
Получаю такую ошибку error C2871: 'std' : a namespace with this name does not exist
А ты где это пишешь? Небойсь создал шарповый проект в VisualStudio И пытаешься там STL string прикрутить
Не выйдет. Создавай проект С++.

Можно конечно миксовать С++ и C# с помощью CLI, но это на мой взгляд анахронизм.
0
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
14.04.2015, 13:59
Цитата Сообщение от VoodooPuppet Посмотреть сообщение
Ну это же совсем разные классы, и что главное - один класс шарповый, другой С++.
System::String^ это не шарповый класс,а C++/CLI.
Конвертация строк: System::String в массив char/wchar_t, std::string и обратно
Основные отличия C# от C++ CLI

Добавлено через 2 минуты
Цитата Сообщение от S_el Посмотреть сообщение
System::String^ это не шарповый класс,а C++/CLI.
Хотя,наверное,даже не так.Правильнее будет сказать класс .Net.
0
Заблокирован
14.04.2015, 14:02
Цитата Сообщение от VoltDeMar Посмотреть сообщение
Почему объявить массив строк удается таким образом:
char* str_array [18];
str_array[0] = "Arial";
....
Ну... тут надо С++ знать
Ты тут делаешь не то что предполагаешь.
Здесь ты объявляешь статический массив из 18- указатель типа char.
Нулевому айтиму массива ты присваиваешь значение адреса вновь созданной строки справа от знака равно = "Arial", то есть у тебя создастся массив char[5] tmp = "Arial и его адрес присовится нулевому элементу твоего первоначального массива.

Цитата Сообщение от VoltDeMar Посмотреть сообщение
и не удается таким:

char str_array [18];
str_array[0] = "Arial";
....
тут у тебя статический массив из 18-и элементов типа char, то есть из 18-и символов по 1-му байту.

Ты пытаешь в нулевой элемент массива, то есть в однобайтовый элемент char, загнать неявно созданную справа от знака равно строку (массив) "Arial" из 5-и байт, ясен пень он туда не поместится

Добавлено через 1 минуту
Цитата Сообщение от S_el Посмотреть сообщение
Правильнее будет сказать класс .Net.
вот вот, то есть шарповый.
Создавай проект С++.
1
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
14.04.2015, 14:09
Цитата Сообщение от VoltDeMar Посмотреть сообщение
то ошибка муттирует в 'string' : undeclared identifier. почему?
Так как не указано пространство имен.Пишите std::string.

Цитата Сообщение от VoltDeMar Посмотреть сообщение
и почему объявление работает при создании переменной ссылочного типа ??
В C++/CLI есть ссылочные классы и классы значений.Объекты первых можно создать только со значком ^.

Цитата Сообщение от VoltDeMar Посмотреть сообщение
и не удается таким:
char это символ,а не строка.

Добавлено через 4 минуты
Цитата Сообщение от VoodooPuppet Посмотреть сообщение
Ну... тут надо С++ знать
Скорее C,в C++ не зря std::string придумали

Цитата Сообщение от VoodooPuppet Посмотреть сообщение
вот вот, то есть шарповый.
Создавай проект С++.
Нет.Шарп и .Net не одно и тоже.Можно использовать .Net совершенно не зная C#. Просто так получилось,что из всех языков поддерживаемых платформой .Net С# самый удобный,а поэтому получивший наибольшую поддержку и распространение.А вот C++/CLI такой поддержки не получил и загнулся.Однако сейчас,многих студентов заставляют использовать C++/CLI так как там и C++(который преподавали годами) и формочки.
0
Заблокирован
14.04.2015, 14:13
Цитата Сообщение от S_el Посмотреть сообщение
так как там и C++(который преподавали годами) и формочки.
Преподаватели не ведают, что творят.
Нормальные люди для этих целей используют Qt
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
14.04.2015, 14:15
Цитата Сообщение от S_el Посмотреть сообщение
C++/CLI такой поддержки не получил и загнулся
Это почему? Он же поддерживается в VS и справка MSDN на него есть.
0
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
14.04.2015, 14:33
Цитата Сообщение от VoodooPuppet Посмотреть сообщение
Преподаватели не ведают, что творят.
Нормальные люди для этих целей используют Qt
К сожалению да.Но Qt не панацея,для простых GUI winform проще и ничего,кроме VS скачивать не надо

Добавлено через 17 минут
Цитата Сообщение от nmcf Посмотреть сообщение
Это почему? Он же поддерживается в VS и справка MSDN на него есть.
Да,шаблон в VS и справка по самым основным классам на MSDN есть.Но сам язык не развивается уже достаточно давно.
0
 Аватар для VoltDeMar
18 / 18 / 4
Регистрация: 05.06.2012
Сообщений: 1,020
14.04.2015, 15:19  [ТС]
При вот таком коде :
C++
1
2
3
4
5
6
using namespace std;
 
....
std::string s(str_array[cell]);
MessageBox::Show(System::String::ToString(s));
...
возникает ошибка error C2665: 'System::String::ToString' : none of the 3 overloads could convert all the argument types
при попытке отдать эту строку MessageBox-у без преобразования ошибка:
error C2665: 'System::Windows::Forms::MessageBox::Sho w' : none of the 21 overloads could convert all the argument types

Чем же является моя строка s? Существует разница между строками реализованными этими тремя классами(System::String , <string> и namespace std )?


Главный вопрос :
Цитата Сообщение от VoltDeMar Посмотреть сообщение
Каковы основные правила при создании и использовании строковых переменных (когда нужно использовать ^, когда*, а когда просто тип)?
0
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
14.04.2015, 15:32
Цитата Сообщение от VoltDeMar Посмотреть сообщение
error C2665: 'System::Windows::Forms::MessageBox::Sho w' : none of the 21 overloads could convert all the argument types
Я уже давал ссылку,где показан способ правильного преобразования.

Цитата Сообщение от VoltDeMar Посмотреть сообщение
Существует разница между строками реализованными этими тремя классами(System::String , <string> и namespace std )?
Да.Например namespace std это вообще не строка.

Цитата Сообщение от VoltDeMar Посмотреть сообщение
Каковы основные правила при создании и использовании строковых переменных (когда нужно использовать ^, когда*, а когда просто тип)?
^ вседа когда System::String^ иначе будет ошибка
просто тип когда std::string.
* когда нужен указатель на массив char.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.04.2015, 15:32
Помогаю со студенческими работами здесь

Методы подключения к базам данных
Какими методами осуществляется подключения к базам данных в MS Access. То есть как MS Access подключается к своей базе? Перечитайте...

Разработать приложение, в котором можно выбирать различные методы сортировки для упорядочивания элементов массива
Помогите пожалуйста с приложением. unit Unit7; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics,...

Как перевести string в тип Calendar и сравнить различные даты клендаря
Здравствуйте! Возникла проблема, в переменной типа string содержится дата. Как эту переменную перевести в Calendar и сравнить различные...

Класс string - ошибка подключения
Народ, помогите советом, плиз! Пишу лабу на Borland c++ 3.1, в ней надо использовать стандартный класс string, но когда я его подключаю,...

Методы Parse (String)
Всем доброго времени суток! Есть тема: Лабиринт (уровень, клетка, двери / стенка, артефакт) Согласно теме: - создать 9 форм (главная...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru