。请大家帮忙看看这个有关问题出在哪里呢,求指教

求助。请大家帮忙看看这个问题出在哪里呢,求指教



class WarSystem
{
public:
WarSystem();
~WarSystem();
void startWar();
public:
Soldier *pGroupA[3];
Soldier *pGroupB[3];
};
void startWar()
{
pGroupA[0]->makeDecision(*pGroupB);
}
我选了有问题的这部分,求解释为什么我传把指针数组用数组传送出去,到makeDecision里面就只有数组第一个数据有效,后两个有问题。希望大家帮帮忙

------解决方案--------------------
你传的是*pGroupB唉。。不就是数组的第一个元素么。。你要整个数组传进去应该改一下参数直接pGroupB这样传进去。。
------解决方案--------------------
把 makeDecision 的声明发上来看看,如果是接受 Soldier 的,那就是发生复制导致的。
------解决方案--------------------
pGroupA[0]->makeDecision(*pGroupB);
改成pGroupB

把makeDecision的参数改成pGroupB。
你把数组的第一个元素传进去,当然找不到第二个元素的,除非makeDecision里面对它再取地址。
对数组来说,它每个元素地址空间是连续的。但是对于*pGroupB这个元素来说,下一个元素的地址得得到数组地址偏移后才能获得。
------解决方案--------------------
引用:
Quote: 引用:

把 makeDecision 的声明发上来看看,如果是接受 Soldier 的,那就是发生复制导致的。

int makeDecision(Soldier a[]);


听了2楼说的我发现我这写的好像确实只接受一个数据,请你帮我看看这个问题在哪。如果和2楼说的一样直接传pGroupB指针数组的话在makeDecision应该怎么接受呢?

试试这个

// declaration
int makeDecision(Soldier* soldier_pointer_array[]);
// call
pGroupA[0]->makeDecision(pGroupB);

makeDecision 内部可以获得 soldier_pointer_array 中的每一个元素,注意元素类型是 Soldier*。安全起见,声明成这样可能更好.
int makeDecision(Soldier* (&soldier_pointer_array) [3]);
------解决方案--------------------
引用:
Quote: 引用:

pGroupA[0]->makeDecision(*pGroupB);
改成pGroupB

把makeDecision的参数改成pGroupB。
你把数组的第一个元素传进去,当然找不到第二个元素的,除非makeDecision里面对它再取地址。
对数组来说,它每个元素地址空间是连续的。但是对于*pGroupB这个元素来说,下一个元素的地址得得到数组地址偏移后才能获得。

改成pGroupB后应该怎样在makeDecision的声明里接受呢

就按照8楼的方法就很好。你可以看看c与指针这本书,深入理解一下指针
------解决方案--------------------
void startWar()
{
pGroupA[0]->makeDecision(*pGroupB);
pGroupB这是一个指针数组名,本质上是一个数组,数组名在传参的时候会被弱化成指向数组第一个元素的指针,在传参时对数组名进行解引用操作,相当于是操作pGroupB[0]传给函数了。所以你没办法访问数组中的后两个元素了,直接传数组名,在函数中进行遍历数组不行么
}