1

我的问题是如何将 struct.variable(或 struct 数组)传递给 void 函数。基本上代码如下所示:

结构

struct Person{
    string surname;
    string BType;
    string organ;
    int age;
    int year, ID, IDp;
} Patient[50], Donor[50];

int i; // counter variables for the arrays such as Patient[i].BType... etc
int i1; 

然后函数的代码是这样的一行:

void compare(int &i, int &i1, Person &Patient[50], Person &Donor[50]);

我试图通过i,i1Patient结构Donor。为什么这行不通?有没有一种特殊的方法可以将这些结构传递给函数?

变量结构中的值也是从文件中读取的(不要认为这会改变任何东西)。有任何想法吗?

4

3 回答 3

5

您的函数原型不正确。要传递固定数组类型引用,您必须在数组索引声明之外限定参数的引用部分。

void compare(int &i, int &i1, Person (&Patient)[50], Person (&Donor)[50])
//  note parens ----------------------^-------^-------------^------^

调用很简单

compare(i, i1, Patient, Donor);

有趣的是,您可以使用通过推导保证固定数组大小的模板来执行此操作。

template<size_t N>
void compare(int &i, int &i1, Person (&Patient)[N], Person (&Donor)[N])
{
    // N is guarenteed to be the size of your array. You can use it
    //  as you would 50 in your code.
    for (size_t i=0; i<N;++i)
    {
        // do something with Patient and Donor elements
    }
}

这具有允许使用不同的数组大小进行实例化的额外好处。即你也可以这样做:

Person Patient[50], Donor[50];
Person MorePatients[10], MoreDonors[10];

....

compare(i, i1, Patient, Donor);
compare(i, i1, MorePatients, MoreDonors)

它会正确编译。我建议您尝试一下,您可能会发现它很有用。

于 2013-10-11T03:51:26.903 回答
1

除了 WhozCraig 所说的之外,您甚至可以在其中放置可变参数模板参数,以允许传递您在医院可以找到的任意数量类型的东西,例如护士和助产士!

template <typename T1, size_t N1>
void compare(int &i, int &i1, T1 (&array)[N1]) {
    for (const auto& elem : array) {
        std::cout << elem.name << std::endl;   
    }
}

template <typename T1, size_t N1, typename... Ts, size_t... Ns>
void compare(int &i, int &i1, T1 (&array)[N1], Ts (&... arrays)[Ns]) {
    for (const auto& elem : array) {
        std::cout << elem.name << std::endl;   
    } 
    std::cout << std::endl;
    compare(i, i1, arrays...);
}

struct Nurse
{ std::string name; };

struct Midwife
{ std::string name; };


int main() {
    Nurse nurses[] = {{"Nina"}, {"Austin"}};
    Midwife midwives[] = {{"Matriona"}, {"Lizbeth"}, {"Jill"}};
    Nurse evenMoreNurses[] = {{"Maria"}, {"Nick"}, {"Martine"}, {"Ashley"}};

    int i{};
    int i1{};

    compare(i, i1, nurses, midwives, evenMoreNurses);
}

你现在意识到 C++ 有多么有趣了吗?

于 2013-10-11T04:24:26.760 回答
0

只需像这样声明函数:

void compare(int i, int i1, Person *Patient, Person *Donor);

你可以像这样调用:

比较(i,i1,患者,捐赠者)

于 2013-10-11T05:10:13.460 回答