2017-10-24 3 views
0

Ich habe vor kurzem gelernt C++ zu lernen, einige einfache Klassen-/Freund-Funktion zu üben, was ich versuchte zu tun ist, erhalten 2 Zahlen von Benutzer für 2 Objekt einer Klasse mit Freund Funktionen nur dann wieder Verwenden Sie nur die Funktion friend, multiplizieren Sie diese 2 Zahlen und zeigen Sie sie auf dem Bildschirm an. Sagen wir, ich habe 2, 3, 4, 5 in der Reihenfolge eingegeben. Erwartete Ausgänge sind 6 und 20, aber ich kann nur 0 und 0 auf dem Bildschirm sehen.Kann keinen Wert speichern

#include<iostream> 
using namespace std; 

class iluvcpp { 
    int no_1, no_2; 
public: 
    iluvcpp(){} 
    ~iluvcpp(){} 
    friend void inputno(iluvcpp obj); 
    friend int multiply(iluvcpp obj); 
}multi_1, multi_2; 

void inputno(iluvcpp obj) { 

    cout <<"Enter no 1: "; 
    cin >> obj.no_1; 
    cout <<"Enter no 2: "; 
    cin >> obj.no_2; 
} 
int multiply(iluvcpp obj) { 
    return ((obj.no_2)*(obj.no_1)); 
} 

int main() { 
    inputno(multi_1); 
    inputno(multi_2); 
    cout << multiply(multi_1) <<" "<< multiply(multi_2); 

    cout << endl; 
    system("pause"); 
    return 0; 
} 
+2

'inputno' nimmt' obj' nach Wert und Änderungen in 'obj' sind für den Aufrufer nicht sichtbar (d. H. Es wird eine Kopie erstellt). – crashmstr

+0

der 'iluvcpp obj' ist ein Parameter der Funktion' inputno' und sobald die Funktion diesen Parameter zurückgibt und alle Änderungen daran sind weg. Sie setzen niemals ein Feld des 'multi_1'. – user463035818

+0

Hier finden Sie eine detaillierte Erklärung zu den Unterschieden zwischen Referenz und Wert: https://stackoverflow.com/questions/373419/whats-the-difference-between-passing-by-reference-vs-passing-by -Wert –

Antwort

6

übergeben Sie Ihre Objekte von Wert, das heißt, wenn Sie anrufen inputno Sie auf einer Kopie arbeiten. Versuchen Sie, die Funktion Signatur zu ändern zu:

void inputno(iluvcpp& obj) { 
    ... 
} 

Here's an explanation mit Beispielen über Parameter Wert vs durch Verweis übergeben.

1

2 Vorschläge:

Eine Variable/Methode einer Klasse ist standardmäßig privat. Machen Sie entweder Ihre Variablen no_1 und no_2 öffentlich oder schreiben Sie einen Setter, wenn Sie damit vertraut sind. Um sie standardmäßig als public zu verwenden, verwenden Sie struct im Gegensatz zur Klasse.

Wie bereits erwähnt, modifizieren Sie multi_1 und multi_2 nicht direkt. Entweder haben sie durch Verweis übergeben (Die Antwort von oriP erwähnt genau das), oder sie dieses iluvcpp obj Object machen zurückkehren und nennen sie mag:

multi_1 = inputno(multi_1); 
+0

Das ist gültig, aber in diesem Fall brauchen Sie keinen Parameter: 'auto multi_1 = inputno();' – orip

+0

Richtig, aber meiner Meinung nach ist es immer besser, eine Funktion so zu schreiben, dass Sie sie verwenden können jede Instanz, auch nur für dieses kleine Beispiel. – AProgrammer

0

void inputno(iluvcpp obj) hat einen Parameter obj und keinen Rückgabewert genannt. Das ist der falsche Weg, hier in der Nähe, hat inputno nichts von main braucht, aber es sollte etwas zurückgeben:

iluvcpp inputno(void) { ... oder (äquivalent) iluvcpp inputno() { ....

Sie benötigen eine return something;-Anweisung am Ende, damit C++ weiß, welcher Wert von inputno zurückgegeben werden soll.