2013-05-04 92 views
0

我想调用一个具有所有结构体对象的函数。调用具有结构体的所有实例的函数

我需要一个函数,可以通过调用struct STRUCT_A来遍历结构对象A_1,A_2。代码底部的空函数'reset_all_structs(???)'。

示例代码:

#include <iostream> 


struct STRUCT_A { 
    unsigned char number = 0; 
    bool bool_1 = 0; 
    bool bool_2 = 0; 
} A_1, A_2; // Objects: maybe later A_3, ... , A_x 

void print_to_terminal(STRUCT_A &STRUCT_NAME); 
void set_bool_1(STRUCT_A &STRUCT_NAME); 
void set_bool_2(STRUCT_A &STRUCT_NAME); 
void reset_one_struct(STRUCT_A &STRUCT_NAME); 
void reset_all_structs(); 

int main() 
{ 

    set_bool_1(A_1); 
    A_1.number = 111; 
    set_bool_2(A_2); 
    A_2.number = 222; 
    std::cout << "A_1:\n"; 
    print_to_terminal(A_1); 
    std::cout << "\n"; 
    std::cout << "A_2:\n"; 
    print_to_terminal(A_2); 
    std::cout << "\n"; 

    reset_one_struct(A_1); // <-- Reset one struct works, my question ist how to reset all structs with the type STRUCT_A? 
    std::cout << "A_1:\n"; 
    print_to_terminal(A_1); 
    std::cout << "\n"; 

    set_bool_2(A_1); 
    A_1.number = 234; 
    std::cout << "A_1:\n"; 
    print_to_terminal(A_1); 
    std::cout << "\n"; 

    // Here the question. ??? 

    // reset_all_structs(STRUCT_A); 

    // I want to reset both A_1 and A_2 by calling the function reset_all_structs with all object of the struct "STRUCT_A" and loop through these. Is this possible 
    // I don't want to call a function like reset_all_struct(A_1, A_2) because later I will add more objects of struct STRUCT_A. 

    std::cout << "Reset A_1 and A_2\n"; 
    std::cout << "A_1:\n"; 
    print_to_terminal(A_1); 
    std::cout << "\n"; 
    std::cout << "A_2:\n"; 
    print_to_terminal(A_2); 
    std::cout << "\n"; 


    return 0; 
} 

void print_to_terminal(STRUCT_A &STRUCT_NAME){ 
    std::cout << "Number: " << (int)STRUCT_NAME.number << "\n"; 
    std::cout << "bool_1: " << (int)STRUCT_NAME.bool_1 << "\n"; 
    std::cout << "bool_2: " << (int)STRUCT_NAME.bool_2 << "\n"; 
    return; 
}; 

void set_bool_1(STRUCT_A &STRUCT_NAME){ 
    STRUCT_NAME.bool_1 = 1; 
    STRUCT_NAME.bool_2 = 0; 
    return; 
}; 

void set_bool_2(STRUCT_A &STRUCT_NAME){ 
    STRUCT_NAME.bool_1 = 0; 
    STRUCT_NAME.bool_2 = 1; 
    return; 
}; 

void reset_one_struct(STRUCT_A &STRUCT_NAME){ 
    STRUCT_NAME.number = 0; 
    STRUCT_NAME.bool_1 = 0; 
    STRUCT_NAME.bool_2 = 0; 
    return; 
}; 


void reset_all_structs(???){ 
// loop through all structs 
    return; 
}; 
+0

如果您的设计使用这些设施,您正在使用具有处理这种情况的设施的语言。阅读有关可用于操作一个或多个结构的容器(如std :: vector)的信息。 – 2013-05-04 13:50:20

回答

0

你可以把它们放在一个本地数组和循环遍历它,就像这样:

void reset_all_structs() 
{ 
    // This array can be created locally, and must capture by pointer 
    // arrays of references are illegal in C++. 
    STRUCT_A * structs[] = { &A_1, &A_2 }; 
    for(int i = 0; i < sizeof(structs); i++) 
    { 
     reset_one_struct(*structs[i]); 
    } 
} 

顺便说一句,你标记你的问题C++,但是这看起来像C 。如果你是C++的新手,我建议你在你的结构中使用STRUCT_NAME的所有函数变成methods。至少,将正式的STRUCT_NAME参数重命名为不会与结构名称本身或宏定义相冲突的东西。最后,我建议将你的结构实例收集到一个STL容器中,比如std::vector,以使循环中的迭代和访问更简单。

0

改为使用array或更好的vectorstructs

struct STRUCT_A { 
    unsigned char number = 0; 
    bool bool_1 = 0; 
    bool bool_2 = 0; 
}; 
typedef struct STRUCT_A Data; 


void set_bool_1(Data& data_i) { 
    data_i.bool_1 = 1; 
} 

void set_bool_2(Data& data_i) { 
    data_i.bool_1 = 1; 
} 

void reset_one_struct(Data& data_i) { 
    data_i.bool_1 = 0; 
    data_i.bool_2 = 0; 
    data_i.number = 0; 
} 
void reset_all_structs(std::vector<Data>& all_data) { 
    for(int i = 0; i < all_data.size(); ++i) 
     reset_one_struct(all_data[i]); 
} 

int main() 
{ 
    std::vector<Data> my_data(2); 
    set_bool_1(my_data[1]); 
    my_data[1].number = 111; 

    reset_one_struct(my_data[1]); 
    reset_all_structs(my_data); 
0

语言本身不可能遍历相同类型的相同变量。

你可以做一些注册表的结构,然后遍历这个注册表。喜欢的东西:

struct STRUCT_A; 
std::vector<STRUCT_A*> struct_A_registry; 

struct STRUCT_A { 
    ... 
    // constructor 
    STRUCT_A() { struct_A_registry.push_back(this); } 
    // destructor 
    ~STRUCT_A() { 
     for (std::vector<STRUCT_A*>::iterator it = struct_A_registry.begin(); 
      it != struct_A_registry.end(); ++it) 
     if (*it == this) { 
      struct_A_registry.erase(this); 
      break; 
     } 
    } 
}; 

然后你reset_all_structs将只是

void reset_all_structs() { 
    for (std::vector<STRUCT_A*>::iterator it = struct_A_registry.begin(); 
     it != struct_A_registry.end(); ++it) 
    reset_one_struct(**it); 
} 

或者,如果你在同一行的程序申报全部STRUCT_A变量,可以组织他们到一个数组,它会简单得多。

相关问题