Как создать массив указателей внутри функции, размер которой неизвестен до времени выполнения

0

В основном я могу:

Node* myNodeArray2[myHeight][myWidth];//Does not call constructor

for(int i=0; i<myHeight; i++){
    for(int j=0; j<myWidth; j++){
        theNodeArray[i][j] = new Node("ThisIsTest", 5, 5);
    }
}

Таким образом, для вышеуказанного кода myHeight и myWidth могут вводиться пользователем во время выполнения. Он не вызывает конструктор по умолчанию, и я могу использовать новый оператор и пройти через массив, создающий объекты.

Я хочу, чтобы передать Node * myNodeArray2 в функцию и позволить ему создать размер массива и заполнить его. Когда он создается, я хочу, чтобы элементы были указателями. Я не хочу вызывать конструктор по умолчанию. Я хочу иметь возможность по своему выбору вызывать новый оператор с помощью конструктора, отличного от стандартного.

Когда я пытаюсь:

void Test(Node*& theNodeArray, int myHeight, int myWidth){
    theNodeArray = new Node*[myHeight][myWidth];

}

int main(){
    Node* myNodeArray;
    Test(myNodeArray, myHeight, myWidth);

}

я понимаю

msgstr "myWidth не является постоянным выражением".

Я пробовал несколько разных методов, но не могу получить то, что хочу. Мне нужно, чтобы создание произошло в отдельной функции. Мне нужно определить размер во время выполнения. Любая помощь?

Редактировать:

Я не хочу использовать std :: vector.

Изменить 2:

Я не хочу этого делать

int** ary = new int*[sizeX];
for(int i = 0; i < sizeX; ++i)
    ary[i] = new int[sizeY];

Поскольку это заставляет строки быть объектами смежного пространства памяти. Я хочу выделить 2d-массив указателей. Я не хочу создавать объекты, на которые нужно указывать.

  • 1
    Почему вы не хотите использовать vector ?
  • 0
    Код будет использоваться в C для ворот пользовательских HDL, которые не поддерживают вектор.
Показать ещё 2 комментария
Теги:
arrays
multidimensional-array
pointers
function

1 ответ

1
Лучший ответ

Вы можете использовать следующее:

Node*** MakeArrayNodePtr(int myHeight, int myWidth){
    Node*** res = new Node**[myHeight];
    for (int i = 0; i != myHeight; ++i) {
        res[i] = new Node*[myWidth]();
    }
    return res;
}

И не забывайте

void DeleteArrayNodePtr(Node*** nodes, int myHeight, int myWidth)
{
    for (int i = 0; i != myHeight; ++i) {
        // And probably:
        /*
        for (int j = 0; j != myWidth; ++j) {
            delete nodes[i][j];
        }
        */
        delete [] nodes[i];
    }
    delete [] nodes;
}
  • 0
    Это выглядит многообещающе. Будем работать с ним сейчас и вернемся!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню