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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Neumann1
0 / 0 / 0
Регистрация: 20.09.2012
Сообщений: 30
#1

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

24.09.2012, 18:33. Просмотров 526. Ответов 13
Метки нет (Все метки)

Добрый день.

Подскажите, как организовать. В конструктор класса параметром передается строка, как хранить ее в классе?
Например
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++
1)Когда учил динамические массивы, многое недопонял. Вот к примеру в учебных примерах зачастую дают пользователю самому назначить...

Есть ли в классе строк или в алгоритмах разбиение строку на лексемы? - C++
Собственно сабж, как говорится. Хотел переписать программу, которую делал с Си строками и массивом Си строк. Сделана она была не совсем...

В классе инициализировать массив, в классе создать функцию вывода массива на экран - C++
Прошу помоши с выводом данных, которые содержаться в массиве, на экраy: Задача: В классе инициализировать массив, в классе создать...

Как обьявить переменную в одном классе и что бы ее было видно в дочернем классе - C++
У меня есть основной класс с названием Root один из его членов наследует дочерний класс SubRoot. Скажите как объявить, что бы один из...

У меня класс B в классе A, а в классе B рекурсивная функция переопределения оператора "()", как её вызвать, не создавая явно объект класса B? - C++
#include &lt;windows.h&gt; #include &lt;iostream&gt; using namespace std; //Вот главный класс class A{ public: A (){}; class...

Известны оценки по физике каждого ученика двух классов.Определить средниюю оценку в каждом классе.Количество учащихся в каждом классе одинаковое! - C++
Известны оценки по физике каждого ученика двух классов.Определить средниюю оценку в каждом классе.Количество учащихся в каждом классе...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
DU
1483 / 1059 / 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
В астрале
Эксперт С++
7971 / 4733 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 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
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
24.09.2012, 19:49 #6
смотря что вы хотите сделать. из поста это неясно. точнее для чего ваш класс.
с шаблоном конечно можно, но тогда придется заморочится всякими деталями типа конструктор
копирования и оператор присваивания из другого класса но этого же шаблона. если не надо, то все просто.
потом, что там с динамическим расширением: надо\не надо и т.п. решений несколько оптимальный выбор зависит от решаемой задачи.
ForEveR
В астрале
Эксперт С++
7971 / 4733 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 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
В астрале
Эксперт С++
7971 / 4733 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 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
В астрале
Эксперт С++
7971 / 4733 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 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
В астрале
Эксперт С++
7971 / 4733 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
25.09.2012, 01:08 #13
Neumann1, Проблемы - не значит немедленный segfault. Проблемы значит, что может произойти по сути что угодно. Вкратце - вы пишите в чужую память.

Добавлено через 59 минут
http://liveworkspace.org/code/fbb204...12be227c0ec29b что-то вроде такого
Neumann1
0 / 0 / 0
Регистрация: 20.09.2012
Сообщений: 30
25.09.2012, 12:06  [ТС] #14
ForEveR А понял-понял. Точнее вспомнил. Я ж когда-то изучал. Если с помощью new выделить памяти меньше, чем потом записать, то данные "залезут" за выделенную область - а там может быть байтовый мусор, но могут быть байты других данных. И если там другие данные - то при доступе к ним (к этим другим) будет ошибка. Так?
Спасибо всем
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.09.2012, 12:06
Привет! Вот еще темы с ответами:

как хранить поток? - C++
задача такая: класс имеет конструктор, этому конструктору при создании объекта класса передаёться поток ostream , соответственно объект...

в чем хранить переменные? - C++
в чем хранить переменные? нужно хранить 4 столбца, а количество строк может как уменьшаться (будет функция удаления), так и...

В чем принято хранить данные? - C++
Нужно где-то хранить данные (типа бд). В каком файле принято хранить информацию? PS: с базами данных связываться пока не хочу PS2: если...

как хранить данные в dll - C++
подскажите, возможно ли, и как хранить данные в dll? например не хочу чтоб логин пароль и некоторая другая информация была в текстовом...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
25.09.2012, 12:06
Ответ Создать тему
Опции темы

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