2013-07-20 3 views
5

Моя программа содержит класс, вот его упрощенная форма:Вызов функции объекта с помощью объекта указателей

Units.h:

#define fullwidth 200 
#define fullheight 200 

class Units 
{ 
public: 

[...] 

void MovingUp(Units* Detector[fullwidth][fullheight], Units Self); 
[...] 
} 

Он определяет функцию, которая принимает два аргумента в качестве входных данных: массив объекта указатели для объектов «Единицы» и специальный выбранный объект «Единицы».

Вот основная часть:

#include "Units.h" 

[...] 

int i,j; 
Units* DetectorField[fullwidth][fullheight]; 
Units Examples[20]; 

for (j=0;j<fullheight;j++) 
{ 
    for (i=0;i<fullwidth;i++) 
    { 
     DetectorField[i][j] = NULL; 
    } 
} 

Он создает массив «единиц» объект указателей, которые необходимы для функции в «Единицы измерения» и устанавливает все эти значения NULL в самом начале.

После этого я пытаюсь вызвать функцию объекта через один случайно выбранный указатель. Очевидно, что если указатель ссылается на NULL, вызов невозможен, но Visual C++ показывает ошибку даже до запуска программы.

DetectorField[12][12]->MovingUp(DetectorField,DetectorField[12][12]); 

Для этой версии, Visual C++ пишет после компиляции: не удается преобразовать параметр 2 из «единиц *» до «единиц» - конечно же, так как DetectorField сам представляет собой массив указателей . Тогда я стараюсь ссылаться на объект он указывает, таким образом:

DetectorField[12][12]->MovingUp(DetectorField,&DetectorField[12][12]); 

MSVC пишет после компиляции: не удается преобразовать параметр 2 из «единиц **» до «Units»

Существует не ясно мне, почему вторая версия ссылается на указатель указателя объекта, а не на объект. Кроме того, как я должен правильно написать вызов функции?

+2

DetectorField [12] [12] - указатель. So & DetectorField [12] [12] является ссылкой на указатель. Чтобы получить объект, вы разыщите указатель, используя *. Попробуйте DetectorField [12] [12] -> MovingUp (DetectorField, * DetectorField [12] [12]); (Я просто отвечаю на этот вопрос, не обращая внимания на такие вопросы, как выделение памяти, почему бы не использовать интеллектуальные указатели, векторы и т. Д.). –

+0

Я люблю любителя при использовании указателей. Для меня все в порядке, но указатели и много операций, связанных с управлением памятью, слишком много для моего мозга. Надеюсь, я смогу научиться. Благодаря! –

+1

BTW - +1 за то, что я очень четко понимаю, чего вы не понимаете, и каков ваш вопрос. –

ответ

1

«Для меня не ясно, почему ссылка на вторую версию указана на указатель объекта, а не на объект».

Когда & появляется таким образом, это означает the address of.

«Также, как мне написать вызов функции по правильному пути?»

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

DetectorField[12][12]->MovingUp(DetectorField,*DetectorField[12][12]); 
              ^

Это означает, значение указываемого DetectorField [12] [12] (так как это указатели массив).

Или изменить Funciton decleration к:

void MovingUp(Units* Detector[fullwidth][fullheight], Units* Self); 
                 ^

Что значит эта функция будет указатель Получать единицам.

+0

Ну, это совершенно разумно - я просто не знал, что это действительная операция, так как я не видел этого оператора '*'. Спасибо! –

+2

Да, нотация сбивает с толку в начале. Удачи! –

1

Тип элемента в вашем массиве: Units*. Вы заявили об этом так: Units* Detector[fullwidth][fullheight] - двухмерный массив Units*. Адрес Units* - тип Units**.

2

Для этого вызова в силе:

DetectorField[12][12]->MovingUp(DetectorField, DetectorField[12][12]); 

Второй аргумент должен быть Unit * типа, как:

class Unit 
{ 
    // ... 
    void MovingUp(Units* Detector[fullwidth][fullheight], Units *Self); 
}; 

Если вы хотите сохранить Unit::MovingUp как то изменить вызов:

DetectorField[12][12]->MovingUp(DetectorField, *DetectorField[12][12]); 

Обратите внимание, что вы вводите единицы измерения здесь. Если у вас есть другие классы, унаследовавшие от Unit, вы рискуете срезать объекты. Я предлагаю хотя бы изменить его, чтобы взять ссылку Unit &.

+0

Действительно, «Юниты» уже унаследовали классы, спасибо, что упомянули об этом! Можете ли вы объяснить, что я должен изменить? 'void MovingUp (Units & Detector' вместо' void MovingUp (Units * Detector'? –

Смежные вопросы