Как поместить инициализированные структуры в структуру? - PullRequest
0 голосов
/ 07 февраля 2011

У меня есть структура:

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, как их.

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

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

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...

Итак, я хотел бы просто пройтись по структуре, содержащей эти инициализированные экземпляры KeyPairs ...

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

Ответы [ 3 ]

1 голос
/ 07 февраля 2011

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

(обратите внимание, что typedefs являются имплицитами для структур в 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
    }
};

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

KeysA, KeysB, KeysC ...

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

1 голос
/ 07 февраля 2011

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

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 голос
/ 07 февраля 2011

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

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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...