Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Обучение и начало програмирования на С++

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33

Открыть новую тему     Написать ответ в эту тему

yagififk

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ой, а можно я тут свой вопрос задам?
 
Как явно вызвать конструктор?

Код:
 
class T
{
public:
    T(){}
    ...
};
 
...
 
T * t = (T*)malloc(sizeof(T));
t->T();  //нельзя, говорит error C2273: 'function-style cast' : illegal as right side of '->' operator
 

Ну вот

Всего записей: 7 | Зарегистр. 27-04-2005 | Отправлено: 06:50 22-07-2005
TheChampion

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
yagififk
Никак. Если объект создается в стеке, то конструктор вызывается автоматически. Если в куче, то используешь operator new. Если по каким-то причинам тебе необходимо создать объект именно через malloc (вот уж не знаю, зачем), то можно просто скопировать объект.

Код:
T t; // В стеке, автоматический неявный конструктор
T* t = new T; // В куче, неявный конструктор вручную
T* t = (T*)malloc(sizeof(T));
*t = T(); // Создание и копирование объекта  
 

Всего записей: 656 | Зарегистр. 25-06-2004 | Отправлено: 07:11 22-07-2005
yagififk

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Если по каким-то причинам тебе необходимо создать объект именно через malloc (вот уж не знаю, зачем)
Да вообщем хочу сделать класс динамических массивов Просто хотел realloc() использовать
Ну чтож спасибо, сделаю так:
T* t = (T*)malloc(sizeof(T));  
*t = T(); // Создание и копирование объекта
 
Добавлено:
Эээээ, люди, так дело не пойдёт А если в операторе присваивания что-нибудь удаляется, а конструктор то я не вызывал Есть ли какое-нибудь другое решение проблемы?
 
Вообщем была идея такова. Выделить память под то количество элементов которое требуется и вызвать для них конструкторы, плюс выделить память для запасных элементов и вызывать конструкторы по мере добавления новых элементов в массив Ну а если уж выделенная память закончится то использовать realloс

Всего записей: 7 | Зарегистр. 27-04-2005 | Отправлено: 07:33 22-07-2005 | Исправлено: yagififk, 07:33 22-07-2005
TheChampion

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
yagififk
А почему бы не использовать operator new[]()?

Код:
T* t = new T[100];
//...
delete[] t;

Всего записей: 656 | Зарегистр. 25-06-2004 | Отправлено: 12:13 22-07-2005
yagififk

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ну я написал выше почему
Оказалось надо перегрузить оператор new
 
void * operator new (size_t, void *ptr) {return ptr;} //он ничего не делает, просто когда мы будем его использовать, то будет вызываться конструктор, что нам и требовалось
void operator delete(void *, void *){} //чтоб компилятор не матерился
 
Тогда конструктор можно вызывать так:
 
T *t;
t = (T*)malloc(sizeof(T)); //выделяем память, но конструктор не вызывается
t = new (t) T(); //в качестве параметра оператора new передаётся указатель куда нужно вызвать конструктор

Всего записей: 7 | Зарегистр. 27-04-2005 | Отправлено: 13:30 22-07-2005 | Исправлено: yagififk, 13:30 22-07-2005
TheChampion

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
yagififk
А почему бы не выделить памяти "сколько надо" при помощи operator new[]()? Какая разница --- использовать realloc или связку new[]/delete[] в паре с std::copy()? Все, что нужно --- объявить конструктор по умолчанию, тем более что у тебя он есть.
 
std::vector реализован именно так: выделяется память при помощи std::vector::reserve(), это параметр capacity. Но кроме него есть еще параметр size, причем в любой момент времени size <= capacity. std::vector::at обеспечивает доступ к элементам вектора в диапазоне [0; size).

Всего записей: 656 | Зарегистр. 25-06-2004 | Отправлено: 16:12 22-07-2005
vserd

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
OtD
Как напишу, кину. Просто у меня было стойкое убеждение что на C++ такое должно быть. :((
 
ALL
вопрос по перечеслениям (enum)
Есть ли возможность определить последнее (верхнее) значение перечисления, и можно -ли использовать их в цикле?
т.е. хочется чего-то тако-го:
enum testEnum{
tefirst, tesecond, teOther  
}
for (i=GetFirstEnum(testEnum); GetLastEnum(testEnum); I=+)
{}
где GetFirstEnum, GetLastEnum, возвращают первую и последнее занчение enum.  
Или в С++ более правильным является объявление типа такого
enum testEnum{
tefirst, tesecond, teOther, teLast= teOther
}
и в цикле перебирать for (i=tefirst; teLast; I=+)?
 
В общем я хочу сделать некоторре множество идентификаторов, а потом использовать его для индексирования некотоого массива.
 
P.S. не бейте ногами если говорю ересь в смысле C++, я его только изучаю :)

Всего записей: 2065 | Зарегистр. 08-05-2002 | Отправлено: 16:28 22-07-2005 | Исправлено: vserd, 16:55 22-07-2005
TheChampion

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
vserd
А почему бы не использовать std::set, итераторы и std::map? Просто нет способа перечислить элементы перечисления, но можно их занумеровать:
 

Код:
enum testEnum{teFirst=0, teSecond=1, teThird=2, teLast=3}
for(testEnum e = teFirst; у != teLast; e++);

 
А вот перечислить элементы множества --- раз плюнуть.
 
Добавлено:
Еще можно создать множество с членами типа testEnum и перечислять. Правда, необходимо определить operator<(testEnum&, testEnum&) для возможности объявления множества типа std::set<testEnum>.

Всего записей: 656 | Зарегистр. 25-06-2004 | Отправлено: 17:39 22-07-2005
Xarde



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
OtD

Цитата:
По моему, это глубочайшее заблуждение.

Но дельфи действительно компилирует быстрее билдера. Заметно быстрее. Факт проверен на разных машинах и разных версиях.

Цитата:
Подскажите, что более привлекательней для использования и кто, как, этим пользуется?

Я бы использовал первый вариант. Почему? Потому что во втором создается некоторое количество ненужного мусора, вроде таблицы виртуальных функций. Причем во втором у тебя есть один объект на функию и для создания такой же (по параметрам вызова и результата) придется писать еще один объект. И наследование не поможет - нет виртуальности operator(). В указанном примере нет. Но можно и поправить.

Всего записей: 266 | Зарегистр. 06-07-2003 | Отправлено: 00:28 23-07-2005
yagififk

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
TheChampion, ну я же пока только учусь Тем более двоешник, это задание ещё в мае надо было сдать Спасибо за совет, потом посмотрю разберусь, сейчас пока времени мало

Всего записей: 7 | Зарегистр. 27-04-2005 | Отправлено: 07:04 23-07-2005
TheChampion

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Xarde

Цитата:
Но дельфи действительно компилирует быстрее билдера. Заметно быстрее. Факт проверен на разных машинах и разных версиях.

Вы будете смеяться, господа, но MSVS программы той же функциональности компилирует чуть-чуть медленнее Delphi. Не умеют в Borland писать компиляторы C++.
 
А g++ 4 версии вообще всех имеет в плане скорости компиляции!

Всего записей: 656 | Зарегистр. 25-06-2004 | Отправлено: 09:22 23-07-2005
vserd

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Xarde

Цитата:
Но дельфи действительно компилирует быстрее билдера. Заметно быстрее. Факт проверен на разных машинах и разных версиях.  

Я не знаю как в Builder-е компилируется PAS-код, но по той причине что Builder поддерживает компиляцию Delphi кода не приходится надеятся на быстроту.
Чудес не бывает, за расширенные возможности приходится чем-то жертвовать.
IMHO Даже если используется только C++ компилер выполняет внутренние проверки на PAS, а так как это работа со стороками, на скорость не приходится расчитывать.
 
TheChampion
Ты сам себе протеворечишь

Цитата:
Просто нет способа перечислить элементы перечисления, но можно их занумеровать:  
 
А вот перечислить элементы множества --- раз плюнуть.  

Или это я глючу что enum == множество? :(
 

Цитата:
 
Код:enum testEnum{teFirst=0, teSecond=1, teThird=2, teLast=3}  
 

разве enum testEnum{teFirst, teSecond, teThird} не начинается с 0? (вроде в доке сказано что именно так).
 
я в Delphi могу сделать вот так:

Код:
 
Type
  TTestEnum=(teFirst, teSecond, teThird);
  TMyArray= array [Low(TTestEnum)..High(TTestEnum)] of integer ;
 

и спокойно дальше работать с этим массивом
  for i:=Low(TTestEnum) to High(TTestEnum) do .....
 
Если мне понадобится расширить TTestEnum, я изменяю объявление TTestEnum и все, на остальном коде это не отразится.
 
тоже самое на Visual C++  
enum testEnum{teFirst=0, teSecond=1, teThird=2, teLast=3} ;
int TestArr[?????];
for(testEnum e = ?????; e !=?????; e++);

Всего записей: 2065 | Зарегистр. 08-05-2002 | Отправлено: 12:34 23-07-2005
TheChampion

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
vserd

Цитата:
 Ты сам себе протеворечишь  

Нет, просто я знаю C++.
 

Цитата:
 Или это я глючу что enum == множество?  

Как ты думаешь, enum и std::set --- синонимы?
 

Цитата:
разве enum testEnum{teFirst, teSecond, teThird} не начинается с 0? (вроде в доке сказано что именно так).  

 
Ну да, именно так. Но тебе мало что мешает написать

Код:
enum testEnum {teFirst, teSecond = 25, teThird}


Всего записей: 656 | Зарегистр. 25-06-2004 | Отправлено: 16:28 23-07-2005 | Исправлено: TheChampion, 16:35 23-07-2005
dantess



Newbie
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Народ, помогите, плиз - никак не могу разобраться (пишу на perl очень давно), с++ не знаю вообще, но нужно написать програмку для института. Все элементарно, на perl- все бы сделал за 20 минут... а на с++..
 
Вопрос такой:
 
Как на Visual C++ (если что- компилятор Microsoft`овский) прочитать из файла (CSV - файл, где все значения разделены запятыми) и запихнуть в многомерный массив...

Всего записей: 21 | Зарегистр. 04-05-2004 | Отправлено: 22:28 24-07-2005
TheChampion

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
dantess
Как обычно. Считываешь строки через std::ifstream::getline(), указав в качестве разделителя запятую. Что-то вроде этого:

Код:
const int MAX = 1024;
char data[MAX + 1]; // Разделитель!
 
std::ifstream from("input.dat");
for(;;)
{
  from.getline(data, MAX, ','); // Запятая
  if(!from)
    break;
  // Делаем что-то с data
  from.getline(data, MAX, ','); // Запятая
  // Делаем что-то с data
  from.getline(data, MAX, '\n'); // Конец строки
  // Делаем что-то с data
}

 
Если же размер строки (т. е. количество запятых) заранее неизвестно, то делаем более хитро:

Код:
const int MAX = 1024;
char data[MAX + 1]; // Разделитель!
 
std::ifstream from("input.dat");
for(;;)
{
  from.getline(data, MAX); // По умолчанию --- конец строки
  if(!from)
    break;
  char strdata[MAX + 1];
  std::istringstream strfrom(std::string(data));
  for(;;)
  {
    strfrom.getline(strdata, MAX, ','); // До запятой или конца потока
    if(!strfrom)
      break;
    // Что-то делаем со строкой strdata
  }
}

Всего записей: 656 | Зарегистр. 25-06-2004 | Отправлено: 09:23 25-07-2005 | Исправлено: TheChampion, 09:31 25-07-2005
vserd

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
TheChampion

Цитата:
Как ты думаешь, enum и std::set --- синонимы?  

конечно же нет. Если явно указывать что это std::set воросов не возникает, а если литературно....
Тут видно проблема с переводом. :(. В паскале TTestEnum=(teFirst, teSecond, teThird) обозван Enumerated type в русско-язычной литереатуре "множество". Вот и глючу.
 
 
   

Всего записей: 2065 | Зарегистр. 08-05-2002 | Отправлено: 11:48 25-07-2005
TheChampion

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
vserd

Цитата:
В паскале TTestEnum=(teFirst, teSecond, teThird) обозван Enumerated type в русско-язычной литереатуре "множество". Вот и глючу.

 
По-моему в русской версии вирта это называется "перечислимый тип". В паскале ведь это тоже разные вещи! Ты пишешь в духе:
 

Код:
type my_enum = (First, Second, Third);
  my_set = set of my_enum;

Всего записей: 656 | Зарегистр. 25-06-2004 | Отправлено: 12:26 25-07-2005
WiseAlex



Софтовых дел М...
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
vserd
общее замечание по поводу перехода на с++ с других языков:
с++ не является высокоуровневым языком программирования, т.е. не имеет встроенной в язык поддержки строк, множеств, комплексных чисел, ввода/вывода и.т.д. Массивы и перечисления поддерживаются в самом базовом исполнении фактически не предоставляя высокоуровневых операций с ними.
Фактически все высокоуровневые типы и возможности реализуются в виде классов и функций.

Всего записей: 1001 | Зарегистр. 02-03-2003 | Отправлено: 13:18 25-07-2005
TheChampion

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
WiseAlex

Цитата:
 с++ не является высокоуровневым языком программирования, т.е. не имеет встроенной в язык поддержки строк, множеств, комплексных чисел, ввода/вывода и.т.д.

А чем это плохо? На C++ можно писать программы как угодно и для чего угодно. По-моему, лучше иметь маленький язык с большой хорошей библиотекой, чем большой язык с убогими библиотеками и нафиг ненужными возможностями.

Всего записей: 656 | Зарегистр. 25-06-2004 | Отправлено: 14:25 25-07-2005
Zingerrr

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
По с++ и другим языкам программирования написано множество книг, но почему-то многие (а может и немногие) с этими книгами не могут достичь цели ... Может у них  нехватает упорства или чего-то  другова, а может дело и в книгах…
 
По моему мнению  многие книги хотя  и неплохо описывают "кирпичики языка", но содержат не интересные (абстрактные) примеры и задачи  - поэтому  быстро надоедает писать  что ни будь типа "Hello world" выполняя задачи и примеры, а написать что ни будь толковое самому знаний(фантазии ...)  пока что не хватает.
Эти книги можно сравнивать с  простейшим конструктором  - автор показывает простые кубики , а дальше делай что хочешь...
 
Мне кажется многим была интересна книга типа "конструктора lego" -где бы автор вначале книги поставил достаточно сложную но интересную  задачу , а потом на протяжение книги показал как ее решить(двумя тремя способами). Раскрыл бы свойства языка, провел бы читателей от разработки алгоритма до  написания кода ....    

Всего записей: 29 | Зарегистр. 10-06-2005 | Отправлено: 14:56 25-07-2005 | Исправлено: Zingerrr, 14:59 25-07-2005
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Обучение и начало програмирования на С++


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2025

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru