2015-04-11 2 views
-1

Оба раздела кода, приведенные ниже, значительно упрощены, изолированные версии моего фактического кода. Примеры достаточно велики, чтобы проиллюстрировать проблему. Первый раздел кода ниже работает отлично. Секция раздела - это попытка начать делать ее частью класса. Задача состоит в том, чтобы сделать так, чтобы переменная maxSize могла быть задана пользователем во время выполнения в конструкторе, а не в качестве жестко заданного значения. Чтобы добавить к этому, я ищу решение, которое позволяет мне только изменить способ объявления структуры и изменить то, что делается внутри метода Initialize() (который в конечном итоге станет конструктором класса). Я уже потратил несколько часов на внесение изменений, требующих изменений в других 50+ методах, которые никогда не срабатывали, поэтому мне интересно, есть ли у меня решение, которое не требует изменения других 50+ методов.Невозможно динамически установить размер массива для структурных переменных

Рабочий код:

#include <cstdio> 
#include <cstdlib> 
#include <iostream> 

using std::cout; 
using std::endl; 

const int maxSize = 3; 
Node *root; 

struct Item{ 
    string key; 
    string value; 
}; 

struct Node{ 
    int count; 

    Item key[maxSize + 1]; 
    Node *branch[maxSize + 1]; 
}; 

/* 
------- 
^
    | 
50+ of other methods, all using these structs as pointers, 
pointers to pointers, & references. 
    | 
    v 
------- 
*/ 

int main(int argc, char *argv[]) 
{ 

    return 0; 
} 

Пример только одной попытки очень постепенно модифицировать код в целом к ​​превращению в класс:

#include <cstdio> 
#include <cstdlib> 
#include <iostream> 
#include <string> 

using std::cout; 
using std::endl; 
using std::string; 

int maxSize; 
Node *root; 

struct Item{ 
    string key; 
    string value; 
}; 

struct Node{ 
    int count; 
    Item *item; 
    Node *branch; 

    // doesn't work because it requires 
    // modification of the rest of the code 
    // which has only resulted in an infinite loop of debugging 
    void init(int size) 
    {  
     item = new Item[size]; 
     branch = new Node[size]; 
    } 
}; 

void Initialize(int size) 
{ 
    maxSize = size; 
} 

/* 
------- 
^
    | 
50+ other methods, all using these structs as pointers, 
pointers to pointers, & references. 
    | 
    v 
------- 
*/ 


int main(int argc, char *argv[]) 
{ 
    Initialize(5); 

    return 0; 
} 
+2

Остановите безумие и просто использовать 'зЬй: : vector' – PaulMcKenzie

+0

'Мне интересно, есть ли решение, которое я пропустил, что не требует изменения других 50+ методов. Мы понятия не имеем, как эти другие методы взаимодействуют с кодом, который вы опубликовали. Все, что можно сделать, это дать вам * * решение, которое намного лучше и безопаснее ваших попыток. – PaulMcKenzie

ответ

0

В первом примере Node *branch[maxSize + 1]; является массивом Указатели узлов. В вашем втором примере branch = new Node[size]; создает массив узлов объектов. Это значительная разница и, вероятно, это то, что вас отбрасывает.

То, что вы хотите, может быть сделано с сырым синтаксисом:

Node **branch; 
branch = new Node*[size]; 

Но, как кто-то уже отмечалось, std::vector, как правило, легче и лучше:

std::vector<Node*> branch; 
branch.resize(size); 
+0

Что можно сказать о ключе? Как я могу изменить ключ так, чтобы его можно было динамически распределять без необходимости изменять другие методы? – John