好吧,所以我有一个名为student的课程和另一个名为faculty的课程,这两个课程都来自一个人类。我需要组建两个由学生和教师组成的团队。我有一系列的学生和一系列的教师。我为两个人**创建了两个阵列。当我尝试传递数组时,我收到编译器错误c2664的消息无法将参数3从'人** [12]转换为人* []'
Student sArr[12];
Faculty fArr[12];
Person** t1Arr[12];
Person** t2Arr[12];
generateTeams(fArr,sArr,t1Arr,t2Arr);
}
void generateTeams(Faculty fArr[],Student sArr[],Person** t1Arr[], Person** t2Arr[]){....}
在尝试将学生/教师分配到人员阵列时,我也得到了错误,所以我必须按照以下方式重新解释:
for(int i=0;i<12;i++){
if(sArr[i].getTeam()==1){
t1Arr[t1Count]=reinterpret_cast<Person**> (&sArr[i]);
t1Count++;
}
else if(sArr[i].getTeam()==2){
t2Arr[t2Count]=reinterpret_cast<Person**> (&sArr[i]);
t2Count++;
}
else if(fArr[i].getTeam()==1){
t1Arr[t1Count]=reinterpret_cast<Person**> (&fArr[i]);
t1Count++;
}
else if(fArr[i].getTeam()==2){
t2Arr[t2Count]=reinterpret_cast<Person**> (&fArr[i]);
t2Count++;
}
}
如果需要,我可以提供代码,但我认为我所展示的内容应该足以解决问题所在。
答案 0 :(得分:0)
Student sArr[12]
是一系列学生。
如果我理解你的代码,你就是试图通过保持单独的指向Person对象的指针数组来将你的学生和教师分配给团队,大概是学生和教师都从Person继承。)
如果这是正确的,那么您希望您的团队由指针数组组成。
Person* t1Arr[12]
你声明的是指针指针的数组,它有它的用途,但这些很少见。
答案 1 :(得分:0)
假设错误消息引用
“无法将参数3从'人** [12]转换为人* []
是正确的,然后它与所谓的函数声明
不匹配void generateTeams(Faculty fArr[],Student sArr[],Person** t1Arr[], Person** t2Arr[]){....}
即。这不是真正的代码。
或者它不是真正的错误信息。
但基本上,假设错误消息被正确引用,它会告诉你错误:你已经声明了一个函数,它希望Person*[]
作为第三个参数,但是你传递的是Person**[]
。
在 guess 中,您已向前声明了该函数,并错过了*
。
前瞻性声明通常是一种糟糕的做法:它是更多的工作,没有收获,有时会弄脏事情,因为我怀疑它在这里。
一个基本的,可能是最好的解决方案是放弃当前的原始数组和指针和转换代码,并使用std::vector
。
答案 2 :(得分:0)
您的问题似乎在于如何创建指向对象的指针数组,以及如何使用数组中的这些对象。以下是如何执行此操作的简化示例:
#include <cstdio>
using namespace std;
class person {
const char * _name;
public:
person(const char * n) : _name(n) {}
const char * getname() const { return _name; }
};
person * pa1[12];
int main( int argc, char ** argv )
{
const char * names[12] = { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l" };
// construct objects
for( int i = 0; i < 12; ++i) {
pa1[i] = new person(names[i]);
}
// use objects
for( int i = 0; i < 12; ++i) {
printf("person %d is %s\n", i, pa1[i]->getname());
}
// destroy objects
for( int i = 0; i < 12; ++i) {
delete pa1[i];
}
return 0;
}
我在这里创建了一个简单的类person
,并且我构建了一个指向person
的指针数组,如下所示:
person * pa1[12];
然后我使用一个简单的for
循环来构造具有new
运算符的对象:
for( int i = 0; i < 12; ++i) {
pa1[i] = new person(names[i]);
}
new
运算符为每个对象分配空间,并调用其构造函数。
然后,我可以通过使用->
运算符取消引用指针来使用这些对象:
for( int i = 0; i < 12; ++i) {
printf("person %d is %s\n", i, pa1[i]->getname());
}
因为我使用new
来构造对象,所以我需要使用delete
销毁它们:
for( int i = 0; i < 12; ++i) {
delete pa1[i];
}
另请注意,将问题简化为简短的自包含示例始终是一个好主意,以便最好地理解它。