如何通过引用传递数组?

时间:2015-05-17 07:55:21

标签: c++

这是来自main:

test.Begin(static_cast<Start::Person>(player[NUM_PLAYERS]), NUM_PLAYERS);

“static_cast”用红色加下划线,当我将鼠标悬停在它上面时说:

错误:从“Start :: Person”到“Start :: Person *”不存在合适的转换函数

这是来自start.h:

void Begin (Person *, int);

这是来自start.cpp

void Start::Begin (Person *player[4], int NUM_PLAYERS)
start.cpp中的“Begin”以红色加下划线,当我将鼠标悬停在它上面时,错误显示:

错误:声明与“void Start :: Begin(Start :: Person *,int)”

不兼容

后面是我已经为start.h显示的行的位置

2 个答案:

答案 0 :(得分:1)

// assunimg 'player' is an array
test.Begin(player, NUM_PLAYERS); // no cast

start.h:

void Begin (Person [], int);

start.c:

void Start::Begin (Person player[], int NUM_PLAYERS)

答案 1 :(得分:0)

第二个错误是因为您对Begin的定义与您对Begin的声明不符。您的声明传递的是Person*,而您的定义是接受Person的数组4。您可以通过将定义(在.cpp文件中)更改为:

来解决此问题
void Start::Begin(Start::Person* player, int);

然后匹配您的定义。您可以使用以下内容进行调用:

Start::Person players[10] = {};
// Assume 's' is an object of type Start
s.Begin(players, 10);

这要求您将索引传递给Person,然后传递元素数量。您可以将Begin的声明与您的定义相匹配,从而使更好

void Begin(Start::Person players[4]);

现在Begin只接受4 Person的数组,您可以使用以下代码调用:

Start::Person players[4] = {};
// Assume 's' is an object of type Start
s.Begin(players);

这会将数组的COPY传递给Begin。您可以使用以下声明/定义进一步改进:

template <size_t size>
void Begin(const Person (&players)[size]);

这会将const引用传递给任意大小为Person的数组;这是一个不可修改的直接引用(因此没有制作副本),您可以使用以下任何一种方式调用:

Start::Person oldPlayers[6] = {};
Start::Person newPlayers[15] = {};
Start::Person mvps[3] = {};
s.Begin(oldPlayers);
s.Begin(newPlayers);
s.Begin(mvps);