2013-03-06 4 views
0

Я получил этот класс и двумерный массив это объекты:Обращение к второму измерению массива

class Foo 
{ 
public: 
    Foo(int x) 
    { 
     value = x; 
    } 
    int value; 
}; 

Foo foo1(1), foo2(2), foo3(3), foo4(4); 
Foo* fooArray1[4][2] = { {&foo1, &foo2}, {&foo2, &foo3}, {&foo3, &foo4}, {&foo4, &foo1} }; 

Теперь я хочу сослаться на второе измерение этого массива. Как-то:

Foo* fooArray3[2] = fooArray1[2]; 

Но мой компилятор продолжает говорить мне:

Unallowed Assignment »Foo* (*)[2]« to »Foo* [2]« 

Единственный вариант я получил на работу был:

Foo** fooArray2 = fooArray1[3]; 

Но с этой версией у меня есть доступ к fooArray2 с что я не хочу:

cout << "fooArray2[0]: " << (*fooArray2)[0].value << " fooArray2[1]: " << (*fooArray2)[1].value << endl; 
+0

у вас есть неправильный путь. это должно быть (* fooArray2 [1]). значение или с помощью оператора стрелки. Приказ, который вы используете, вызывает неопределенное поведение. –

+2

'(* fooArray2) [0] .value' просто нелогично, вы хотите' (* (fooArray2 [0])). Value' или эквивалент: 'fooArray2 [0] -> value'. – Antoine

+0

Спасибо! fooArray2 [0] -> значение приятно! – Reini

ответ

0

Я думаю, что вы хотите это:

Foo* (&fooArray3)[2] = fooArray1[3]; 
std::cout << fooArray3[0]->value; // Prints 4 

Если вы используете C++ 11, однако, жизнь гораздо приятнее:

auto& fooArray3 = fooArray1[3]; 
std::cout << fooArray3[0]->value; // Prints 4 

EDIT: В соответствии с просьбой :

Foo* (*fooArray3)[2]; 
⋮ 
fooArray3 = &fooArray1[3]; 
std::cout << (*fooArray3[0])->value; 
+0

В настоящее время я не могу использовать C++ 11. Не могли бы вы привести еще один пример, в котором вы инициализируете fooArray3 с помощью (0/NULL) и назначаете его в отдельном выражении? Спасибо! – Reini

+0

Спасибо за редактирование. Но это будет использовать * в cout. Этого я не хотел. Поэтому я думаю, что я буду использовать версию Foo ** с -> как было предложено Антуаном – Reini

0

Кажется, что вы хотите, чтобы вы указали на массив. Второй размер fooArray1 составляет 2 элемента. Существует специальный синтаксис, который, как показано ниже:

Foo *(*fooArray3)[2] = &fooArray1[2]; // compiles 

Выше синтаксиса означает: fooArray3является указателем на указатель на массив 2 Foo элементов.

Однако я считаю, что вам может не понадобиться этот сложный синтаксис. Вы должны изменить свой дизайн, где вы можете хранить данные с помощью простых типов данных или контейнеров std.

+0

Да, это компилируется. Благодаря! Но можете ли вы привести пример доступа к элементам fooArray3 с помощью cout? (Btw: Foo - более сложный класс в Программе, которую я поддерживаю) – Reini

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