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

Хранить строку в классе - C++

Восстановить пароль Регистрация
 
Neumann1
0 / 0 / 0
Регистрация: 20.09.2012
Сообщений: 30
24.09.2012, 18:33     Хранить строку в классе #1
Добрый день.

Подскажите, как организовать. В конструктор класса параметром передается строка, как хранить ее в классе?
Например
MyClass<_MyInt>::MyClass(const char * stroka)

Вот это stroka как хранить в классе?

Код
template <int _MyInt>
class MyClass
{
        char _stroka[_MyInt]; // так?

        char * _stroka; // или так? в этом случае можно не делать класс шаблонным
И в конструкторе как из stroka в _stroka передать?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.09.2012, 18:33     Хранить строку в классе
Посмотрите здесь:

C++ как хранить поток?
C++ Есть ли в классе строк или в алгоритмах разбиение строку на лексемы?
C++ Известны оценки по физике каждого ученика двух классов.Определить средниюю оценку в каждом классе.Количество учащихся в каждом классе одинаковое!
Как лучше всего хранить коэффициенты? C++
В чем принято хранить данные? C++
как хранить данные в dll C++
C++ Как хранить координаты фигуры?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1478 / 1054 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
24.09.2012, 18:57     Хранить строку в классе #2
так:

C++
1
2
3
4
template <int _MyInt>
class MyClass
{
  std::string m_stroka; // вот так. на шаблонность\нешаблонность класса это никак не влияет.
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7954 / 4716 / 318
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
24.09.2012, 19:03     Хранить строку в классе #3
Нечего С-style массивы использовать. C++11.

C++
1
2
3
4
5
6
7
8
template<int Size>
class MyClass
{
public:
   MyClass(std::array<char, Size> arr):array{arr} { }
private:
   std::array<char, Size> array;
};
Nick Alte
24.09.2012, 19:22
  #4

Не по теме:

ForEveR,

C++
1
2
3
4
5
6
7
8
9
10
11
#include <array>
 
typedef char array_;
 
template<int _array>
class Array {
public:
    Array(std::array<array_, _array> array): array(array) {}
private:
    std::array<array_, _array> array;
};

Neumann1
0 / 0 / 0
Регистрация: 20.09.2012
Сообщений: 30
24.09.2012, 19:45  [ТС]     Хранить строку в классе #5
У меня билдер) это насчет с++11)

Цитата Сообщение от DU Посмотреть сообщение
так:
Спасибо. Но мне хотелось узнать как это сделать без стандартной библиотеки.
DU
1478 / 1054 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
24.09.2012, 19:49     Хранить строку в классе #6
смотря что вы хотите сделать. из поста это неясно. точнее для чего ваш класс.
с шаблоном конечно можно, но тогда придется заморочится всякими деталями типа конструктор
копирования и оператор присваивания из другого класса но этого же шаблона. если не надо, то все просто.
потом, что там с динамическим расширением: надо\не надо и т.п. решений несколько оптимальный выбор зависит от решаемой задачи.
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7954 / 4716 / 318
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
24.09.2012, 19:51     Хранить строку в классе #7
Та пожалста.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <cstring>
 
template<int Size>
struct CharArray
{
   CharArray(const char (&arr)[Size + 1])
   {
      strcpy(array, arr);
   }
   char array[Size + 1];
};
 
int main()
{
   CharArray<5> carr = "hello";
   std::cout << carr.array << std::endl;
}
http://liveworkspace.org/code/ba8a5e...f6224bf0c392cc
Neumann1
0 / 0 / 0
Регистрация: 20.09.2012
Сообщений: 30
24.09.2012, 22:25  [ТС]     Хранить строку в классе #8
Понял. А можно не делать класс шаблонным, а просто указать так?
C++
1
2
3
4
5
6
7
8
9
10
class MyClass
{
char * _stroka;
public:
MyClass(char * stroka)
{
    strcpy(_stroka, stroka);
}
// ...
}
И тогда не нужен шаблонным делать. Можно так?
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7954 / 4716 / 318
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
24.09.2012, 22:50     Хранить строку в классе #9
Neumann1, Можно. Не забудьте корректно выделять память, написать конструктор копирования , оператор присваивания и деструктор ( в котором корректно очищать память ).
Neumann1
0 / 0 / 0
Регистрация: 20.09.2012
Сообщений: 30
24.09.2012, 23:02  [ТС]     Хранить строку в классе #10
Цитата Сообщение от ForEveR Посмотреть сообщение
Neumann1, Можно. Не забудьте корректно выделять память, написать конструктор копирования , оператор присваивания и деструктор ( в котором корректно очищать память ).
А вот как раз насчет этого вопрос)
Я когда написал как здесь написал - не копировалось. Потом вспомнил, что нужно выделить память. И перед строкой с strcpy написал

C++
1
_stroka= new char[sizeof(stroka)];
и все заработало! Но, любопытства ради я написал вручную меньше _stroka= new char[3]; хотя строка там больше и все равно работает. Я оставил просто _stroka= new char; и все работает! Хотя не должно работать по логике ведь копируемая строка больше.
Объясните пожалуйста почему
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7954 / 4716 / 318
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
24.09.2012, 23:35     Хранить строку в классе #11
Neumann1, strcpy копирует из передаваемого во втором параметре в передаваемое в первом параметре strlen(второй параметр)+1 элементов. Если в первом недостаточно места - у вас большие проблемы. Это переполнение буфера со всеми вытекающими отсюда последствиями.
Neumann1
0 / 0 / 0
Регистрация: 20.09.2012
Сообщений: 30
24.09.2012, 23:53  [ТС]     Хранить строку в классе #12
но проблем не возникает.
как раз потому-то и спрашиваю - какой бы размер для _stroka с помощью new не выделял - (new char[5], new char[3] или вообще new char) все равно строка (например "hello world") копируется из stroka в _stroka без проблем. Не пойму как вмещается, кажется что не должно.
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7954 / 4716 / 318
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
25.09.2012, 01:08     Хранить строку в классе #13
Neumann1, Проблемы - не значит немедленный segfault. Проблемы значит, что может произойти по сути что угодно. Вкратце - вы пишите в чужую память.

Добавлено через 59 минут
http://liveworkspace.org/code/fbb204...12be227c0ec29b что-то вроде такого
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.09.2012, 12:06     Хранить строку в классе
Еще ссылки по теме:

Как хранить размерность массива? C++
Стек: хранить не одиночные символы, а слова C++
C++ Где хранить размер блока памяти?
Где лучше хранить данные таблиц? C++
C++ В каком виде хранить таблицу с данными?

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

Или воспользуйтесь поиском по форуму:
Neumann1
0 / 0 / 0
Регистрация: 20.09.2012
Сообщений: 30
25.09.2012, 12:06  [ТС]     Хранить строку в классе #14
ForEveR А понял-понял. Точнее вспомнил. Я ж когда-то изучал. Если с помощью new выделить памяти меньше, чем потом записать, то данные "залезут" за выделенную область - а там может быть байтовый мусор, но могут быть байты других данных. И если там другие данные - то при доступе к ним (к этим другим) будет ошибка. Так?
Спасибо всем
Yandex
Объявления
25.09.2012, 12:06     Хранить строку в классе
Ответ Создать тему
Опции темы

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