Автор
|
Тема: помогите с указателями plz
|
Woolf |
опубликован 13-09-2001 15:03 MSK
Привет всем! Помогите пожалуйсто разобраться с указателями на классы, вообще в чём их суть, чем они лучше объектов класса, когда например в какой-либо функции вызывается метод класса, с использованием указателя на класс, хотя можно было бы создать объект!!!
|
ServerMouse
|
опубликован 13-09-2001 15:52 MSK
Ну например если тебе нужно использовать созданый класс за пределами создавшей его ф-ции (т.е. динамически создать глобальным экземпляр) -- без new не обойтись, а соотв без указателя. Часто нужно передавать в ф-цию весь класс как параметр. Можно конечно передать и весь объект (удачи!) но правильнее передать указатель. Это-ж стек, не заталкивать же туда всё это добро. |
stan
|
опубликован 13-09-2001 16:34 MSK
Поправка - указатель не на класс, а на экземпляр класса. Используется при передаче крупных объектов, просто жизненно необходим для реализации полиморфизма (например,вызываешь функцию неизвестно какого класса). На указателях на экземпляры класса весь СОМ стоит. |
purpe
|
опубликован 13-09-2001 16:59 MSK
я так думаю, что фразы типа "лучше или хуже" здесь вообще не имеют смысла. Создавая объект, мы тем самым отводим место в памяти, инициализируем переменные и т.д. А указателем ты всего навсего ссылаешься на уже распределённый в памяти объект класса. Поэтому если тебе надо, чтобы несколько твоих функций использовали одни и те же данные из одного объекта, то ты будешь пользоваться указателем на этот объект. А если есть необходимость, чтобы каждая функция хранила свои данные одинаковой структуры, то для каждой функции надо будет создать свой экземпляр объекта.во намутил-то. Наверна из меня учителя не выйдет :)
|
Kostik
|
опубликован 13-09-2001 17:15 MSK
Почему намутил? Всё предельно понятно. (Если изначально знаешь о чем идёт речь) |
Whirlwind
|
опубликован 17-09-2001 07:13 MSK
Ну и намутил :))) Во-первых, если необходимо пользоваться экземпляром вне функции, объявляешь экземпляр вне функции, и все. new вовсе не обязательно. Теперь насчет полезных примеров. 1)Есть такое понятие - классы с самоадресацией. Служат для построения связанных списков деревьев (вот, например BSP запросто можно сделать). Там для связи узлов используются именно указатели. 2)Еще вариант, несколько объектов одного класса используют один экземпляр другого. 3)О полиморфизме и наследовании уже говорили. Т.е. создаем абстрактный класс-интерфейс. Наследуем от него другой. Реализуем виртуальные функции. А как получить доступ к производному интерфейсу? Может через ссылку это и можно сделать, только я что то не видал, чтобы так делали. 4)... ну.. много примеров можно привести |
sps
|
опубликован 17-09-2001 19:10 MSK
>>stan Указатель именно на класс как совокупность объектов одного типа: class C {}; C *pC = NULL; А вот указателем на объект он становится когда он инициализируется неким определенным адресом определенного объекта: C c; pC = &c; или pC = new C; ... delete pC; или еще как-нибудь. >>Woolf А самое главное в указателях (равно как и в ссылках), это то, что ты работаешь непосредственно с объектом, а не с локальной копией в стэке и можешь изменять его. Пример, демонстрирующий это: class C { int m_iMember; public: C(int iMember = 0) {m_iMember = iMember;} int SetMember(int iMember) {return m_iMember = iMember;} int GetMember() const {return m_iMember;} };void f(C *pC, int iMember) { pC->SetMember(iMember); } void f(C c, int iMember) { c.SetMember(iMember); } int main(int argc, char* argv[]) { C c; f(c, 777); cout << c.GetMember() << endl; //на экране будет 0, а не 777! f(&c, 777); cout << c.GetMember() << endl; //а вот теперь порядок! return 0; } |