Другое > Hard'n'Soft
Програмирование на C++
<< < (14/25) > >>
HoRRoR:

--- Цитата ---И ещё вопрос: что такое try и catch?
Я случайно в вики наткнулся когда смотрел пример: http://ru.wikipedia.org/wiki/Dynamic_cast
--- Конец цитаты ---
Перехват исключений. Т.е., например, деление на ноль - исключение, приложение выдаст ошибку. Но если ты это исключение перехватишь, то ошибки не будет - это будет часть твоего алгоритма. Также ты можешь генерировать свои исключения.


--- Цитата ---почему в примере Дейтела typeid <...>.name возвращает просто название класса, а у меня XXназвание класса, где X - цифра. Я так понимаю это зависит от компилятора, но зачем тогда minigw возвращает какие-то левые  цифры и что они означают?
На всякий случай прикрепляю пример.
UPD: Дейтел пишет что компиляторы могут выдавать по этому поводу что угодно, но зачем тогда minigw добавляет какие-то цифры и от чего зависят эти цифры?
--- Конец цитаты ---
Уж чего не знаю - того не знаю. Гугли...
gepar:
Так и не поборол что typeid(...).name() выдаёт цифры в итоге вывод идиотский получается  :(
HoRRoR:
Видимо, это для уникальности имён, чтобы два разных типа с одним именем и через typeid давали разные имена.

Добавлено позже:
Ты можешь просто удалять все цифры из начала - имя типа не может начинаться с цифры, так что ты получишь «чистое» имя типа.
gepar:
HoRRoR,а как я это сделаю ? Если допустим у меня будет строка с вот таким вот названием то как определить принадлежность к цифрами или символам (только не через switch же)? Отрезать просто первые два символа не получиться - иногда одну цифру перед названием оно возвращает, а иногда две, предугадать сложно.
HoRRoR:
Примерно так:

--- Код: ---const char* getName(const char* name)
{
    const char* c = name;
    while(*c && *c >= '0' && *c <='9') c++;
    return c;
}

--- Конец кода ---


Добавлено позже:
А есть ещё функция isdigit, которая заменяет собой *c >= '0' && *c <= '9'.
gepar:
HoRRoR, ну когда я писал "только не switch" то я догадывался что можно же ещё и циклом вот так гонять, но это тоже как-то не тру, хотя вроде наиболее практично.

--- Цитата: HoRRoR ---А есть ещё функция isdigit, которая заменяет собой *c >= '0' && *c <= '9'.
--- Конец цитаты ---
А что для неё инклюдить надо?
HoRRoR:

--- Цитата ---HoRRoR, ну когда я писал "только не switch" то я догадывался что можно же ещё и циклом вот так гонять, но это тоже как-то не тру, хотя вроде наиболее практично.
--- Конец цитаты ---
Лолшто? С чего бы это было не тру? Вот как раз свич был не к месту.


--- Цитата ---А что для неё инклюдить надо?
--- Конец цитаты ---
Можно было и загуглить. cctype.
gepar:

--- Цитата: HoRRoR ---Можно было и загуглить. cctype.
--- Конец цитаты ---
Загуглил, ничего ему не надо  :)
Но всё равно что-то я никак не могу придумать как хитро удалить из моей строки цифры собственно цикл мой:

--- Код: ---    for(int i=0;i<shape.size();i++) //цикл по всем элементам вектора
    {
        Thshape *temp=dynamic_cast<Thshape*> (shape[i]);
        cout<<"Figure ";
        if (isdigit(typeid(*shape[i]).name()[1])) // Если второй символ в названии что вернёт typeid(..).name() цифра то

         strcpy(abc,typeid(*shape[i]).name()[1]); //надо бы как-то удалить первые две цифры из строки/скопировать строку без этих первых двух символов, но не так как я написал
        cout<<abc<<" Area: "<<shape[i]->getArea();
        if (temp) //если фигура трёхмерная
         cout<<" Volume: "<<temp->getVolume();
        cout<<endl;
    }

--- Конец кода ---
HoRRoR:

--- Цитата ---Загуглил, ничего ему не надо
--- Конец цитаты ---
Лолшто?


--- Цитата ---Но всё равно что-то я никак не могу придумать как хитро удалить из моей строки цифры собственно цикл мой:
--- Конец цитаты ---
Господи, определяешь позицию первого символа-не-цифры, и с неё копируешь.
gepar:
HoRRoR,так с определением того одна или две у меня цифры проблем и не возникает. Проблема возникает с копированием из строки с заданной позиции или с удалением заданного числа символов из этой строки  с последующим сдвигом оставшихся символов.

Добавлено позже:

--- Цитата: HoRRoR ---Лолшто?
--- Конец цитаты ---
У меня не просит оно никаких сиситайпов так что не знаю, но буду иметь в виду что подключить если попросит  :)
HoRRoR:

--- Цитата ---HoRRoR,так с определением того одна или две у меня цифры проблем и не возникает. Проблема возникает с копированием из строки с заданной позиции или с удалением заданного числа символов из этой строки  с последующим сдвигом оставшихся символов.

--- Конец цитаты ---

Цифр может быть и больше. А вообще, используй мою функцию и сделай так:

--- Код: ---char real_name[256];
strcpy(real_name, getName(typeid(...).name()));

--- Конец кода ---


--- Цитата ---У меня не просит оно никаких сиситайпов так что не знаю, но буду иметь в виду что подключить если попросит
--- Конец цитаты ---
Ну значит компилятор по дефолту использует нужные либы.
gepar:

--- Цитата: HoRRoR ---Ну значит компилятор по дефолту использует нужные либы.
--- Конец цитаты ---
Ну он у меня хитрый, exit тоже если помнишь без cstdlib работает.

--- Цитата: HoRRoR ---Цифр может быть и больше. А вообще, используй мою функцию и сделай так:Код:char real_name[256];strcpy(real_name, getName(typeid(...).name()));
--- Конец цитаты ---
Больше 2х и меньше 1го пока ни разу не было так что я вот и решил что здесь подойдёт и такая проверка.
Ну а в char массиве я уже помню как копировать начиная с нужного символа, просто хотел и здесь как-то схитрить чтобы было копирование начиная с заданного символа посредством директивы <string>.

Добавлено позже:
Получилось в итоге сделать вот так:

--- Код: ---    for(int i=0;i<shape.size();i++) //цикл по всем элементам вектора
    {
        Thshape *temp=dynamic_cast<Thshape*> (shape[i]);
        char abc[10];
        cout<<"Figure ";
        strcpy(abc,typeid(*shape[i]).name());
        if (isdigit(abc[1]))
         strcpy(abc,&abc[2]);
        else if (isdigit(abc[0]))
         strcpy(abc,&abc[1]);
        cout<<abc<<" Area: "<<shape[i]->getArea();
        if (temp) //если фигура трёхмерная
         cout<<" Volume: "<<temp->getVolume();
        cout<<endl;
    }
--- Конец кода ---
Хотя я всё сомневался поймёт ли меня strcpy, как оказалось поняла и сделала тот сдвиг что я и хотел  :)
Спасибо за подсказку, с string и её фишками чуть потом разберусь, по Дейтелу дальше шаблоны идут, хотя лабу ещё нужно бы сделать по с++ ту что сдавать на наследование, ато я всё по Дейтелу задачки решаю. Да вот только лаба что сдавать нужна в борланде с++, а он такой гадостный, а его библиотека graphick.h тупая и неудобная + этот борланд код любит портить, после написания в текстовом редакторе он вечно какие-то символы испортит и потом из него приходиться править до этого работающий код, не удивительно что его компилятор не популярен.
HoRRoR:

--- Цитата ---Больше 2х и меньше 1го пока ни разу не было так что я вот и решил что здесь подойдёт и такая проверка.
--- Конец цитаты ---
Слушай, какой из тебя программист с таким мышлением? Логику хотя бы включи - если у тебя больше 100 типов, то и нумерация будет соответствующая. Да и без логики понятно, что нельзя утверждать того, чего не знаешь.


--- Цитата ---Ну а в char массиве я уже помню как копировать начиная с нужного символа, просто хотел и здесь как-то схитрить чтобы было копирование начиная с заданного символа посредством директивы <string>.
--- Конец цитаты ---
Какой ещё директивы <string>? Нет такой директивы, есть такой заголовок. И при чём тут заголовок класса string?


--- Цитата ---Получилось в итоге сделать вот так:

--- Конец цитаты ---
А ты упёртый. В итоге всё равно сделал через одно место и ненадёжно, потому что рассматриваешь всего два случая из неизвестно сколько возможных.


--- Код: ---strcpy(abc,&abc[1]);

--- Конец кода ---
А вот так не делают. Не копируют между перекрывающимися областями памяти, потому что могут быть какие угодно последствия - ты не знаешь, как конкретно реализовано. Иногда такое вообще не работает.

gepar:
HoRRoR,спасибо, учту на следующий раз, но я упёртый и проверку в этот раз уже править не буду  :) Ну хотя бы потому что судя по выводу оно цифры как-то рандомно добавляет, ну вот сам посмотри оно выдаёт 6Circle для объекта класса двухмерных фигур, 6Square (для объекта того же класса) и 6Sphere для объекта другого класса трёхмерных фигур. Максимальное число оно выдаёт перед одним из классов 11, но у меня только 6 классов  и 6 объектов.
HoRRoR:
А с чего ты взял, что оно всегда будет выдавать 1-2 символа? Где гарантия, что ты не получишь 100500Circle? Так что это не решение проблемы, это костыль, который может перестать работать.
gepar:
HoRRoR, блин, я понял магию цифр, это пишется количество символов в имени типа, а мы тут гадаем  :) Ну тогда 100500 точно не будет, да и больше двух цифр тоже не будет :)

Добавлено позже:
HoRRoR,а можно вопрос, а что у нас C++ Builder собой являет? Я предварительно в википедии почитал, но до конца так и не понял в чём отличие его от обычного компилятора? В этой drag-and-drop возможности аля дельфи и всё?

Добавлено позже:
Алгоритм сортировки (с подтанцовкой)  :)
HoRRoR:

--- Цитата ---HoRRoR,а можно вопрос, а что у нас C++ Builder собой являет? Я предварительно в википедии почитал, но до конца так и не понял в чём отличие его от обычного компилятора? В этой drag-and-drop возможности аля дельфи и всё?
--- Конец цитаты ---
Драг-н-дроп - это VCL, а не дельфи и не билдер. В принципе - в билдере используется борладовский компилятор C/C++, но с поддержкой VCL (с помощью своего рода костыля - классы скомпилированы на дельфях, могут создаваться только через new, ибо в дельфях объект класса мог быть только указателем). Не знаю, что именно виновато - IDE или компилятор, но всё это дело очень часто безбожно глючит, поэтому я им не пользуюсь.
gepar:
А почему я не могу сделать вот так:

--- Код: ---    Account a(5); // Базовый класс, остальные его наследуют (public)
    SavingAccount b(5,2);
    CheckingAccount c(5,1);
    SavingAccount d(10,3);
    CheckingAccount e(7,2);
    vector <Account*> acc(4);
    acc[0]=&b;
    acc[1]=&c;
    acc[2]=&d;
    acc[3]=&e;
    for (size_t i=0;i<acc.size();i++)
    {
        SavingAccount *f=dynamic_cast<SavingAccount*>(acc[i]); //Нельзя преобразовать если в базовом нет виртуальных функций
        if (f)
         cout<<"Interest: "<<f->calculateInterest();
    }
--- Конец кода ---
те: я не могу использовать преобразование если в моём базовом классе нет ни одной virtual функции (пусть и не обязательно полностью виртуальной( =0 ))? Я по ходу плохо понял как именно оно делает динам. преобразование в ходе выполнения программы.

Добавлено позже:
И ещё можно как-то получать не только название класса, но и ещё какой именно это класс. Ну чтобы было не просто возвращено CheckingAccount, а CheckingAccount  a например.
HoRRoR:

--- Цитата ---А почему я не могу сделать вот так:
--- Конец цитаты ---
Пора бы уже научиться читать тексты ошибок - source type is not polymorphic. Т.е. в нём должна быть хотя бы одна виртуальная функция, чтобы он стал был полиморфным.


--- Цитата ---И ещё можно как-то получать не только название класса, но и ещё какой именно это класс. Ну чтобы было не просто возвращено CheckingAccount, а CheckingAccount  a например.
--- Конец цитаты ---
Нет.
gepar:
HoRRoR,я читал, но оно ругалось страшно и длинно  :)

--- Цитата: HoRRoR ---Нет.
--- Конец цитаты ---
Блин, хотя я изначально думал что и название класса не получиться вот так просто получить.

Добавлено позже:
Начал читать о шаблонах. Удобно пользоваться, но не удобно объявлять так как объявление не совсем логично выглядит.
Допустим я в .h файле сделал вот так

--- Код: ---template <typename T>
class Stack
{
public:
    Stack(int =10);
    ~Stack()
    {
        delete [] stackPtr;
    }

    bool push(const T&);
    bool pop(T&);
    bool isEmpty() const
    {
        return top==-1;
    }
    bool isFull() const
    {
        return top==size-1;
    }

private:
    int size;
    int top;
    T *stackPtr;
};

--- Конец кода ---

Так чтобы потом функции написать по этим прототипам нужно же писать

--- Код: ---template <typename T>
bool Stack<T>::push(const T &pushValue)
--- Конец кода ---
что имхо не логично - класс же у меня Stack и если я и так уже написал что это класс с использованием шаблона то почему бы дальше не написать просто

--- Код: ---bool Stack::push(const T &pushValue)
--- Конец кода ---
?
Класс у меня просто Stack ведь называется, зачем тогда придумали дописывать ещё и <T>? Я ведь и так предыдущей строчкой обязан напомнить о шаблоне так зачем же дважды это делать?   :-\
Навигация
Главная страница сообщений
Следующая страница
Предыдущая страница

Перейти к полной версии