тип **
От: Аноним  
Дата: 03.01.02 13:34
Оценка:
Часто встречаю использование такого типа мол void**
не могли бы вы объяснить что это значит? неужели указатель на указатель?
и как в таком случае осуществлять доступ к членам класса,посредством указатель на указатель
этого класса? или я не правильно понимаю назначение такового?
Re: тип **
От: Кривенко Антон Владимирович  
Дата: 03.01.02 14:17
Оценка:
Здравствуйте Аноним, Вы писали:

А>Часто встречаю использование такого типа мол void**

А>не могли бы вы объяснить что это значит? неужели указатель на указатель?

Именно он... Вдруг тебе надо получить из функции значение указателя. Тогда прототип может быть такой:

void SomeFunc(void ** pp)
{
if (pp != NULL)
*pp = new char[100];
}


А>и как в таком случае осуществлять доступ к членам класса,посредством указатель на указатель

А>этого класса? или я не правильно понимаю назначение такового?

CSomeObject ** p;
....
(*p)->SomeFunc();

Где-то так :)
Re: тип **
От: TepMuHyc  
Дата: 03.01.02 14:20
Оценка:
Здравствуйте Аноним, Вы писали:

А>Часто встречаю использование такого типа мол void**


А>не могли бы вы объяснить что это значит? неужели указатель на указатель?

Ну да. А почему такое удивление ?

А>и как в таком случае осуществлять доступ к членам класса,

А>посредством указатель на указатель этого класса?
неудобно, но можно
CClass **ppClass;
(*ppClass)->CallTheMethod();


А>или я не правильно понимаю назначение такового?

Скорее неправильно чем правильно.

Во основном, такой тип применяется для передачи указателей в функцию по ссылке
(а не по значению) и для организации 2-мерных массивов.

ЗЫ. Отдельные особо извращенные личности иногда в порыве вдохновения
используют и "указатель на указатель на указатель" и даже
"указатель на указатель на указатель на указатель"...
____________________
God obviously didn't debug, hasn't done any maintenance, and no documentation can be found. Truly amateur work.
Re: тип **
От: Batiskaf Израиль http://www.mult.ru/
Дата: 03.01.02 14:20
Оценка:
Здравствуйте Аноним, Вы писали:

А>Часто встречаю использование такого типа мол void**

А>не могли бы вы объяснить что это значит? неужели указатель на указатель?
А>и как в таком случае осуществлять доступ к членам класса,посредством указатель на указатель
А>этого класса? или я не правильно понимаю назначение такового?
Использовать в коде двойной поинтер не прейдется, но передавать в функцию очень часто есть необходимо! Например:


BOOL F1(Foo** ppFoo, UINT count)
{
   Foo* pFoo=NULL;
   if(!(pFoo = new Foo[count]))
       return FALSE;
   else
   {
        *ppFoo = pFoo;
        return TRUE;
   }
}

Foo* pMyFoo;
F1(&pMyFoo);
Will I live tomorrow? Well I just can't say
But I know for sure — I don't live today.
Jimi Hendrix.
Re: тип **
От: Nata111  
Дата: 03.01.02 14:45
Оценка:
Здравствуйте Аноним, Вы писали:

А>Часто встречаю использование такого типа мол void**


Эти указатели на указатели используются в качестве аргументов в функциях в COM. Там без них просто никак.
Re: тип **
От: Dr_Sh0ck Беларусь  
Дата: 03.01.02 18:58
Оценка:
Здравствуйте Аноним, Вы писали:

А>Часто встречаю использование такого типа мол void**

А>не могли бы вы объяснить что это значит? неужели указатель на указатель?
А>и как в таком случае осуществлять доступ к членам класса,посредством указатель на указатель
А>этого класса? или я не правильно понимаю назначение такового?
Понимаешь ты это правильно. Даже удивительно — ведь НГ только прошел.. Ну, не важно, а обращаться к членам класса так: приводишь указатель к нужному типу (класса) и применяешь двойное разыменовывание **. Совет: для понятности используй скобки.
Do not fake yourself ;)
ICQ#: 198114726
Re: тип ** (провокация ;-)
От: Речка Россия  
Дата: 04.01.02 13:22
Оценка:
Здравствуйте Аноним, Вы писали:

А>Часто встречаю использование такого типа мол void**

А>не могли бы вы объяснить что это значит? неужели указатель на указатель?
А>и как в таком случае осуществлять доступ к членам класса,посредством указатель на указатель
А>этого класса? или я не правильно понимаю назначение такового?

(Провокация

Коллеги,
конечно, ** используются очень часто,
а вот я взял и поискал по всем своим и кодам *** (три звезды) и нашёл!
Нечто типа...

void getText(size_t* pCount, char*** pArrSz);

Эта функция выделяла массив строк и возвращала его (ещё и размер массива).
Тот кто скажет, что это не разумная функция, пусть первый бросит в меня...!
Интересно было бы увидеть стольж е разумный пример с четыремя звёздами.
Предлагаю конкурс: кто больше звёзд в разумном примере?
Re[2]: тип ** (провокация ;-)
От: Кодт Россия  
Дата: 05.01.02 15:33
Оценка:
Здравствуйте Речка, Вы писали:

Р>Коллеги,

Р>конечно, ** используются очень часто,
Р>а вот я взял и поискал по всем своим и кодам *** (три звезды) и нашёл!
Р>Нечто типа...

Р>void getText(size_t* pCount, char*** pArrSz);


Р>Эта функция выделяла массив строк и возвращала его (ещё и размер массива).

Р>Тот кто скажет, что это не разумная функция, пусть первый бросит в меня...!
Р>Интересно было бы увидеть стольж е разумный пример с четыремя звёздами.
Р>Предлагаю конкурс: кто больше звёзд в разумном примере?

Лучше всего, конечно, пять звездочек.
Перекуём баги на фичи!
Re[2]: тип ** (провокация ;-)
От: Кодт Россия  
Дата: 05.01.02 16:21
Оценка:
Здравствуйте Речка, Вы писали:

Р>Интересно было бы увидеть стольж е разумный пример с четыремя звёздами.

Р>Предлагаю конкурс: кто больше звёзд в разумном примере?

Лучше всего, конечно, пять звездочек

Если нужен не тип с 5*, а пять-раз-разыменование, то, например, так.

Исключительно как образчик программирования...

Когда-то делал smalltalk-машину на паскале.
Там была, например, такая последовательность разыменования:

получение метакласса и суперкласса

= свертка объекта в таблице
-> ссылка на объект в куче
--> свертка его класса (член №0 в теле объекта)
---> ссылка на класс
----> свертка метакласса (член №0 в теле объекта-класса)
----> свертка суперкласса (член №1 в теле объекта-класса)


typedef char* String;
// назовем это "строкоуказателем" (т.е. тем, что ссылается на строку в памяти)

class StringWrapper
{
private:
  String* m_pString; // ссылка на строкоуказатель
public:
  // оператор прямого "беспардонного" доступа к члену класса
  operator String** () { return &m_pString; }
};

// исходные строки в памяти
char data1[] = "hello";
char data2[] = "world";

// строкоуказатель
String str;

// обертка к строкоуказателю
StringWrapper wrapper;

*wrapper = &str; // запись ссылки
**wrapper = data1; // инициализация строкоуказателя
***wrapper = 'H'; // модификация строки

// а теперь создадим, например, таблицу оберток
typedef list<StringWrapper*> StringWrapperList;

StringWrapperList chain;
chain.push_back(&wrapper);

StringWrapperList::iterator it = chain.begin();
assert(*it == &wrapper);
assert(***it == *wrapper && ***it == &str);
assert(****it == str && ****it == data1);
assert(*****it == data1[0] && *****it == 'H');



Сейте безумное, злое, мгновенное! (Некрасову посвящается)
Перекуём баги на фичи!
Re[2]: тип ** (провокация ;-)
От: Андрей Тарасевич Беларусь  
Дата: 06.01.02 08:04
Оценка:
Здравствуйте Речка, Вы писали:

Р>Эта функция выделяла массив строк и возвращала его (ещё и размер массива).

Р>Тот кто скажет, что это не разумная функция, пусть первый бросит в меня...!
Р>Интересно было бы увидеть стольж е разумный пример с четыремя звёздами.
Р>Предлагаю конкурс: кто больше звёзд в разумном примере?

Одним из способов реализации, например, двумерного массива в С/С++ является использование массива указателей на одномерные массивы (вместо подхода с пересчетом индесков). Реализуя таким образом трехметные, четырехмерные и т.д. массивы можно получить разумные примеры для практически любого количества звездочек (сколько размерностей — столько и звездочек).
Best regards,
Андрей Тарасевич
Re[2]: тип **
От: anthony Россия  
Дата: 09.11.02 08:14
Оценка:
Здравствуйте Batiskaf, Вы писали:





BOOL F1(Foo** ppFoo, UINT count)
{
   Foo* pFoo=NULL;
   if(!(pFoo = new Foo[count]))
       return FALSE;
   else
   {
        *ppFoo = pFoo;
        return TRUE;
   }
}

Foo* pMyFoo;
F1(&pMyFoo);


извини что так долго думал просто сейчас необходимость возникла. COM пытаюсь понять...
Так сам вопрос: где должен разрушаться объект pFoo ?
Re[3]: тип **
От: small_cat Россия  
Дата: 11.11.02 12:59
Оценка:
Здравствуйте anthony, Вы писали:

A>

A>BOOL F1(Foo** ppFoo, UINT count)
A>{
A>   Foo* pFoo=NULL;
A>   if(!(pFoo = new Foo[count]))
A>       return FALSE;
A>   else
A>   {
A>        *ppFoo = pFoo;
A>        return TRUE;
A>   }
A>}

A>Foo* pMyFoo;
A>F1(&pMyFoo);
//Где то здесь. Если ты его грохнешь в F1, то получишь мусор вместо объекта
A>
- Простите, профессор, не пса, а когда он уже был человеком.
— То-есть он говорил? Это еще не значит быть человеком. (с) Булгаков
Re[4]: тип **
От: anthony Россия  
Дата: 11.11.02 13:27
Оценка:
Пасибочки.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.