2012-05-24 5 views
1

Я переношу научный код с Java на C++. Сообщите мне:
Двухмерный массив объектов в C++

a) Что не так с этими двумя функциями?
б) Как я могу решить проблему? Я могу использовать int** как двухмерный массив, но не Agent**.

Я получаю эту ошибку: «Нет оператора = соответствует этому операнду».

В обычном C мы могли бы назначить NULL указателям. Мы могли бы также использовать type** как двухмерную матрицу (т. Е. a[i][j]) (двумерное пространство для objectSpace и agentSpace выделено где-то еще).

int** objectSpace; 
    Agent** agentSpace; 

    void Space::removeAgentAt(Point p) 
    { 
     agentSpace[p.x][p.y] = NULL; 
    } 

    void Space::putAgentTo(Agent agent, Point p) 
    { 
     agentSpace[p.x][p.y] = agent; 
    } 

ответ

1

Посмотрите на это так, для Agent** agentSpace, первый * дает вам доступ к первому измерению массива, второй * дает доступ ко второму измерению.

Agent** - указатель на указатели - или в вашем случае массив указателей. Когда вы пытались сделать agentSpace[p.x][p.y] = NULL, вы пытаетесь присвоить NULL в к тому, что компилятор считает, что это полный объект типа Agent Вам нужен другой уровень косвенности:

Agent*** agentSpace = 
    { 
     { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, 
     { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, 
     { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 } 
    }; 
3

agentSpace является указателем, и agentSpace[p.x] является указателем, но agentSpace[p.x][p.y] не является указателем.

C++ - это не то же самое, что Java; объекты (обычно) обозначаются значением, а не ссылкой.

+0

Oli, мне нужно иметь массив агентов и измените массив, чтобы показать, где в пространстве находятся агенты. Не могли бы вы дать немного советов или любезно решение? – wmac

+0

@wmac Знаете ли вы размеры массива во время компиляции или только во время выполнения? Скорее всего, вам лучше использовать стандартный контейнер библиотеки. – juanchopanza

+0

К сожалению, размеры неизвестны, но пространство слишком велико. Он может содержать 1000 * 1000 ячеек. Я думал, что это слишком много для контейнеров. – wmac

0

Угадай, что вам нужно определить оператор присваивания для вашего класса агента?

1

В C++ NULL является просто псевдонимом для 0. Если вы не кодировали преобразование из целых чисел в Agent объектов, вы не можете назначить NULLAgent.

Одним из решений является создание манекена Agent объекта, такого как Agent AgentNone;, и использовать его вместо NULL. Возможно, вам придется реализовать операторы сравнения, если вы хотите проверить, равен ли объект AgentAgentNone.

0

Чтобы сделать код более удобным для сопоставления с оригиналом, обеспечивают размерность массива:

int objectSpace[100][200]; // but use the actual dimensions 
Agent agentSpace[250][300]; // todo: fix dimensions 

Еще лучше было бы использовать определенные константы:

int objectSpace[OS_X_MAX][OS_Y_MAX]; 
Agent agentSpace[AS_X_MAX][AS_Y_MAX]; 

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

+0

Размер массивов неизвестен. Я использую шаблоны распределения динамических массивов на этой странице: http://www.codeproject.com/Articles/21909/Introduction-to-dynamic-two-dimensional-arrays-in – wmac

+1

@wmac, тогда я бы предложил вектор векторного подхода – juanchopanza

+0

Я уже использовал этот метод для создания массивов. Он работает с целыми числами (например, на этой странице). Но объекты типа Agent не будут работать с двухмерным динамическим массивом Агента. – wmac

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