создал массив диамический
a* data=new int[6];
поработал с ним, и нужно увеличить размерность до 8
как это сделать?
создал массив диамический
a* data=new int[6];
поработал с ним, и нужно увеличить размерность до 8
как это сделать?
Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.
29 марта 2010 в 15:05
Есть такой шаблон безопасного программирования //ru.wikipedia.org/wiki/Получение_ресурса_есть_... (RAII)
Если уж используешь new то лучше оборачивать указатель в auto_ptr.
29 марта 2010 в 14:03
пачиму?
28 марта 2010 в 22:03
Вообще лучше стараться избегать явных вызовов оператора new и delete, вместо этого использовать локальные переменные.
28 марта 2010 в 22:00
#23
> //изучаю сейчас классы, поэтому много вопросов
Изучи сначала основы C/C++, чтобы тупых вопросов не задавать.
> "cannot add two pointers"
Английский тоже изучи – полезно.
28 марта 2010 в 22:00
Ну, да.. так можно. Но проще просто
qwe object(1); //статически на стеке
Кст. конструктор у тебя закрытый, так что из мейна ругаться компилятор должен
28 марта 2010 в 22:00
там паблик был, не ругается
28 марта 2010 в 22:00
Дмитрий Ашкадов,"гетерогенный массив" уже не в счет? Или вы будете его полиморфизмом реализовывать? Правда, интересно.
Медведь , скорее всего вы написали в операторе + строку вида
int+=o.int (o – другой объект). Я сомневаюсь, в том что data должен был быть указателем, но напишите нечто в вида
int tmp=*data;
delete data;
data=new int(tmp+*(o.data));
Потому что вы складывали два указателя.
28 марта 2010 в 22:00
денис, я понимаю что Вы здесь умнее, но я прекрасно понимаю что это значит, я не знаю как это исправить
28 марта 2010 в 22:00
qwe *obj1 = new qwe(1);
qwe *obj2 = new qwe(2);
qwe obj3 = *obj1 + *obj2;
28 марта 2010 в 22:00
#30, Прошу прощения, пишу не то. Вот верный код:
return qwe(*data+*(o.data));
28 марта 2010 в 22:00
Медведь, если бы вы потратили хотя бы 5 минут времени на то, чтобы узнать, что такое объект и что такое указатель на объект, то не получили бы ни ошибки, ни вопроса.
> class * myclass = new myclass(0)
Это создание указателя на объект + инициализация самого объекта
> class myclass(0)
А это создание и инициализация объекта.
Если ты перегружаешь оператор +, то это будет применяться исключительно к самим объектам, но не к указателям, поэтому складывать надо так:
*myclass1 + *myclass2 а не myclass1 + myclass2
P.S. Такую тему на две страницы раздуть – это ж умудриться надо.
28 марта 2010 в 21:05
а. ну да, я безбожно туплю.
Леонид, а зачем конструктор? недостаточно просто размера этого чего-то?
28 марта 2010 в 21:05
#18, Нам нужен именно указатель на неведомо что. void * как раз для этого.
#19. Я принимаю sizeof(char)==1, но возможны, и кажется есть реализации компилятора, где char может не занимать 1 байт, а больше. А еще возможен typedef, который и вовсе испортит работу.
28 марта 2010 в 21:05
Так, все обладает этим конструктором ))
int a(5); //например,
28 марта 2010 в 21:05
проблема по сабжу решена способом, который дал Дмитрий HiddenSeeker Мамонтов
еще небольшой вопрос.
создаю элемент класса с помощью new
class * myclass = new myclass(0);
правильно ли делаю? нужен ли там new? нужен ли там указатель?
если с указателем то все отлично работает кроме переопределения оператора +, он с ошибкой вылетает "cannot add two pointers"
//изучаю сейчас классы, поэтому много вопросов
28 марта 2010 в 21:05
#21, ну если так, ноочень сомневаюсь, что понадобится этот указатель на неизвестно что…
28 марта 2010 в 21:05
class * myclass = new myclass(0); – что это такое?
28 марта 2010 в 21:05
немного непонятно написал)
у меня есть класс определенный
class qwe {
public:
data* int;
qwe(int n);
~qwe();
}
в main:
qwe * myclass = new qwe(1);
28 марта 2010 в 21:04
Александр [MySchizophrenia] Лищенер, если не ошибаюсь, malloc принимает размер в байтах.
Навскидку:
int bytes=500;
void * p=(void*)(new char[bytes]);
Хоть и платформозависимо.
28 марта 2010 в 21:04
2 Александр Лищенер
для new нужно что-то, обладающее конструктором.
28 марта 2010 в 21:04
Память можно выделять только блоками (минимум по байтам, а то и по словам). Так что выделение , например, 10 бит сводится к выделению одного int'а
28 марта 2010 в 21:04
В C++ по сути void * уже не нужен.
Просто
char *p = new char[500];
28 марта 2010 в 21:04
#15, почему это платформозависимо?
28 марта 2010 в 21:03
Дмитрий Ашкадов, а причем здесь оператор new? Человек с целыми числами работает, и вообще с integtal types.И codestyle здесь ни при чем.
28 марта 2010 в 21:03
№10, как выделить кусок памяти на n бит? или я безбожно туплю, или для new нужна определенность?
28 марта 2010 в 21:02
засовывайте указатель на неизвестно что (можете добавить поле, определяющее, как от этого неизвестно чего избавляться при необходимости). в чем проблема-то?
28 марта 2010 в 21:02
Объясняю… Если вы делаете проект, в котором перегружается оператор ::new, то….. Вообщем, я думаю, вы сами поняли, почему нельзя malloc и прочую C-неговскую херню. Использование malloc – уже не C++Codestyle!
28 марта 2010 в 21:02
#9, да, в чем суть, в чем проблема?
28 марта 2010 в 21:00
b * tmp=new int[8];
memcpy(b,a,6*sizeof(int) );
delete[] a;
a=b;
А вообще malloc и free лучше для таких простых примеров.
28 марта 2010 в 21:00
int *old_arr = new int[6];
….
int *new_arr = new int[8];
for (int *p = old_arr, *e = p + 6, *n = new_arr; p < e; ++p, ++n)
*n = *p;
delete[] old_arr;
28 марта 2010 в 21:00
меня уже в этой группе так ругали за маллок)
28 марта 2010 в 21:00
НИКОГДА не используй malloc и freeв C++!!!
28 марта 2010 в 21:00
спасибо сейчас попробую
28 марта 2010 в 21:00
Ну, это зависит от того, что вы хотите получить. Если простенький динамический массив чисел – то он сойдет. Если сложный обобщенный контейнер – само собой нет.
28 марта 2010 в 21:00
Дмитрий Ашкадов, и что мешает использовать malloc и free?
28 марта 2010 в 21:00
Дмитрий, представьте себе не-шаблонный связный список, в который надо что-то сунуть, неизвестно что.
предложите реализацию без malloc?
просто интересно, на самом деле)