3.10.2015 / 16:38 | |
Naik Пользователь Сейчас: Offline
Имя: %name% Регистрация: 14.03.2010
| На windows 7 не понимает кодировки utf-8 в cmd, сохранил исходник в windows-1251, перестал выводиться лог в консоль SublimeText, но скомпилилось таки. Кириллица отображается, но не отображается буква і Локаль ставил ( setlocale(LC_ALL, "") ), шрифт в cmd менял - не помогло
Изменено Naik (3.10 / 16:38) (всего 2 раза) |
5.10.2015 / 17:00 | |
Banschey Пользователь Сейчас: Offline
Имя: Banschey Откуда: Донецк, Украина Регистрация: 22.03.2015
| Открыть спойлер Закрыть спойлер class strtype
{
public:
strtype(char t[]);
~strtype();
void print();
private:
char *t = new char[];
};
strtype::strtype( char t[])
{
this->t = t;
}
strtype::~strtype()
{
delete []t;
}
void strtype::print()
{
std::cout << t << std::endl;
}
int main()
{
strtype s("sd");
s.print();
_getch();
return 0;
}
При удалении t выбивает ошибку того что память была очищена, BLOCK_TYPE_IS_VALID(phead->nBlockUse), нужен конструктор копирования как я понял а вот как сделать не знаю. Знает кто ? Изменено Banschey (5.10 / 17:01) (всего 1 раз) |
5.10.2015 / 17:18 | |
Banschey Пользователь Сейчас: Offline
Имя: Banschey Откуда: Донецк, Украина Регистрация: 22.03.2015
| Понял в чем проблема, сама конструкция не правильная.
|
5.10.2015 / 17:30 | |
Banschey Пользователь Сейчас: Offline
Имя: Banschey Откуда: Донецк, Украина Регистрация: 22.03.2015
| Но суть задание в этом: Создайте класс , который динамически выделяет память под строку. Сама строка задается как параметр конструктора. Для выделения памяти используйте операторы new и delete.
|
5.10.2015 / 17:30 | |
Naik Пользователь Сейчас: Offline
Имя: %name% Регистрация: 14.03.2010
| Banschey, конструктор копирования — обычный конструктор, который принимает (const strtype &s) может можно и без const
p.s. концепция правильная, только это лишнее char *t = new char[]; можно просто char *t;
И я бы поменял в конструкторе массив на обычный указатель, так код понятнее, имхо
Изменено Naik (5.10 / 17:34) (всего 2 раза) |
5.10.2015 / 17:38 | |
Banschey Пользователь Сейчас: Offline
Имя: Banschey Откуда: Донецк, Украина Регистрация: 22.03.2015
| Naik, можно пример ? Просто нужно удалить этот массив, но выдает что он уже был удален, значит обращение было к тому что переданно в конструктор а не к новому массиву. Изменено Banschey (5.10 / 17:40) (всего 1 раз) |
5.10.2015 / 17:44 | |
Naik Пользователь Сейчас: Offline
Имя: %name% Регистрация: 14.03.2010
| Banschey, надо скопировать строку в конструкторе в новую область памяти
|
5.10.2015 / 17:47 | |
Banschey Пользователь Сейчас: Offline
Имя: Banschey Откуда: Донецк, Украина Регистрация: 22.03.2015
| Вот как это сделать ? ) не знаю
|
5.10.2015 / 17:53 | |
Naik Пользователь Сейчас: Offline
Имя: %name% Регистрация: 14.03.2010
| Banschey, #include <cstring>
#include <iostream>
class Holder {
char *str;
public:
Holder() : str(0) {} // default constructor
Holder(char *str) {
this->str = new char[strlen(str) + 1];
strcpy(this->str, str);
}
~Holder() {
if (str) delete [] str;
}
// const чтобы нельзя было делать такой фигни holder.getString()[0] = 'B';
const char* getString() {
return str;
}
};
int main(int argc, char const *argv[]) {
Holder holder("Testovaya stroka");
std::cout << holder.getString();
return 0;
}
Только вот преобразование строки в указатель объявлено устаревшим warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings] Изменено Naik (5.10 / 18:03) (всего 4 раза) |
5.10.2015 / 18:37 | |
Banschey Пользователь Сейчас: Offline
Имя: Banschey Откуда: Донецк, Украина Регистрация: 22.03.2015
| Naik , всё работает спс ) чтоб работала нужно в начале прописать #pragma warning(disable : 4996)
|