[英]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)
函數從不應該返回對本地對象的引用,因為在函數返回時它會被破壞,留下一個懸掛的引用。
更新:如果不能更改簽名,則仍不應返回對本地的引用。 在這種情況下,大概是要創建插入到某個容器中的對象,然后在該容器中返回對其的引用。 您沒有提供有關類的足夠詳細的信息來確切說明這可能是什么,但是也許應該將其插入clenovi
或c
。 如果您提供更多詳細信息,則可以澄清。
假設您正在創建一個新對象,請按值返回它。
要求返回參考的情況在一定程度上受到限制(請參閱下文)。 您的情況不是其中之一。
問題是我應該返回什么[如果我想返回參考文獻]
您應該返回一個具有靜態生存期或調用者已知的生存期的對象。 確保調用者不需要釋放您的對象。
我正在嘗試只返回在類中新創建的對象,它不起作用
您不應該要求調用者釋放通過引用返回的對象,因此,返回新創建的對象不是一種選擇。
我也嘗試返回引用或指針,但它不起作用。
您需要返回一個在返回時不會超出范圍的對象。 通常你想回來
*this
或 this->someField
,或 <<
覆蓋中的一種非常常見的模式),或者
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.