2014-12-09 2 views
1

클래스의 배정을 위해 BST에서 항목을 검색하려고합니다. 제공된 코드 중 일부는 변경할 수 없습니다. 강사는 BST 클래스에서 호출하는 기능이 같은 모습을 (지금까지) 보이는이배정 연산자 오버로드/검색 함수

static void retrieveItem(char *name) 
{ 
    Data const *data; 

    cout << ">>> retrieve " << name << endl << endl; 
    if (database->retrieve(name, data)) 
     cout << *data << endl; 
    else 
     cout << "not found" << endl; 
    cout << endl; 
} 

처럼 보이는 드라이버의 검색 기능 (I 변경할 수없는) 만들었습니다. 함수 호출에 대한 인수를 변경할 수 없습니다. 마지막으로 나는 다음과 같은 과제 과부하를 가지고 데이터 클래스 구현 생성자를 복사 (에 소스 파일을 변경할 수 없습니다이

struct Item 
{ 
    Data data;  // the data instance must be specified this way, NOT as a pointer 
    bool isEmpty = true; 
    int  loc = 0; 
}; 

Item *items; 

과 같은 항목이라는 구조체의 배열이 있습니다

bool BST::retrieve(const char *key, Data const *& data) const 
{ 
    int rIndex = 0; 
    while (rIndex <= capacity) 
    { 
     if (strcmp(items[rIndex].data.getName(), key) == 0) 
      { 
      data = items[rIndex].data; 
      return true; 
      } 
     else if (strcmp(items[rIndex].data.getName(), key) < 0) 
      rIndex = (rIndex * 2) + 1; 
     else if (strcmp(items[rIndex].data.getName(), key) > 0) 
      rIndex = (rIndex * 2) + 2; 
    } 
    return false; 
} 

이 중 하나) 내가 틀렸다면

Data::Data(const Data& source) 
{ 
    strcpy(this->name, source.name); 
} 

Data& Data::operator=(const Data& data2) 
{ 
    strcpy(this->name, data2.name); 
    return *this; 
} 

는 제발 올바른하지만 드라이버에서 자신의 검색 기능의 목표처럼 보인다는 키 (이름을 사용하여 데이터 객체를 검색하는 것입니다) 그런 다음 함수에 전송 된 데이터 인수에 복사합니다. 불행히도, 내 검색 기능 에선

data = items[rIndex].data; 

이 작동하지 않습니다. 또는 ->] 저는 90 % 확신합니다. 액세스 할 수있는 올바른 방법입니다. 그러나 "데이터 '에서'const 데이터 * '로의 적절한 변환 유형이 없습니다."

할당 오버로드 연산자를 사용하지 않으면 어떻게 할 수 있습니까? 과부하의 나의 구현은 잘못 되었습니까?

+0

일반적으로 데이터 const * 및 데이터를 의미하지 않습니다. 그와 비슷한 것을 볼 때 그것은 나를 매우 의심스럽게 만든다. – pm100

+0

@ pm100 op는 과제에 제공된 코드이며 그들이 의심스럽지 않더라도 문제가있다. (나는 동의한다. 이상한, 이상한 말) – wakjah

답변

1
bool BST::retrieve(const char *key, Data const *& data) const 

두 번째 인수는하지의 값으로, items[rIndex].data포인터로 설정해야하므로 포인터에 참조, 데이터에서 const입니다.

는 고려 X에 참조 함수에 전달되었으므로이 때문에

// ... int x = 0; foo(x); std::cout << x; 

42

인쇄 될 것처럼 호출되면

void foo(int & out) 
{ 
    out = 42; 
} 

다음.

int x; // global 
// ... 
void foo(int *& out) 
{ 
    x = 42; 
    out = &x; // set out to pointer to x 
} 

int main() 
{ 
    int * ptr = nullptr; 
    foo(ptr); // foo will set ptr to the pointer to x 
    std::cout << *ptr; // prints 42 
} 

또, 42 : 예를 들어, 호출자가 위 유사한 방식으로 데이터에 대한 포인터를 검색 할 수 있도록, 포인터참조를 전달 - 당신의 상황은 조금 다르다 인쇄됩니다. 단항 참조, & 및 deref, *, 연산자를 사용하여 포인터를 x으로 가져오고 해당 값을 추출하려면 ptr을 참조하십시오.

덧붙여서 Data::operator=의 구현이 얼마나 깨 졌는지를 알 수는 없습니다. 메모리가 겹치는 부분에 strcpy을 사용하는 정의되지 않은 동작이므로 누군가가 객체 인스턴스를 자신에게 할당하려고하면 발생합니다 (strcpy 참조).자체 할당 이외의 경우 할당의 대상에 항상 소스의 문자열에 충분한 공간이 있으면 올바른 것입니다. 그렇지 않으면 할당되지 않은 메모리에 쓸 것입니다. 또한 다른 멤버 변수가 있으면 복사해야합니다.

+0

별도의 포인터 변수를 만들고'items [rIndex] .data'를 가리켜 야하고 그 포인터를 두 번째 인수로 사용해야합니까? 할당 대상은 드라이버 기능의 데이터 객체이지만 그렇지 않습니까? 추가 멤버가 없습니다. – FutureShocked

+0

문제는 호출 코드가 아닌'BST :: retrieve'에 있습니다. – wakjah

+0

나는 그것을 고치기 위해 어떻게 갈 것인지 아직도 이해하지 못하고있다. – FutureShocked