2010-06-12 11 views
5

Ich habe mit Referenzen gespielt (ich habe immer noch Probleme in dieser Hinsicht).Mache ich hier etwas falsch (Referenzen in C++)?

1- Ich mag wäre wissen, ob dies ein akzeptabler Code ist:

int & foo(int &y) 
{ 
    return y; // is this wrong? 
} 

int main() 
{ 
    int x = 0;  
    cout << foo(x) << endl; 

    foo(x) = 9; // is this wrong? 
    cout << x << endl; 

    return 0; 
} 

2- Auch das ist aus einer Probe der Prüfung: In diesem Code

Week & Week::highestSalesWeek(Week aYear[52]) 
{ 
    Week max = aYear[0]; 
    for(int i = 1; i < 52; i++) 
    { 
    if (aYear[i].getSales() > max.getSales()) 
     max = aYear[i]; 
    } 
    return max; 
} 

Es geht um den Fehler fragt , auch wie man es repariert.

Meine Vermutung ist, dass es eine lokale Referenz zurückgibt. Die Lösung ist:

Week & max = aYear[0]; 

Ist das richtig/genug?

Antwort

5

Die erste ist korrekt.

Für die zweite, gibt es unendlich viele Lösungen :), aber das wäre mein:

Week Week::highestSalesWeek(Week aYear[52]) // return a copy of the week 
{ 
    Week max = aYear[0]; 
    for(int i = 1; i < 52; i++) 
    { 
    if (aYear[i].getSales() > max.getSales()) max = aYear[i]; 
    } 
    return max; 
} 

Wenn max eine Referenz ist, können Sie das erste Element AYear immer Sie tun würde, ändern:

max = aYear[i] 

auch könnten Sie einen Zeiger verwenden, um einen Verweis auf die Woche zurück:

Week & Week::highestSalesWeek(Week aYear[52]) 
{ 
    Week* max = &aYear[0]; 
    for(int i = 1; i < 52; i++) 
    { 
    if (aYear[i].getSales() > max->getSales()) max = &aYear[i]; 
    } 
    return *max; 
} 
+1

Sie hatten Recht. Ich verbeugte mich auf die beschämende Weise, lol – zildjohn01

+0

+1 für den Bogen, aber ich stimme etwas nicht überein: Es ist nichts beschämend zu lernen. Du wirst diesen Fehler nie wieder machen. :-) – Thanatos

+0

Warum einen Zeiger? Eine lokale Referenz scheint vorzuziehen. –

1

Zur Beantwortung Ihrer Fragen:

foo(x) = 9; // is this wrong? 

Ich würde sagen, ja, es ist falsch, dass es nicht sinnvoll, obwohl sie syntaktisch gültig ist. Und wie für die „Prüfung“ Frage (wer das Zeug fragt?):

Week & Week::highestSalesWeek(Week aYear[52]) 
{ 
    Week max = aYear[0]; 
    for(int i = 1; i < 52; i++) 
    { 
    if (aYear[i].getSales() > max.getSales()) max = aYear[i]; 
    } 
    return max; 
} 

Nun, die Bereitstellung der Array-Dimension auf den Parameter ist sinnlos, und der Code sollte offensichtlich einen Vektor verwenden. Und die Korrektur sollte in der Unterschrift der Funktion sein:

Week Week::highestSalesWeek(Week aYear[52]) 

Mit anderen Worten - geben Sie einen Wert zurück. Sie sollten fast immer Werte anstelle von Referenzen zurückgeben - Referenzen sind für Funktionsparameter gedacht.

+0

Referenzen als Rückgabetypen sind praktisch, wenn man 'operator []' überlädt;) – fredoverflow

+0

@Fred Natürlich - deshalb habe ich "fast immer" gesagt. Im Fall des Benutzers ist dies sinnlos. –

+0

Und überladen 'operator =' auch, aber um ehrlich zu sein, mag ich nicht, Zuweisung als Ausdruck zu verwenden. – fredoverflow

2

Das wichtige bei Referenzen ist immer sicherzustellen, dass die Referenz nicht auf ein Objekt verweist, das den Gültigkeitsbereich verlassen hat.

, dass das Problem mit Ihrem zweiten Beispiel ist:

Week & Week::highestSalesWeek(Week aYear[52]) 
{ 
    Week max = aYear[0]; 
    return max; 
} 

max ist eine automatische lokale Variable zu dieser Methode. Wenn diese Methode den Gültigkeitsbereich verlässt, wird der Gültigkeitsbereich max nicht mehr unterstützt und Ihr Code enthält nun einen Verweis auf den Arbeitsspeicher.

Da Ihr Code max fortschreiben möchte, können Sie keine Referenz verwenden (da Sie nach der anfänglichen Zuweisung nur ändern können, was referenziert wird, nicht die Referenz selbst). Sie müssen den tatsächlichen Teil von aYear verfolgen, auf den Sie einen Verweis zurückgeben möchten. Zwei Vorschläge.

// By pointer 
Week & Week::highestSalesWeek(Week aYear[52]) 
{ 
    Week *max = &aYear[0]; 
    ...; 
    return *max; 
} 

// By index 
Week & Week::highestSalesWeek(Week aYear[52]) 
{ 
    size_t max_idx = 0;; 
    ...; 
    return aYear[max_idx]; 
}  
Verwandte Themen