WWW.ИСХОДНИКИ.РУ cpp.sources.ru
java.sources.ru web.sources.ru soft.sources.ru
jdbc.sources.ru asp.sources.ru api.sources.ru

  Форум на исходниках
  C / C++ / Visual C++
  помогите с указателями plz

СПРОСИТЬ  ОТВЕТИТЬ
профайл | регистрация | faq

Автор Тема:   помогите с указателями plz
Woolf опубликован 13-09-2001 15:03 MSK   Click Here to See the Profile for Woolf   Click Here to Email Woolf  
Привет всем!
Помогите пожалуйсто разобраться с указателями
на классы, вообще в чём их суть, чем они лучше объектов класса, когда например в какой-либо функции вызывается метод класса,
с использованием указателя на класс, хотя можно было бы создать объект!!!
ServerMouse опубликован 13-09-2001 15:52 MSK     Click Here to See the Profile for ServerMouse  Click Here to Email ServerMouse     
Ну например если тебе нужно использовать созданый класс за пределами создавшей его ф-ции (т.е. динамически создать глобальным экземпляр) -- без new не обойтись, а соотв без указателя. Часто нужно передавать в ф-цию весь класс как параметр. Можно конечно передать и весь объект (удачи!) но правильнее передать указатель. Это-ж стек, не заталкивать же туда всё это добро.
stan опубликован 13-09-2001 16:34 MSK     Click Here to See the Profile for stan  Click Here to Email stan     
Поправка - указатель не на класс, а на экземпляр класса. Используется при передаче крупных объектов, просто жизненно необходим для реализации полиморфизма (например,вызываешь функцию неизвестно какого класса). На указателях на экземпляры класса весь СОМ стоит.
purpe опубликован 13-09-2001 16:59 MSK     Click Here to See the Profile for purpe  Click Here to Email purpe     
я так думаю, что фразы типа "лучше или хуже" здесь вообще не имеют смысла. Создавая объект, мы тем самым отводим место в памяти, инициализируем переменные и т.д. А указателем ты всего навсего ссылаешься на уже распределённый в памяти объект класса. Поэтому если тебе надо, чтобы несколько твоих функций использовали одни и те же данные из одного объекта, то ты будешь пользоваться указателем на этот объект. А если есть необходимость, чтобы каждая функция хранила свои данные одинаковой структуры, то для каждой функции надо будет создать свой экземпляр объекта.

во намутил-то. Наверна из меня учителя не выйдет :)

Kostik опубликован 13-09-2001 17:15 MSK     Click Here to See the Profile for Kostik  Click Here to Email Kostik     

Почему намутил?
Всё предельно понятно. (Если изначально знаешь о чем идёт речь)
Whirlwind опубликован 17-09-2001 07:13 MSK     Click Here to See the Profile for Whirlwind  Click Here to Email Whirlwind     
Ну и намутил :)))
Во-первых, если необходимо пользоваться экземпляром вне функции, объявляешь экземпляр вне функции, и все. new вовсе не обязательно. Теперь насчет полезных примеров.
1)Есть такое понятие - классы с самоадресацией. Служат для построения связанных списков деревьев (вот, например BSP запросто можно сделать). Там для связи узлов используются именно указатели.
2)Еще вариант, несколько объектов одного класса используют один экземпляр другого.
3)О полиморфизме и наследовании уже говорили. Т.е. создаем абстрактный класс-интерфейс. Наследуем от него другой. Реализуем виртуальные функции. А как получить доступ к производному интерфейсу? Может через ссылку это и можно сделать, только я что то не видал, чтобы так делали.
4)... ну.. много примеров можно привести
sps опубликован 17-09-2001 19:10 MSK     Click Here to See the Profile for sps  Click Here to Email sps     
>>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;
}

СПРОСИТЬ  ОТВЕТИТЬ
Перейти:


E-mail | WWW.ИСХОДНИКИ.RU

Powered by: Ultimate Bulletin Board, Freeware Version 5.10a
Purchase our Licensed Version- which adds many more features!
© Infopop Corporation (formerly Madrona Park, Inc.), 1998 - 2000.