试图传递**数组,但不断收到c2664错误

时间:2014-12-04 03:01:29

标签: c++ arrays pointers inheritance derived-class

好吧,所以我有一个名为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++;
        }
    }

如果需要,我可以提供代码,但我认为我所展示的内容应该足以解决问题所在。

3 个答案:

答案 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];
}

另请注意,将问题简化为简短的自包含示例始终是一个好主意,以便最好地理解它。