Получение значения индекса списка членов класса указателя, инкапсулированного другим членом класса, который является указателем - PullRequest
0 голосов
/ 21 января 2012

Это немного странно для меня.

У меня есть указатель на член класса (mGeometry), который, в свою очередь, содержит указатель на QList< GLushort > член данных (mFaces). Я пытаюсь получить индекс mFaces через класс Cube.

Итак, более упрощенная версия будет выглядеть так:

struct Geometry
{   
    Geometry( void );
    ~Geometry( void );
    void someFunc( void );
    QList< GLushort > *mFaces;
};

class Cube
{   
 public:
    Cube( void );
    ~Cube( void );
    void anotherFunc( void );
    Geometry *mGeometry;
};

Скажем, в anotherFunc мы пытаемся сделать следующее:

GLushort *indeces = new GLushort;

*indeces = ( *mGeometry ).mFaces[ 0 ];

Error (s)

error: cannot convert ‘QList<short unsigned int>’ to ‘GLushort {aka short unsigned int}’ in assignment

Итак, мы попробуем:

*indeces = mGeometry->( *mFaces )[ 0 ]; //which, is originally how I've accessed pointers-to-containers' indexes.

Error (s)

error: expected unqualified-id before ‘(’ token

error: ‘mFaces’ was not declared in this scope

И, конечно же, очевидное:

*indeces =  mGeometry->mFaces[ 0 ];

Error (s)

error: cannot convert ‘QList<short unsigned int>’ to ‘GLushort {aka short unsigned int}’ in assignment

Конструктор для геометрии

Geometry::Geometry( void )
    : mFaces( new QList< GLushort > )
{
}

Что-то не так я здесь делаю? Если нет, то какой метод является правильным для получения индекса указателя на mFaces?

1 Ответ

4 голосов
/ 21 января 2012

Поскольку mFaces - указатель, вы должны разыменовать mGeometry с ->, затем разыменовать mFaces с *, а затем использовать QList<> operator[], чтобы получить число:

*indeces = (*mGeometry->mFaces)[0]; // note that * has lower precedence than ->
                                    // so this is like (*(mGeometry->mFaces))[0]

Это немного странно, потому что [0] делает то же самое, что и *.Индексы для типов указателей, таких как x[i], следуют формуле *(x + i), поэтому вы также можете сделать это для того же эффекта (но не):

*indeces = mGeometry->mFaces[0][0]; // or *indeces = (*mGeometry).mFaces[0][0];

То же, что и (*(mFaces + 0))[0], что точно так же, как (*mFaces)[0].

Именно поэтому вы получили эту ошибку cannot convert ‘QList<short unsigned int>’ to ‘GLushort’, когда пытались сделать

( *mGeometry ).mFaces[ 0 ];

Потому что ( *mGeometry ).mFaces[ 0 ]; (чтоопять же, эквивалентно приведенному выше *mGeometry->mFaces) дает вам QList<GLushort>, и вы должны использовать operator[] из QList<>, чтобы получить ваши данные.

А теперь для чего-то совершенно не связанного,вы ошиблись индексы :)

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