Часто встречаю использование такого типа мол void**
не могли бы вы объяснить что это значит? неужели указатель на указатель?
и как в таком случае осуществлять доступ к членам класса,посредством указатель на указатель
этого класса? или я не правильно понимаю назначение такового?
Здравствуйте Аноним, Вы писали:
А>Часто встречаю использование такого типа мол void** А>не могли бы вы объяснить что это значит? неужели указатель на указатель?
Именно он... Вдруг тебе надо получить из функции значение указателя. Тогда прототип может быть такой:
void SomeFunc(void ** pp)
{
if (pp != NULL)
*pp = new char[100];
}
А>и как в таком случае осуществлять доступ к членам класса,посредством указатель на указатель А>этого класса? или я не правильно понимаю назначение такового?
Здравствуйте Аноним, Вы писали:
А>Часто встречаю использование такого типа мол 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.
Здравствуйте Аноним, Вы писали:
А>Часто встречаю использование такого типа мол void** А>не могли бы вы объяснить что это значит? неужели указатель на указатель? А>и как в таком случае осуществлять доступ к членам класса,посредством указатель на указатель А>этого класса? или я не правильно понимаю назначение такового?
Использовать в коде двойной поинтер не прейдется, но передавать в функцию очень часто есть необходимо! Например:
Здравствуйте Аноним, Вы писали:
А>Часто встречаю использование такого типа мол void** А>не могли бы вы объяснить что это значит? неужели указатель на указатель? А>и как в таком случае осуществлять доступ к членам класса,посредством указатель на указатель А>этого класса? или я не правильно понимаю назначение такового?
Понимаешь ты это правильно. Даже удивительно — ведь НГ только прошел.. Ну, не важно, а обращаться к членам класса так: приводишь указатель к нужному типу (класса) и применяешь двойное разыменовывание **. Совет: для понятности используй скобки.
Здравствуйте Аноним, Вы писали:
А>Часто встречаю использование такого типа мол void** А>не могли бы вы объяснить что это значит? неужели указатель на указатель? А>и как в таком случае осуществлять доступ к членам класса,посредством указатель на указатель А>этого класса? или я не правильно понимаю назначение такового?
(Провокация
Коллеги,
конечно, ** используются очень часто,
а вот я взял и поискал по всем своим и кодам *** (три звезды) и нашёл!
Нечто типа...
void getText(size_t* pCount, char*** pArrSz);
Эта функция выделяла массив строк и возвращала его (ещё и размер массива).
Тот кто скажет, что это не разумная функция, пусть первый бросит в меня...!
Интересно было бы увидеть стольж е разумный пример с четыремя звёздами.
Предлагаю конкурс: кто больше звёзд в разумном примере?
Здравствуйте Речка, Вы писали:
Р>Коллеги, Р>конечно, ** используются очень часто, Р>а вот я взял и поискал по всем своим и кодам *** (три звезды) и нашёл! Р>Нечто типа...
Р>void getText(size_t* pCount, char*** pArrSz);
Р>Эта функция выделяла массив строк и возвращала его (ещё и размер массива). Р>Тот кто скажет, что это не разумная функция, пусть первый бросит в меня...! Р>Интересно было бы увидеть стольж е разумный пример с четыремя звёздами. Р>Предлагаю конкурс: кто больше звёзд в разумном примере?
Здравствуйте Речка, Вы писали:
Р>Интересно было бы увидеть стольж е разумный пример с четыремя звёздами. Р>Предлагаю конкурс: кто больше звёзд в разумном примере?
Лучше всего, конечно, пять звездочек
Если нужен не тип с 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');
Здравствуйте Речка, Вы писали:
Р>Эта функция выделяла массив строк и возвращала его (ещё и размер массива). Р>Тот кто скажет, что это не разумная функция, пусть первый бросит в меня...! Р>Интересно было бы увидеть стольж е разумный пример с четыремя звёздами. Р>Предлагаю конкурс: кто больше звёзд в разумном примере?
Одним из способов реализации, например, двумерного массива в С/С++ является использование массива указателей на одномерные массивы (вместо подхода с пересчетом индесков). Реализуя таким образом трехметные, четырехмерные и т.д. массивы можно получить разумные примеры для практически любого количества звездочек (сколько размерностей — столько и звездочек).
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>
- Простите, профессор, не пса, а когда он уже был человеком.
— То-есть он говорил? Это еще не значит быть человеком. (с) Булгаков