Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.12.2012, 20:36   #11
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Dizelektwo Посмотреть сообщение
Компилятор знает что это ф-ия и никакой ошибки здесь нет.
Ошибка была в том, что ты создал свободную функцию, и объявил метод, у которого отсутствует реализация. Пример:


Код:
struct Example
{
   void Work(); //это только прототип, у него нет реализации
}

//а вот это свободная функция. 
//Она не имеет никакого отношения к классу Example
void Work() {}
Но если не нужна была свободная функция, а именно метод, то нет никакой причины создавать внутри этого метода ещё один локальный объект.

Вот так метод будет работать:

Код:
template<class T> T stack<T>::slow() 
{
    stack<T>();      
    stack<T> p;
    p<T>.toItem(4);
    p<T>.toItem(1);
    p<T>.toItem(7);
    p<T>.toItem(71);
    p<T>.toItem(73);
    p<T>.toItem(9);
    p<T>.toItem(0);
    p<T>.toItem(3);
    p<T>.outItem();
}
Он содержит две утечки памяти.

Вот так метод будет работать и не содержит утечек памяти:


Код:
template<class T> T stack<T>::slow() 
{
    toItem(4);  toItem(1);  toItem(7);  toItem(71);  toItem(73);  toItem(9);  toItem(0);  toItem(3);
    outItem();
}
Однако, сам шаблон класса все равно течет. Каждое уничтожение объекта будет приводить к потери всей памяти, которую успел запросить экземпляр класса.

Последний раз редактировалось _Bers; 13.12.2012 в 20:39.
_Bers вне форума Ответить с цитированием
Старый 13.12.2012, 20:50   #12
Dizelektwo
Пользователь
 
Регистрация: 05.04.2012
Сообщений: 56
По умолчанию

Цитата:
1. Объект твоего класса создается на стеке, и будет уничтожен по завершению работы функции.
Это знаю, говорил просто о немного другом) А именно о том, что информация будет выведена потоком в консоль прежде чем произойдет возврат из ф-ии.

Код:
template<class T> T stack<T>::slow() 
{
    stack<T>();      
    stack<T> p;
    p<T>.toItem(4);
    p<T>.toItem(1);
    p<T>.toItem(7);
    p<T>.toItem(71);
    p<T>.toItem(73);
    p<T>.toItem(9);
    p<T>.toItem(0);
    p<T>.toItem(3);
    p<T>.outItem();
}
Здесь я вообще накатал явный бред создав в методе новый оъект. Спасибо за то что заметили.
Сплошная невнимательность.

Что до утечек памяти, то деструктор писать пока не стал. А вот про утечку памяти через шаблоны я не знал откровенно.

Как создать объект шаблонного класса в ф-ии main? Про вызов метода от созданного объекта я уже понял, спасибо Вам.
И еще вопрос, почему main не может быть шаблонной? потому что всегда возвращает только integer?

Последний раз редактировалось Dizelektwo; 13.12.2012 в 21:08.
Dizelektwo вне форума Ответить с цитированием
Старый 13.12.2012, 21:18   #13
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

void main(void)
float main(void)

ей безразницы.....
но шаблоной она быть не может..
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Perchik71 вне форума Ответить с цитированием
Старый 13.12.2012, 21:26   #14
Dizelektwo
Пользователь
 
Регистрация: 05.04.2012
Сообщений: 56
По умолчанию

void main(void)
float main(void)

она всегда возвращает int. void это вообще маразм.

Так как создать объект шаблонного класса в main?? Ни как, верно?
Dizelektwo вне форума Ответить с цитированием
Старый 13.12.2012, 21:31   #15
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Dizelektwo Посмотреть сообщение
void main(void)
float main(void)

она всегда возвращает int. void это вообще маразм.

Так как создать объект шаблонного класса в main?? Ни как, верно?
main() это особая функция, которая всегда возвращает int


Код:
int main()
{
   template_obj<type> obj;
}
_Bers вне форума Ответить с цитированием
Старый 13.12.2012, 21:34   #16
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

Цитата:
Сообщение от Dizelektwo Посмотреть сообщение
void main(void)
float main(void)

она всегда возвращает int. void это вообще маразм.

Так как создать объект шаблонного класса в main?? Ни как, верно?
void main(void)
{
//return 0;
}
уопилятор жрёт.. особеность в том, что void нечего не возвращает...
int это как бы возвращение была ли ошибка или нет...
что бы получить эту ошибку через другие её использующие приложения..
winrar допустим использует приложение которое свою очередь запускает консоль распаковщика или нет... она её опрашивает void ничего не ответит и всё.

ещё раз скажу она не может быть параметизированой(шаблоной)
ибо шаблоны созданы были не ради этого а ради того что бы некоторые алгоритмы которые не критичны к типам данных, например сортировке.. ей срать чё перетасовывать... или другие алгоритмы...

шаблоный объект или фуна всего лишь шаблон...

когда вы копилите копилятор по этому шаблону делает нужный код

функция main не может быть шаблоной ибо она вызываться только один раз в программе и у неё другие цели.
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Perchik71 вне форума Ответить с цитированием
Старый 13.12.2012, 21:40   #17
Dizelektwo
Пользователь
 
Регистрация: 05.04.2012
Сообщений: 56
По умолчанию

Perchik71

компилятор жрет много маразма. main возвращает int и писать void как то **.)

_Bers

ругается.
Dizelektwo вне форума Ответить с цитированием
Старый 13.12.2012, 21:42   #18
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Perchik71 Посмотреть сообщение
void main(void)
{
//return 0;
}
уопилятор жрёт..
http://liveworkspace.org/code/1UjYUJ$0

Код:
void main(void)
{
  return 0;
}

//Compilation finished with errors:
//source.cpp:1:15: error: '::main' must return 'int'
Такое жрут только мелкомягкие. А так вообще - это не по стандарту.
По стандарту main всегда возвращает int.
И main всегда вернёт int, чего бы там ни было написано.
Не зависимо ни от прототипа, ни от наличия/отсутствия самого return
_Bers вне форума Ответить с цитированием
Старый 13.12.2012, 21:43   #19
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Dizelektwo Посмотреть сообщение

_Bers

ругается.
остановок "тута" и "здеся" не существует.
_Bers вне форума Ответить с цитированием
Старый 13.12.2012, 21:44   #20
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

возмём вектор это шаблоный класс в с++ прописан в std

Код:
vector<int> arr_int
вектор имя класа в скобках тип, желательно зарезервированный или
указатели.... в твоём случаи тоже так же

про main

в неё можно вызывать этот вектор и не только вектор....
в неё всё можно делать...

и маразм не маразм, но ограничение на неё не возлагаются.
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Perchik71 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
friend template Dmitry333 Общие вопросы C/C++ 1 05.10.2012 10:58
Template / Lambda BOBAH13 Общие вопросы C/C++ 1 09.12.2011 12:40
template, typedef и наследование valdemar593 Общие вопросы C/C++ 2 12.03.2011 18:46
Content + Template + style sealmu WPF, UWP, WinRT, XAML 0 25.02.2011 14:22
template Bogdanm Общие вопросы C/C++ 2 22.04.2010 00:20