2014-12-16 3 views
4

У меня возникают проблемы с итерацией структуры.Итерация структуры в C++

Структуру можно определить по-разному, в зависимости от флагов компилятора. Я хочу, чтобы установить все элементы этой структуры в 0. я не знаю, сколько членов есть, но все они гарантированно числа (целое, долго ...)

Смотрите пример ниже:

#ifdef FLAG1 
    struct str{ 
     int i1; 
     long l1; 
     doulbe d1; 
    }; 
#elsif defined (OPTION2) 
    struct str{ 
     double d1 
     long l1; 
    }; 
#else 
    struct str{ 
     int i1; 
    }; 
#endif 

Я думаю, хороший псевдо-код для того, что я хочу сделать, это:

void f (str * toZero) 
{ 
    foreach member m in toZero 
     m=0 
} 

есть ли способ легко сделать это в C++?

ответ

0

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

7

Чтобы инициализировать любые данные PODO до нуля на C++, используйте = { 0 }. Вам не нужно перебирать всех членов.

StructFoo* instance = ... 
*instance = { 0 }; 
+0

Этот код работает с C++ 11. То же самое можно сделать с C99, однако для этого требуется имя типа перед фигурными скобками: '* instance = (StructFoo) {0};'. Однако в объявлении переменной это не требуется: 'StructFoo instance = {0};' – cmaster

1

Для простоты, Вы можете рассмотреть возможность использования одного макроса следующим образом:

#define NUMBER_OF_MEMBERS 3 

struct Str{ 
#if NUMBER_OF_MEMBERS > 0 
    int i1; 
#endif 
#if NUMBER_OF_MEMBERS > 1 
    double d1; 
#endif 
#if NUMBER_OF_MEMBERS > 2 
    long l1; 
#endif 
}; 

void f (Str & str){ 

    #if NUMBER_OF_MEMBERS > 0 
     str.i1 = 0; 
    #endif 
    #if NUMBER_OF_MEMBERS > 1 
     str.d1 = 0; 
    #endif 
    #if NUMBER_OF_MEMBERS > 2 
     str.l1 = 0; 
    #endif 

    return; 
} 

int main() { 
    Str str; 
    f(str); 
} 

Во-вторых, вы только вызов функции f после создания класса, чтобы начать значение в нуль? Если это так, это лучше подходит для метода конструктора struct. В C++ 11, он может быть записан как чисто, как это:

#define NUMBER_OF_MEMBERS 3 

struct Str{ 
#if NUMBER_OF_MEMBERS > 0 
    int i1 = {0}; 
#endif 
#if NUMBER_OF_MEMBERS > 1 
    double d1 = {0}; 
#endif 
#if NUMBER_OF_MEMBERS > 2 
    long l1 = {0}; 
#endif 
}; 

int main() { 
    Str str; 
    //no need to call function after construction 
} 
0

Вы можете использовать C-способ, как это стручок:

memset(&str_instance, '\0', sizeof(str)); 
Смежные вопросы