2013-05-14 2 views
0

У меня есть два класса:выделить новую память для матрицы

class A 

class B: class A 

Я хочу, чтобы создать матрицу, что каждая точка указатель B (мат из 1X2).

так я определил:

A **mat; 

mat = new A*[1]; 
*mat = new B[2]; // call the constructor. 

теперь у меня есть 2 элемента: мат [0] [0], мат [0] [1].

коврик [0] [0] инициализирован, но мат [0] [1] равен NULL.

помогите пожалуйста.

ответ

1

Если sizeof(A) < sizeof(B), чем массив из A 's, не эквивалентен массиву B. Поскольку во втором распределении вы выделяете объекты concreete, которые больше, чем *mat, должны указывать на то, когда вы получаете доступ ко второму элементу, он не имеет доступа ко второму элементу B, а скорее к ломтикам в первый.

Это моя догадка, так как вы не сообщили нам о A и B.

EDIT

Чтобы ответить на комментарий, я бы начать с ограничения количества сырья указателей, которые вы используете. Вместо этого используйте векторы vector. Каждый элемент вектора может быть необработанным указателем на A. Который может иметь тип времени выполнения B или C.

#include <vector> 

std::vector<std::vector<A*> > mat(1, std::vector<A*>(2, (A*)0)); 
+0

спасибо, но если у меня есть: класс B: общественный A .. и класс C: общественный A. и я хочу создать матрицу, в которой каждая ячейка может быть B или C, как я могу это сделать? Спасибо! –

+1

@AlonShmiel, Это отдельный вопрос. Но см. Мое редактирование. – StoryTeller

1

Если вам нужны указатели на B, вам не нужно указывать ничего о А. Так как B получает A, вам нужно только выделить пространство для увеличения одного (B в данном случае).

Для матрицы указателей вам потребуется следующее.

B *** mat; 
mat = new B**[1]; //Dimension 1 
mat[0] = new B*[2]; //Dimension 2 (array of pointers) 
mat[0][0] = new B(); //Allocate B in [0][0] 
mat[0][1] = new B(); //Allocate B in [0][1] 

Но если вы знаете, что всегда будет 1х2, просто используйте следующую команду:

B * mat[1][2]; 
+0

спасибо, но если у меня есть: класс B: public A .. и класс C: public A .. и я хочу создать матрицу, в которой каждая ячейка может быть B или C, как я могу это сделать? Спасибо! –

+0

Вы можете создать другой класс D: public B, public C. Тогда ваша матрица может быть типа D *. Когда вы читаете из матрицы, вы можете легко нанести на B или C. Тем не менее, при написании B или C в матрицу вам нужно вручную наложить тип D. Другой вариант может заключаться в использовании матрицы указателей void * и их перевода в разные указатели, но это было бы опасно. – Brad

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