Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Классы. Функции с различными параметрами. 
:(
    Опции темы
DissDoc
Дата 4.4.2007, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 463
Регистрация: 13.7.2006

Репутация: нет
Всего: нет



Собственно заинтересовался я одной деталью. Например берем MFC ну или VCL . Да без разницы, берем еще какой-нить API.
Так вот. Определяем любой класс и берем какую-нить функцию. В итоге видим, в функцию можно писать различные параметры. Как это реализуется? Т.е. для наглядности
Код

MyClass->MyFunction(***)
// А вместо *** появляется список
<no parameters>
int, bool
float
char*, char*

И мы в эту функцию можени ничего не писать, можем int записать и т.д. Вначале думал, что шаблонами реализуется.. Но в функции можно писать как 1 переменную, так и больше одной  smile 
Что это за технология или может я не все знаю о классах?
PM MAIL WWW   Вверх
EvgenZ
Дата 4.4.2007, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Freedom in me
**


Профиль
Группа: Участник
Сообщений: 407
Регистрация: 3.8.2006

Репутация: 1
Всего: 11



Может перегруженные констукторы  smile ?


--------------------
<удалено администрацией форума>
PM MAIL   Вверх
DissDoc
Дата 4.4.2007, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 463
Регистрация: 13.7.2006

Репутация: нет
Всего: нет



Я не совсем понял, это вопрос или ответ?  smile 
PM MAIL WWW   Вверх
Kuvaldis
Дата 4.4.2007, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

Репутация: 11
Всего: 61



Еще есть вариант (правда, как правило, хуже, чем перегрузка): функции с параметрами по умолчанию


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
ama_kid
Дата 4.4.2007, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 2
Всего: 95



DissDoc
Кажись, тут имеет место быть обычная перегрузка функций:
Код

#include <stdafx.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>

class TMyClass
{
public:
    int a;
    float b;
    char c[10];

    void PutData();
    void PutData(int ax);
    void PutData(float bx);
    void PutData(char cx[]);
};

void TMyClass::PutData()
{
  a = 0;
  b = 0.0;
  strcpy(c,"Empty");
}
void TMyClass::PutData(int ax)
{
    a = ax;
}
void TMyClass::PutData(float bx)
{
    b = bx;
}
void TMyClass::PutData(char *cx)
{
    strcpy(c,cx);
}

int _tmain()
{
 TMyClass MyClass;
 
 MyClass.PutData((int)1);
 MyClass.PutData((float)1.3);
 MyClass.PutData((char *)"String 1");
 std::cout<<MyClass.a<<std::endl;
 std::cout<<MyClass.b<<std::endl;
 std::cout<<MyClass.c<<std::endl;
 MyClass.PutData();
 std::cout<<MyClass.a<<std::endl;
 std::cout<<MyClass.b<<std::endl;
 std::cout<<MyClass.c<<std::endl;
 getch();
 return 1;
}

Оно? Или я что-то недопонял?


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
EvgenZ
Дата 4.4.2007, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Freedom in me
**


Профиль
Группа: Участник
Сообщений: 407
Регистрация: 3.8.2006

Репутация: 1
Всего: 11



ama_kid, я так же понял. ИМХО оно  smile . 


--------------------
<удалено администрацией форума>
PM MAIL   Вверх
Vyacheslav
Дата 4.4.2007, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 9
Всего: 59



Цитата(DissDoc @  4.4.2007,  10:36 Найти цитируемый пост)
Что это за технология или может я не все знаю о классах? 
  Скорее всего не о классах, а о самом С++. Причем  это область знания относится чуть ли не к базовым понятиям, а именно о перегрузке функций, поскольку могут перегужаться не только member function, но free function 


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
DissDoc
Дата 4.4.2007, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 463
Регистрация: 13.7.2006

Репутация: нет
Всего: нет



Спасибо за помощь. ) Буду книжки опять перечитывать. Очень уж этот момент заинтересовал!
PM MAIL WWW   Вверх
Earnest
Дата 4.4.2007, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Еще вы забыли упомянуть о действительно переменном числе параметров, т.е. когда в списке параметров стоит ... Тогда функция сама (по каким-то внешним соглашениям) должна разбираться со своими параметрами. Вот, скажем, prinf именно так устроена: после строки формата может идти любое число параметров любого типа...


--------------------
...
PM   Вверх
nerezus
Дата 4.4.2007, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


Профиль
Группа: Участник
Сообщений: 3330
Регистрация: 15.6.2005

Репутация: 3
Всего: 43



Earnest, а как это реализовано? т.к. читал книгу по C, но там этого не было.


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
Daevaorn
Дата 4.4.2007, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(nerezus @  4.4.2007,  23:22 Найти цитируемый пост)
а как это реализовано? т.к. читал книгу по C, но там этого не было.

макрос va_arg берет со стека следующее, значение основываясь на размере его типа, который передается вторым параметром. 
PM MAIL WWW   Вверх
nerezus
Дата 4.4.2007, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


Профиль
Группа: Участник
Сообщений: 3330
Регистрация: 15.6.2005

Репутация: 3
Всего: 43



Daevaorn, не, я понимаю, как это на асме сделать. А на сишнике? Пример плз.


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
Earnest
Дата 4.4.2007, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



В каком смысле как реализовано?
Функции формата cdecl в отличие от pascal не очищают стек сами, это делает вызывающий код, который точно знает, сколько параметров он засунул в стек.
А как функция разбирается с переданными параметрами - это от нее зависит, как напишешь.
printf, например, разбирает строку формата и каждый следующий аргумент из стека интерпретирует в соответствии с очередным дескриптором. Поэтому, если ошибешься в передаче аргументов, то можно получить ерунду. Причем особенно это критично в scanf, где параметры изменяются... там и проехаться по чужой памяти можно.

Именно поэтому переменный список аргументов небезопасен (компилятор ничего не контролирует), а за все отвечает программист. 
Собственно, других случаев полезного использования переменного списка аргументов кроме форматного ввода\вывода, я привести не могу.
Хотя могут быть и другие варианты соглашения об аргументах: скажем, передаем список параметров одного типа, завершающихся нулем. А для разбора параметров внутри функции есть макросы va_arg (они обеспечивают продвижение по стеку и приведение переменных к нужному типу).




--------------------
...
PM   Вверх
nerezus
Дата 4.4.2007, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


Профиль
Группа: Участник
Сообщений: 3330
Регистрация: 15.6.2005

Репутация: 3
Всего: 43



А можно как раз пример такой ф-ии с переменным числом параметров? Просто сам принцип понял, но хотелось бы увидеть реализацию.

Т.к. скоро опять придется писать на сишнике, так что хочется его получше узнать =\


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
Daevaorn
Дата 4.4.2007, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(nerezus @  4.4.2007,  23:44 Найти цитируемый пост)
А можно как раз пример такой ф-ии с переменным числом параметров? Просто сам принцип понял, но хотелось бы увидеть реализацию.

Очень хороший и жизненный пример:
http://www.and.org/texts/simple_printf.c
smile
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1477 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.