2014-12-04 2 views
0

좋아요, 그래서 저는 student라는 클래스와 person 클래스의 두 파생 클래스 인 교수가 있습니다. 학생과 교수진으로 구성된 두 팀을 만들어야합니다. 저는 학생들의 배열과 교수진을 보유하고 있습니다. 나는 두 사람의 팀을 위해 두 개의 배열을 더 만들었습니다 **. 내가 배열을 통과 할 때 나는 '** [12] 사람 * []로 사람'에서 매개 변수 3 변환 할 수 없습니다의 메시지와 함께 컴파일러 오류 C2664를 얻을 수** 배열을 전달하려고하지만 계속해서 c2664 오류가 발생합니다

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[]){....} 
지정하는 동안 나는 또한하는 오류를 얻고 있었다

다음과 같이 사람의 배열에 학생/교수는 그래서 reinterpret_cast했다 : 필요한 경우

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++; 
     } 
    } 

내가 MOR 코드로 제공 할 수 있습니다,하지만 난 문제가 자리하고있는 곳 즉으로 충분해야 보여 무슨 생각합니다.

+0

* person \ * \ * 인 팀에 대해 두 개의 배열을 더 만들었습니다. - 'Person ** t1Arr [12];는'Person ** '이 아닙니다. – chris

+0

그럼, 그게 뭐죠? 어떻게 수정해야합니까? – ITguy42

+1

불필요한 간접 지시가 진행되고있는 것처럼 보입니다. – BlamKiwi

답변

0

Student sArr[12]은 학생들의 배열입니다.

코드를 이해한다면 Person과 Faculty 모두 Person으로부터 상속받은 Person 객체에 대한 포인터의 개별 배열을 유지함으로써 학생과 교수진을 팀에 할당하려고합니다.

이것이 맞다면 팀이 포인터 배열로 이루어 지길 원할 것입니다. 당신이 대신 선언 한 무엇

Person* t1Arr[12]

포인터 - 점슛으로는 사용의이, 배열, 그러나 사람들은 매우 드물다. 오류 메시지 인용한다고 가정

+0

Person * t1Arr [12]로 해봤지만 t1Arr [i]의 값을 표시 할 수는 있지만 주소 일뿐입니다. 요청시 실제로 속성을 표시하지 않습니다. – ITguy42

+0

또한 cout & t1Arr [i] .getTeam()을 시도 할 때 오류가 발생합니다. – ITguy42

+0

여기에 실제로 필요한 것은 우리가이 맥락에서 줄 수있는 것보다 훨씬 더 근본적인 포인터 리뷰입니다. 빠른 대답, 그것이 단지 주소 인 이유는 * 단지 주소 * 때문이었습니다. 포인터는 개체가 메모리에 배치 된 위치의 주소입니다. –

0

** [12] 사람과 사람 '에서 매개 변수 3 변환 할 수 없습니다 * []

가 올바른지, 다음은 일치하지 않습니다 혐의에 의한 기능 선언

void generateTeams(Faculty fArr[],Student sArr[],Person** t1Arr[], Person** t2Arr[]){....} 

즉, 이것은 r이 아니고 입니다. 코드.

또는 실제 오류 메시지가 아닙니다.

기본적으로 오류 메시지가 올바르게 인용된다고 가정하면 잘못된 점을 알 수 있습니다. 즉, Person*[]을 세 번째 인수로 사용하지만 Person**[]을 전달하는 함수를 선언했습니다. 추측에서


, 당신은 기능을 앞으로 선언 및 *를 놓쳤다.

전달 선언은 일반적으로 나쁜 습관 인 ™입니다. 여기에있는 것으로 의심 되듯이 더 많은 성과를 거두지 못하고 때로는 문제를 일으키는 경우가 있습니다.


기본 아마도 가장 좋은 방법은 현재의 원시 배열 및-포인터 및 캐스팅 코드를 도랑 및 std::vector을 사용하는 것입니다.

+0

그건 확실한 코드입니다. 당신을위한 스크린 샷을 heres. http://tinypic.com/r/29zbzmg/8 – ITguy42

+0

@ ITguy42 : 실제 코드가 아닙니다. 호출은 그 뒤에 나오는 선언을 참조 할 수 없습니다. (그리고 매우 다른 오류 메시지와 함께) 컴파일되지 않습니다. screnshots를 게시하지 마십시오. 우편 번호. 오프 사이트가 아닙니다. 이리. –

0

개체에 대한 포인터 배열을 만드는 방법과 배열에서 개체를 사용하는 방법에 문제가있는 것 같습니다. 여기에 있음을 수행하는 방법의 간단한 예입니다 : 나는 간단한 클래스, person을 만든 다음

#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 * pa1[12]; 

I

for(int i = 0; i < 12; ++i) { 
    pa1[i] = new person(names[i]); 
} 

new OPE : 다음 new 연산자 객체를 생성하는 간단한 for 루프를 사용 rator는 각 객체에 공간을 할당하고 생성자를 호출합니다.

내가 다음 -> 연산자로 포인터를 역 참조하여 이러한 개체를 사용할 수 있습니다 :

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

또한 문제를 가장 잘 이해할 수 있도록 짧은 자체 포함 예제로 줄이는 것이 항상 좋은 생각입니다.

관련 문제