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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.12.2012, 00:16   #41
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,833
По умолчанию

clang наше все и заканчивайте холивар )
p51x вне форума Ответить с цитированием
Старый 14.12.2012, 00:30   #42
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

кстати насчет того же int main.
этой функции сделано исключение что return 0 ей писать не нужно.(ну в студии начиная с 2008)
Цитата:
clang
любопытно, но все же нет.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 14.12.2012, 00:45   #43
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
кстати насчет того же int main.
этой функции сделано исключение что return 0 ей писать не нужно.(ну в студии начиная с 2008)любопытно, но все же нет.
Ну мс всё пытается уменьшить объём кода, что пишет программист.
Тем более понятно что MFC очень тяжёлая штуковина, которая
нуждается уже в учении у кого то. Книги мало. Хотя она ничем не отличается от VCL. но даже сегодня у человека была проблема.
Они вводят новое, что бы уменьшить громоздкость кода. который и без того большой. интересно а _tmain практически не кто не использует. он что приблуда мс?
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Perchik71 вне форума Ответить с цитированием
Старый 14.12.2012, 01:03   #44
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от Perchik71 Посмотреть сообщение
Ну мс всё пытается уменьшить объём кода, что пишет программист.
Тем более понятно что MFC очень тяжёлая штуковина, которая
нуждается уже в учении у кого то. Книги мало. Хотя она ничем не отличается от VCL. но даже сегодня у человека была проблема.
Они вводят новое, что бы уменьшить громоздкость кода. который и без того большой. интересно а _tmain практически не кто не использует. он что приблуда мс?
это не фишка мс, это стандарт С++ так говорит.
что при
Код:
int main()
{

}//здесь неявный return 0, так как если программа сюда дошла значит все хорошо)
про _tmain не знаю, но сейчас многие итак чураются юникода.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 14.12.2012, 01:18   #45
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

Код:
про _tmain не знаю, но сейчас многие итак чураются юникода.
например я) хотя у меня с этим проблем не возникает, но порой от усталости отчебучишь..... а потом на 35 минуте доезжаешь до места. Ладно спасибо буду знать =)
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Perchik71 вне форума Ответить с цитированием
Старый 14.12.2012, 01:43   #46
Dizelektwo
Пользователь
 
Регистрация: 05.04.2012
Сообщений: 56
По умолчанию

Все, программа более менее доведена до ума. Если кого не затруднит - гляньте в ф-ию pop. Действительно ли происходит удаление объекта?

П.С

Использую макрос T и всем доволен.

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

Цитата:
Сообщение от Dizelektwo Посмотреть сообщение
Все, программа более менее доведена до ума. Если кого не затруднит - гляньте в ф-ию pop. Действительно ли происходит удаление объекта?

П.С

Использую макрос T и всем доволен.
http://ideone.com/6oy3Qd

Код:
prog.cpp:7: error: declaration of ‘class T’
prog.cpp:5: error:  shadows template parm ‘class T’
prog.cpp: In member function ‘T stack<T>::slow()’:
prog.cpp:37: error: there are no arguments to ‘rand’ that depend on a template parameter, so a declaration of ‘rand’ must be available
prog.cpp:37: error: (if you use ‘-fpermissive’, G++ will accept your code, but allowing the use of an undeclared name is deprecated)
prog.cpp: In member function ‘T stack<T>::slow() [with T = int]’:
prog.cpp:43:   instantiated from here
prog.cpp:37: error: ‘rand’ was not declared in this scope
Ты, наверное, в студии пишешь?
_Bers вне форума Ответить с цитированием
Старый 14.12.2012, 12:03   #48
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Код:
#include "iostream" 
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
using namespace std; 
 
template < class T> class stack 
{ 
    template <class U> struct item { item * prev; T data; }; 
public:   
    stack() { count=0;} 
    item<T> * it; 
    T toItem(T); 
    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->data= elem; el->prev=0; it=el; count++; } 
    else { el->data= elem; 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!=0; el=el->prev) { cout << el->data << endl; } 
    return 0; 
} 
 
template<class T> T stack<T>::pop() { item<T> *l= it->prev; delete [] it; it=l; count--; return 0; } 
 
template<class T> T stack<T>::slow() 
{
    stack(); 
    for(int i=0; i<5; i++) { toItem(rand()%100);  } 
    outItem(); pop();
    return 0; 
}
 
struct Some
{
    Some(){ cout<<"Some was build\n"; }
    ~Some(){ cout<<"Some was distroyed\n"; }
};
 
int main() 
{
    stack<int> p; //p.slow(); 
    stack<Some> p1;  //утечка памяти
    
    p1.pop(); //ошибка компиляции
    
    return 0; 
}
prog.cpp: In member function ‘T stack<T>:op() [with T = Some]’:
prog.cpp:57: instantiated from here
prog.cpp:36: error: conversion from ‘int’ to non-scalar type ‘Some’ requested


Ты попытался сделать шаблон класса, но при этом думал о нем, как об обычном классе, который оперирует int.

Это твоя первая ошибка.
Вторая ошибка - отсутствие диструктора
_Bers вне форума Ответить с цитированием
Старый 14.12.2012, 12:36   #49
Dizelektwo
Пользователь
 
Регистрация: 05.04.2012
Сообщений: 56
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
Код:
#include "iostream" 

int main() 
{
    stack<int> p; //p.slow(); 
    stack<Some> p1;  //утечка памяти
    
    p1.pop(); //ошибка компиляции
    
    return 0; 
}
Ты попытался сделать шаблон класса, но при этом думал о нем, как об обычном классе, который оперирует int.

Это твоя первая ошибка.
Вторая ошибка - отсутствие диструктора
Спасибо, но на сколько мне известно, определение типа объекта при вызове шаблонной ф-ии шаблонного класса не являет нарушением концепции шаблонизации.
В slow так же может быть и тип char. А ф-ия main это ф-ия пользователь, может быть одна из многих. Ф-ию slow изменить совсем не проблема.( заполнение стека ведь всего лишь пример)

А ошибка при попке вполне понятна, Вы создали объект(пустой стек) и попнули его, вот и ошибка. Контроль полноты стека я не добавил( хотя с count это не проблема).

При всем прочем еще будет ошибка при вызове ф-ии slow с типом 'struct', понятно почему. Если добавить шаблонный аргумент в ф-ию, который мы будем добавлять в стек- ошибки не будет.



Про деструктор я знаю. уже времени небыло дописывать.
Что касается компилятора, то верно - студия.

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

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

Код:
template<class T> 
T stack<T>::pop()
{
     item<T> *l= it->prev; delete [] it; it=l; count--;
     return 0; 
}
Функция вернет объект типа Т. Возвращаемое значение функции - объект типа Т
А теперь смотри, что у тебя в return

Ноль.

Для всяких int/char это может быть и прокатит. Но для классов весь твой стек тут же поломается.

Возникает вопрос: зачем ты вообще возвращаешь ноль? Какой смысл ты в это хотел вложить? Может быть ты имел ввиду:


Код:
//вернёт ноль, если успех, или код ошибки
template<class T> 
int stack<T>::pop()
{
     item<T> *l= it->prev; delete [] it; it=l; count--;
     return 0; 
}
Когда ты пишешь шаблон, ты либо подразумеваешь, что параметрами шаблона будут некоторые типы отвечающие некоторым контрактам (указываешь эти контракты в документации, и ставишь защиту на шаблон).

Либо ты подразумеваешь, что параметром шаблона в принципе может быть совершенно любой тип.

В любом случае, как разработчик шаблона, ты должен учитывать вероятность, что пользователь твоего шаблона может запихать туда какой угодно тип данных. И шаблон должен суметь прожевать все возможные ситуации.
_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