Доступ к указателю на указатель в C ++ - PullRequest
1 голос
/ 30 сентября 2010

Привет! Я использую стороннюю библиотеку в своем приложении для iPhone, которая использует C ++. Один из методов, которые мне нужно использовать, возвращает указатель на указатель класса. как следует.

DLL classAttributes** getAttributes();

Я могу успешно вызвать метод и вернуть значение в указатель на указатель следующим образом;

classAttributes **attributes = cPPClass->getAttributes();

однако я не могу получить доступ ни к одному из методов класса, например, я знаю, что в классе есть функция getName (); но когда я пытаюсь вызвать его, я получаю ошибки.

attributes->getName(); 'Request for member 'getName' in *attributes'; which is of non-class type 'attributes*''

Я немного погуглил и обнаружил некоторые вещи, в которых говорится, что для доступа к адресу указателя указателя используется формат

&(*attributes)->getName(); 'invalid uses of incomplete type 'struct attributes'

Любая помощь будет высоко ценится. Спасибо.

Ответы [ 5 ]

2 голосов
/ 30 сентября 2010

'invalid uses of incomplete type 'struct attributes' указывает, что вам нужно #include файл заголовка для него. На данный момент он объявлен только в вашем коде.

1 голос
/ 30 сентября 2010

Сначала рассмотрим, что бы вы сделали, если бы функция возвращала указатель на переменную classAttributes.В этом случае вы просто должны сделать:

attributes->getName();

Так как это указатель на указатель, вы должны сначала разыменовать его и затем использовать оператор ->:

(*attributes)->getName();

это не работает, это может быть проблема, вызванная не реализуемой функцией или наследованием.

1 голос
/ 30 сентября 2010

То, что вы, вероятно, хотите, это атрибуты класса *. Поскольку у вас есть classAttribues **, вы хотите разыменовать его один раз, чтобы попасть в classAttributes *.

(*attributes)

Оттуда вы, вероятно, можете позвонить членам класса.

classAttributes **attributesArray = cPPClass->getAttributes();
classAttributes *attributesObject(*attributesArray);
attributesObject->getName();
1 голос
/ 30 сентября 2010

Трудно сказать, не зная больше о библиотеке.Но это может быть возвращение массива элементов:

attributes[0]->getName();    
attributes[1]->getName();

Сомнительная часть моего предположения состоит в том, что нет никакого очевидного способа узнать, сколько элементов есть.

0 голосов
/ 30 сентября 2010

Судя по всему, вам, вероятно, придется сделать это следующим образом (т.е. без амперсанда):

(*attributes)->getName();

Это потому, что разыменование его один раз даст вамуказатель на структуру, в которой вы можете использовать оператор ->.Когда вы делаете &(*attributes), то происходит то, что вы разыменовываете указатель, а затем получаете адрес объекта, который у вас есть - фактически превращая его в неактивный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...