2016-06-03 3 views
1
className &temp (someOtherclassName &c) 

질문은 무엇을 반환해야합니까? 클래스에서 새로 만든 개체를 반환하려고 시도 중입니다. 작동하지 않으며 참조 또는 포인터를 반환하려고 시도했지만 작동하지 않습니다.참조 반환 유형이있는 함수에서 반환 할 대상은 무엇입니까?

#include<iostream> 
#include<cstring> 
using namespace std; 
class Clen{ 
private: 
char name[50]; 
char surname[50]; 
int level; 
public: 
Clen(char n[] = "null", char s[] = "null", int l = 1){ 
    strcpy(name, n); 
    strcpy(surname, s); 
    level = l; 
} 

//operator++ 
Clen operator++(int){ 
    Clen temp(*this); 
    ++level; 
    return temp; 
} 

//++operator 
Clen &operator ++(){ 
    ++level; 

    return *this; 
} 

int getLevel(){ 
    return level; 
} 

//operator << 
friend ostream &operator << (ostream &output, const Clen &right); 

//operator== 
friend bool operator == (const Clen &left, const Clen &right); 

//operator!= 
friend bool operator != (const Clen &left, const Clen &right); 

}; 
ostream &operator << (ostream &output, const Clen &right){ 
output << right.name << " " << right.surname << ", " << right.level << endl; 
return output; 
} 

bool operator == (const Clen &left, const Clen &right){ 
if(left.level == right.level) 
    return true; 

return false; 
} 

bool operator != (const Clen &left, const Clen &right){ 
return !(left == right); 
} 

class Klub{ 
private: 
char name[100]; 
Clen *clenovi; 
int elements; 
void copy(const Klub &toCopy){ 
    strcpy(name, toCopy.name); 
    elements = toCopy.elements; 

    clenovi = new Clen[elements + 1]; 
    for(int i = 0; i < elements; i++){ 
     clenovi[i] = toCopy.clenovi[i]; 
    } 
} 

public: 
//constructor 
Klub(char n[] = "null", Clen c[] = NULL, int e = 0){ 
    strcpy(name, n); 
    elements = e; 

    clenovi = new Clen[elements + 1]; 
    for(int i = 0; i < elements; i++){ 
     clenovi[i] = c[i]; 
    } 
} 
//copy constructor 
Klub(const Klub &toCopy){ 
    copy(toCopy); 
} 

//assignment operator 
Klub &operator = (const Klub &right){ 
    if(this == &right) 
     return *this; 
    delete [] clenovi; 
    copy(right); 

    return *this; 
} 

//destructor 
~Klub(){ 
    delete [] clenovi; 
} 

//operator << 
friend ostream &operator << (ostream &output, const Klub &right); 


//operator += 
Klub &operator +=(Clen c){ 
    Clen *temp = clenovi; 
    clenovi = new Clen[elements + 1]; 

    for(int i = 0; i < elements; i++){ 
     clenovi[i] = temp[i]; 

    } 

    clenovi[elements] = c; 
    ++elements; 
    delete [] temp; 
    return *this; 

} 

Klub &novKlub(Clen &c){ 
    Klub newKlub; 
    strcpy(newKlub.name, name); 

    for(int i = 0; i < elements; i++){ 
     if(c.getLevel() == clenovi->getLevel()){ 
      newKlub += clenovi[i]; 

     } 

    } 
    return *this; 
} 
}; 

ostream &operator << (ostream &output, const Klub &right){ 
output << right.name << endl; 
for(int i = 0; i < right.elements; i++){ 
    output << right.clenovi[i] << endl; 
} 

return output; 
} 
int main() 
{ 
Clen clen; 
int n, stepen; 
char ime[30], prezime[30]; 
cin >> ime >> n; 
Klub k1(ime); 
for(int i = 0; i < n; i++){ 
    cin >> ime >> prezime >> stepen; 
    Clen c(ime, prezime, stepen); 
    k1 += c; 
    clen = c; 
} 
Klub k2 = k1.novKlub(clen); 
cout << k2; 
return 0; 
} 
+0

기능에 따라 달라집니다. 일반적으로 함수가 호출되는 인스턴스 또는 인수 (참조이기도 함) 중 하나를 반환합니다. 함수 내에서 생성 된 참조는 반환 할 수 없습니다. 당신은 실제로 무엇을하려고합니까? – BoBTFish

+0

@ 101010 함수에서 새로 생성 된 임시 객체를 반환해야합니다. –

+3

@ M.T! 그것이 당신이 확실히하지 않는 한가지입니다. 더 이상 존재하지 않는 것에 대한 참조로 끝날 것입니다. – BoBTFish

답변

5

당신은 참조하지, 값으로 개체를 반환해야합니다 :

Klub &novKlub(Clen &c){ 
    Klub newKlub; 
    strcpy(newKlub.name, name); 

    for(int i = 0; i < elements; i++){ 
     if(c.getLevel() == clenovi->getLevel()){ 
      newKlub += clenovi[i]; 

     } 

    } 
    return newKlub; 
} 

여기에 모든 코드입니다. 귀하의 선언을 변경합니다 : 그것은 매달려 참조를 떠나 함수 반환에 파괴로

Klub novKlub(Clen &c) 

기능, 로컬 객체에 대한 참조를 반환해서는 안됩니다.

업데이트 : 서명을 변경하는 것이 옵션이 아닌 경우에도 로컬에 대한 참조를 반환하지 않아야합니다. 이 경우, 아마 일부 컨테이너에 삽입 된 오브젝트를 작성한 다음이 컨테이너 내에서 오브젝트에 대한 참조를 리턴하는 것이 목적입니다. 클래스에 대한 세부 정보를 정확하게 제공하지 못 했으므로 정확히 무엇을 말할 수 있겠지만 아마도 clenovi 또는 c에 삽입 될 것입니다. 이것들에 대해 더 자세하게 설명하면 명확해질 수 있습니다.

+0

글쎄, 이건 내 OOP 과정에서 할당이며, 나는이 프로토 타입으로해야합니다 기능을 변경 해야하는 건 아니야 : Klub & novKlub (클렌 & C) –

+0

위의 업데이 트를 참조하십시오 – Smeeheey

+0

이 기능으로 새로운 클럽 c (인수)와 동일한 레벨을 갖는 모든 구성원을 포함하는 생성됩니다. -> 지시문 –

5

새 개체를 만들면 값으로 반환하십시오.

참조를 반환해야하는 상황은 다소 제한적입니다 (아래 참조). 당신의 상황은 그들 중 하나가 아닙니다.

문제는

당신은 호출자에게 알려진 정적 수명, 또는 평생에 객체를 반환해야 [내가 참조를 반환 할 경우] 내가 반환해야합니다 것입니다. 호출자가 객체를 해제 할 필요가 없는지 확인하십시오. 내가 새로 클래스에서 생성 단지 객체를 반환하는 것을 시도하고있다

, 그렇게 새로 반환, 당신은 참조로 반환 무료 객체에 호출 할 필요가 없습니다

을 작동하지 않습니다 생성 된 개체는 옵션이 아닙니다.

참조 또는 포인터를 반환하려고했는데 작동하지 않습니다.

반품시 범위를 벗어나지 않는 물건을 반품해야합니다. 일반적으로 당신은 당신의 함수 매개 변수의

  • 즉, 개체 자체 *this, 또는 개체의 부양 가족의
  • 하나, 즉 this->someField, 또는
  • 하나 (이 << 최우선에 매우 일반적인 패턴을 반환하려면) 또는
  • 정적 또는 전역 변수 (권장하지 않음).