2014-10-24 3 views
0

Как я инициализировать переменную величину C++-структуру «StructB», объявленный ниже:Как инициализировать эту структуру с переменным размером?

#include <iostream> 
#include <string> 

typedef struct { 
char* a; 
int b; 
} StructA; 

typedef struct { 
    StructA* pointers[]; 
    int pcount; 
    int numbers[]; 
    int ncount; 
} StructB; 

int main() 
{ 
    StructB *sb = new StructB; // I need 'sb' to be allocated in the heap 
    sb->pcount = 5; 
    sb->ncount = 3; 
    sb->pointers = new StructA*[sb->pcount]; 
    sb->numbers = int[sb->ncount]; 
} 

я получил эти ошибки компилятора. Что означают эти ошибки и как их исправить? Спасибо.

In function 'int main()': 
21:43: error: incompatible types in assignment of 'StructA**' to 'StructA* [0]' 
22:19: error: expected primary-expression before 'int' 
22:19: error: expected ';' before 'int' 
+3

Ваш код не действителен. C++ и Standard C++ не поддерживают VLA. –

+2

Насколько я знаю, 'int numbers [];' не разрешен как член 'struct' в C++. Это разрешено в C, но только как последний член - другими словами, это 'int ncount;' сразу же также делает его незаконным C. – pyon

+0

Просто сделайте их 'StructA ** указатели;' и 'int * numbers;'. Или, еще лучше, используйте векторы, так как это C++, а не C. – cdhowie

ответ

0

слушать это не хорошо с ++ путь, вы делаете C в C++ среду , которая в порядке, если это дает некоторое преимущество (IO, проверка типов и т.д.) или для обучения. Динамическое распределение памяти в стиле C полностью ручное. То есть освобождение. Поскольку вы используете typedef, typedef может сделать все более понятным для вас и для компилятора. Вот пример пыток, который, я думаю, делает то, что вы хотите. Обратите внимание, что это делается «The Hard Way», который на самом деле является простым способом в этом случае C стиль кодирования на C++;

#include <iostream> 
#include <string> 


typedef struct { 
char* a; 
int b; 
} StructA; 


typedef StructA* A_p; // A_p is "pointer to structA" (contains address of struct)                   

typedef A_p* A_p_Array; // A_p_Array is "pointer to A_p" (aka StructA**) contains address of A_p                

typedef int* int_Array; // int_Array is "pointer to int" contains address of integer                   


typedef struct { 
A_p_Array A_pointers; 
int pcount; 
int_Array numbers; 
int ncount; 
} StructB; 


int main() 
{ 
int i; 

StructA *sa = new StructA; 

StructB *sb = new StructB; 

sb->pcount = 5; 
sb->ncount = 3; 

A_p_Array tmp_A_array; 
A_p  tmp; 

for (i = 0 ; i < sb->pcount; i++) 
{ 
    tmp_A_array = new A_p; // create a StructA pointer                          
    tmp = new StructA;  // create a StructA                            
    tmp_A_array = &tmp; // put address of tmp in mp_A_array                        
    tmp_A_array++;   // increment array address                          
} 


sb->A_pointers = tmp_A_array; // A_pointers now contains address of dynamically created array                

tmp_A_array = NULL; // clear pointer but do NOT delete!                          

int_Array tmp_i_array; 
for (i = 0 ; i < sb->ncount; i++) 
{ 
    tmp_i_array = new int(0); // c++ can create ints with initial values                      
    tmp_i_array++; 
} 

sb->numbers = tmp_i_array; 
tmp_i_array = NULL; // clear pointer but do NOT delete!                          


/****** USE Structs A & B *****/ 

// clean up the heap                                   

A_p Ap; 

for (i = 0 ; i < sb->pcount; i++) 
{ 
    Ap = sb->A_pointers[i]; 
    delete Ap; // each struct released separately 
} 

int* ip; 
for (i = 0 ; i < sb->ncount; i++) 
{ 
    ip = & sb->numbers[i]; 
    delete ip; //each int released separately 
} 

delete sb; 

    return 0; 
} // main 

Есть лучшие способы сделать выше которая является одной из причин, C++ и выше языки были изобретены. Когда вы добираетесь до классов, это будет несколько проще , но вы можете столкнуться с теми же проблемами, что и там , поэтому получение указателей и указателей на указатели вниз теперь послужит вам на доброе место позже.

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