2011-02-07 3 views
0

У меня есть-структуру:Как положить инициализированные структуры в структуру?

typedef struct 
{  
    int nNum;  
    string str;  
}KeyPair; 

Тогда я инициализировать мой-структуру в нечто вроде этого:

KeyPair keys[] = 
{  
    {0, "tester"},   
    {2, "yadah"},   
    {0, "tester"} 
}; 

И все же, скажем, ряд других инициализаций:

KeyPair keysA[] = 
{  
    {0, "tester"},   
    {2, "yadah"},   
    {0, "tester"} 
}; 



KeyPair keysB[] = 
{  
    {0, "testeras"},   
    {2, "yadahsdf"},   
    {3, "testerasss"} 
}; 



KeyPair OtherkeysA[] = 
{  
    {1, "tester"},   
    {2, "yadah"},   
    {3, "tester"} 
}; 

и как еще 20 из них.

Теперь, как мне создать другую структуру и инициализировать ее так, чтобы она содержала эти инициализированные KeyPairs?

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

pressKeyPairs(keys, sizeof(keys)/sizeof(keys[0])); 
pressKeyPairs(keysA, sizeof(keysA)/sizeof(keysA[0])); 
pressKeyPairs(keysB, sizeof(keysB)/sizeof(keysB[0])); 
pressKeyPairs(OtherkeysA, sizeof(OtherkeysA)/sizeof(OtherkeysA[0])); 
and so on... 

Так что я хотел бы просто цикл через структуру, содержащую это inilialized инстанциацию ... пары ключей

ИЛИ Я хотел бы поставить эти инициализированы экземпляры из KeyPairs в вектор и просто цикл через вектор ... Как это сделать?

+1

Что вы хотите сделать? Вы создаете множество массивов 'KeyPair'; вы хотите их конкатенировать? –

+0

Вы пытаетесь сохранить их все в массиве? – Marlon

+3

Если другая структура содержит * указатели * к массивам KeyPair, просто используйте имена указанных выше массивов, которые вы указали как инициализаторы для указателей. Если другая структура фактически * содержит * 'KeyPair', то вы просто используете другой уровень вложенных фигурных скобок в инициализаторе. –

ответ

1

Предполагая, что у вас есть пары ключей фиксированное число, вы можете использовать функцию-член структуры:

typedef struct KeyPairs { 
    KeyPair keysA[3]; 
    KeyPair keysB[3]; 
    KeyPair otherKeysA[3]; 

    void init() { 
     keysA[0].nNum = 0; 
     keysA[0].str = "tester"; 
     keysA[1].nNum = 2; 
     keysA[1].str = "yadah"; 
     keysA[2].nNum = 0; 
     keysA[2].str = "tester"; 

     // and so on for other keys 
    } 
} KeyPairs; 

Затем используйте его следующим образом:

KeyPairs pairs; 
pairs.init(); 
+1

Другой вариант (который, вероятно, лучше) состоит в том, чтобы иметь отдельную функцию init() вне структуры (например, в том же классе, где вы используете структуры), который вручную выполняет итерации и инициализирует структуры. – TREVOR

+4

Это не инициализация. –

1

Как насчет делать реальный C++ и с использованием конструктора ?

(обратите внимание, что определения типов являются implicits для структур в C++)

struct KeyPair 
{ 
    int nNum;  
    string str; 

    public: 
    KeyPair() {} 
    KeyPair(int n, string s) : nNum(n), str(s) {} 

}; 

И затем использовать другой-структуру:

struct TripleKeyPair 
{ 
    KeyPair keys[3]; 

    TripleKeyPair() 
    { 
     // Your initialisation code goes here 
    } 
}; 

И, наконец, я бы не совет, используя имена, такие как:

Ключи A, Ключи B, Ключи C ...

Массивы именно для этого. Зачем использовать примечание std::vector?

+0

Как поместить эти инициализированные экземпляры KeyPairs в вектор? – Owen

+0

Google - ваш друг;) – fouronnes

+0

Если Google всегда работал на конкретные вопросы, подобные этим, StackOverflow бы не существовал ... :) – Owen

1

Как насчет использования объектов «null» в качестве разделителей в массиве? Вы должны использовать конструктор, хотя:

struct KeyPair 
{ 
    KeyPair() : fIsEmpty(true) {} 
    KeyPair(int nNum_, const char *szStr) : nNum(nNum_), str(szStr), fIsEmpty(false) {} 

    int nNum; 
    string str; 
    bool fIsEmpty; 
}; 

Затем вы можете инициализировать его следующим образом:

KeyPair allKeys[] = 
{ 
    KeyPair(0, "testeras"),  
    KeyPair(2, "yadahsdf"), 
    KeyPair(3, "testerasss"), 
    KeyPair(), 
    KeyPair(0, "tester"), 
    KeyPair(2, "yadah"), 
    KeyPair(3, "tester"), 
    KeyPair(1, "moreyadah"), 
    KeyPair() 
}; 

И итерация тривиальная, если вы реализуете вид STRLEN() аналога для массива объектов KeyPair.

+1

Это хорошая альтернатива использованию std :: vector, поскольку она позволяет избежать распределения динамической памяти и обеспечивает лучшая семантика инициализации без существенного влияния на семантику использования. – dnlgl

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