簡體   English   中英

從具有引用返回類型的函數返回什么?

[英]What to return from a function with reference return type?

className &temp (someOtherclassName &c)

問題是我應該返回什么?我試圖僅返回在類中新創建的對象,它不起作用,我還嘗試返回引用或指針,但它不起作用。

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

這是所有代碼:

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

您應該按值而不是引用返回對象。 將聲明更改為:

Klub novKlub(Clen &c)

函數從不應該返回對本地對象的引用,因為在函數返回時它會被破壞,留下一個懸掛的引用。

更新:如果不能更改簽名,則仍不應返回對本地的引用。 在這種情況下,大概是要創建插入到某個容器中的對象,然后在該容器中返回對其的引用。 您沒有提供有關類的足夠詳細的信息來確切說明這可能是什么,但是也許應該將其插入clenovic 如果您提供更多詳細信息,則可以澄清。

假設您正在創建一個新對象,請按值返回它。

要求返回參考的情況在一定程度上受到限制(請參閱下文)。 您的情況不是其中之一。

問題是我應該返回什么[如果我想返回參考文獻]

您應該返回一個具有靜態生存期或調用者已知的生存期的對象。 確保調用者不需要釋放您的對象。

我正在嘗試只返回在類中新創建的對象,它不起作用

您不應該要求調用者釋放通過引用返回的對象,因此,返回新創建的對象不是一種選擇。

我也嘗試返回引用或指針,但它不起作用。

您需要返回一個在返回時不會超出范圍的對象。 通常你想回來

  • 您的對象本身,即*this
  • 對象的一個​​依賴項,即this->someField ,或
  • 您的函數參數之一(這是<<覆蓋中的一種非常常見的模式),或者
  • 靜態或全局變量(不建議)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM