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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.12.2012, 19:23   #1
Dizelektwo
Пользователь
 
Регистрация: 05.04.2012
Сообщений: 56
По умолчанию template стек

Код робит.

PHP код:
#include "stdafx.h"
#include "iostream"

using namespace std;

template < class T>
class 
stack {
 
    
template <class T>
    
    
struct item {
        
item prev;
        
T data;
    };
    public:  
stack() { count=0;}
item<T> * it;
T toItemT);
T outItem();
T pop();
T slow();
int count;
};

template <class T>
T stack<T>::toItem(T elem) {
        
     
item <T>* el= new item<T>;
    
   if(
count==0) {
         
    
el->dataelem;
    
el->prev=0;
    
it=el;
    
count++;
    }
        else {
                
el->dataelem;
                
el->prev=it;
                
it=el;
            
        }
return 
0;
}

template <class T>
T stack <T>::outItem() {
    
item<T> * el= new item<T>;
    
el=it;
    
cout << el->data << endl;
    for(;
el->prev!=0el=el->prev) {

        
cout << el->data << endl;
    }
     return 
0;
}

template<class T>
T stack<T>::pop() {
item<T> *lit->prev;
delete [] it;
it=l;
count--;
return 
0;
}

template<class T>
T stack<T>::slow() {
    
    
stack();
               for(
int i=0i<5i++) {
               
toItem(rand()%100);  
    }
   
    
outItem();
    
pop();    
    return 
0;
}

int main()

{  
stack<intp;
   
p.slow();

    
system("pause");
    return 
0;


Последний раз редактировалось Dizelektwo; 14.12.2012 в 02:13.
Dizelektwo вне форума Ответить с цитированием
Старый 13.12.2012, 19:29   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Код:
 int stack<int>::slow();
1. Это что? Определение или прототип функции? Откройте учебник и посмотрите, как вызываются функции. Ну или хотя бы ниже на систем гляньте.
2. slow не статическая функция -> нужен объект, а не имя класса.

Кстати, ваш
Код:
stack<T> p;
в slow уничтожится с выходом из нее. И все ваши
Код:
p<T>.toItem(4);
p<T>.toItem(1);
никто не увидет (

Последний раз редактировалось p51x; 13.12.2012 в 19:32.
p51x вне форума Ответить с цитированием
Старый 13.12.2012, 19:35   #3
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Код:
int main()
{
    slow<int>();
    system("pause");
    return 0;
}
_Bers вне форума Ответить с цитированием
Старый 13.12.2012, 19:56   #4
Dizelektwo
Пользователь
 
Регистрация: 05.04.2012
Сообщений: 56
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Код:
 int stack<int>::slow();
1. Это что? Определение или прототип функции? Откройте учебник и посмотрите, как вызываются функции. Ну или хотя бы ниже на систем гляньте.
Это называется 'ПОПЫТКА', для уточнения - одна из сотни. Как вызываются ф-ии классов я ПРЕКРАСНО знаю. Вопрос задан конкретно и точно - " как вызвать ф-ию шаблонного класса которая бы работала с его шаблонной структурой из main'а".
Там вызов отличается от обычного stack p, p.slow(). Скажете что не так?


Цитата:
2. slow не статическая функция -> нужен объект, а не имя класса.


Кстати, ваш
Код:
stack<T> p;
в slow уничтожится с выходом из нее. И все ваши
Код:
p<T>.toItem(4);
p<T>.toItem(1);
никто не увидет (
Там ничего не уничтожается, так как в it хранится указатель на последний элемент односвязного списка и в ф-ии slow программа его выводит.


_Bers

Спасибо, четко и лаконично, кое что ясно теперь. Но ф-ия является методом шаблонного класса, а не просто шаблонной ф-ей. выскакивает ошибка
Цитата:
1>c:\users\ыыиг\documents\visual studio 2010\projects\stack\stack\stack.cpp (79): error C2059: синтаксическая ошибка: .
1>c:\users\ыыиг\documents\visual studio 2010\projects\stack\stack\stack.cpp (80): error C2275: T: недопустимое использование этого типа в качестве выражения
1> c:\users\ыыиг\documents\visual studio 2010\projects\stack\stack\stack.cpp (86): см. объявление "T"
1>c:\users\ыыиг\documents\visual studio 2010\projects\stack\stack\stack.cpp (80): error C2059: синтаксическая ошибка: .
С этим все понятно. разберусь сам

Последний раз редактировалось Dizelektwo; 13.12.2012 в 20:09.
Dizelektwo вне форума Ответить с цитированием
Старый 13.12.2012, 20:14   #5
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
Вопрос

Можно спросить а цель всего этого глючева?может мы посоветуем более человечий и логичный подход.
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Perchik71 вне форума Ответить с цитированием
Старый 13.12.2012, 20:15   #6
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

ты ошибаешься:


Код:
template<class T>
T slow() {
    
    stack::stack();    //<---- запуск конструктора. Ошибка компиляции (не указан аргумент шаблона)
    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();
}
Это свободная функция.

Последний раз редактировалось _Bers; 13.12.2012 в 20:19.
_Bers вне форума Ответить с цитированием
Старый 13.12.2012, 20:17   #7
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Код:
template < class T>
class stack {
    
    template <class T>
    
    struct item {

        item <T> * prev;
        T data;
    };

stack() { count=0;}
item<T> * it;
void toItem( T);
void outItem();
T slow();          //<----- отсутствует реализация
int count;
};
_Bers вне форума Ответить с цитированием
Старый 13.12.2012, 20:20   #8
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

ты ошибься походу

Код:
template<class T>
T stack<T>::slow() {
    
    stack::stack();
    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();
}
ибо так будет правильней.
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Perchik71 вне форума Ответить с цитированием
Старый 13.12.2012, 20:24   #9
Dizelektwo
Пользователь
 
Регистрация: 05.04.2012
Сообщений: 56
По умолчанию

Perchik71

спасибо, не заметил сам. в рот мне ноги D. С ф-ей outItem() я так же накосячил, исправил


Цитата:
Сообщение от _Bers Посмотреть сообщение
Код:
template < class T>
class stack {
    
    template <class T>
    
    struct item {

        item <T> * prev;
        T data;
    };

stack() { count=0;}
item<T> * it;
void toItem( T);
void outItem();
T slow();          //<----- отсутствует реализация
int count;
};
Компилятор знает что это ф-ия и никакой ошибки здесь нет.

Цитата:
stack::stack(); //<---- запуск конструктора. Ошибка компиляции (не указан аргумент шаблона)
stack<T>::stack(); Так?

Последний раз редактировалось Dizelektwo; 13.12.2012 в 20:32.
Dizelektwo вне форума Ответить с цитированием
Старый 13.12.2012, 20:29   #10
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Dizelektwo Посмотреть сообщение
Вопрос задан конкретно и точно - " как вызвать ф-ию шаблонного класса которая бы работала с его шаблонной структурой из main'а".
Там вызов отличается от обычного stack p, p.slow(). Скажете что не так?
Общий случай имеет вид: obj.Method<type>(arg);
В угловых скобочках нужно указать тип параметра шаблона.

Так же, возможен автоматический вывод этого типа из аргументов функции:

Код:
struct Example
{
    template<class T> void Test(const T& rhs)   {...}
};
использовать можно так:
Код:
Example obj; obj.Test<int>(10);
или так:

Код:
//по аргументу компилятор сам догадается, какой должен быть параметр шаблона
Example obj; obj.Test(10);
Цитата:
Сообщение от Dizelektwo Посмотреть сообщение
Там ничего не уничтожается, так как в it хранится указатель на последний элемент односвязного списка и в ф-ии slow программа его выводит.
Ты ошибаешься.
1. Объект твоего класса создается на стеке, и будет уничтожен по завершению работы функции.

2. Ты не просто потеряешь все данные, но и поимеешь утечку памяти.

3. Шаблон класса вообще не обладает защитой от утечек памяти.
_Bers вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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