2016-11-19 1 views
1

Я работаю над проектом на C++ для школы, и я столкнулся с некоторыми проблемами, когда дело доходит до 2D-массивов объектов. Таким образом, у меня есть следующий класс:C++ Возвращение 2D-массива объектов из функции для использования в другой функции

class mecanice 
{ 
public: 

    mecanice(); 
    ~mecanice(); 
    ... 
protected: 

private: 
    ... 
    MyClass Ob[8][8]; 
}; 

И мне нужен метод, который будет возвращать Обь, так что я могу использовать его в методе из какого-то другого класса, который будет делать вещи, основываясь на том, что в Оби:

class doodle 
{ 
public: 
    doodle(); 
    ~doodle(); 
    void do_stuff(MyClass M[8][8]); 
    ... 
protected: 

private: 
    ... 
}; 

Я пробовал всевозможные способы обойти это, но все они закончили с компиляцией ошибок, обычно связанных с указателями. Есть какой-либо способ сделать это?

+0

Вы пытались использовать 'typedef MyClass MyClassArray [8] [8];' и возвращали 'Ob' в качестве' MyClassArray'? – Franck

+0

Использовать 'std :: vector' – 0x499602D2

ответ

3

Попробуйте следующее

const MyClass (* myMagicMethod())[8] const; 

Или

typedef const MyClass (*A)[8]; 

//... 

A myMagicMethod() const; 

Спецификатор сопзЬ используется, если вы не хотите, что массив будет изменен в методе другого класса.

Другой подход - передать массив по ссылке. Например

const MyClass (& myMagicMethod())[8][8] const; 

Или

typedef MyClass (&A)[8][8]; 

//... 

const A myMagicMethod() const; 

В способе, который будет обрабатывать массив параметр также должен быть объявлен как ссылки.

+0

Лично я хотел бы использовать' typedef MyClass (A) [8] [8]; '(или' typedef decltype (Ob) A; ') и иметь функцию return' const A & ' , чтобы уточнить, что функция возвращает ссылку (и поэтому typedef также может использоваться для объявления локальных переменных, если это необходимо). Впрочем, это личное предпочтение. –

+0

Большое спасибо, мне удалось заставить его работать сейчас, просто передав массив по ссылке. Я не знал о sytanx '(& MyMethod()) [8] [8]', поэтому я получал всевозможные ошибки. Боковой вопрос: почему в конце есть другой 'const'? Я получаю ошибку компилятора, если я оставлю ее там (используя CodeBlocks с MinGW, который поставляется вместе с ним, btw). –

+0

@GeorgeTodosi Как я писал в своем ответе, вы можете упростить синтаксис с помощью typedef. :) –

0

Вы не можете возвращать массивы из функций. В вашем случае функция, которая выглядит так:

MyClass[][] bar(); 

плохо выражен.

Вы можете рассмотреть возможность использования этой функции MyClass [] [] в качестве параметра вместо того, чтобы возвращать ее как возвращаемое значение и соответствующим образом заполнить ее.

void bar (MyClass foo[8][8]); 

Вы также можете вернуть указатель вместо (который является законным):

MyClass** bar() { } 

Но вы должны убедиться, что память объекта вы возвращаете указатель является постоянным (т.е. не возвращайте указатель на локальную переменную и т. д.).

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

  • Нет связанных вопросов^_^