2016-07-14 6 views
1

Ich habe eine Funktionsvorlage und Haupt wie folgt:cin >> Funktionsvorlage arg unbekannter Art

template <class type > type* calculate(type inputVal) { 
     type val; 
     static int counter = 0; 
     static type sum = inputVal; 
     static type average = inputVal; 
     static type* address = &sum 

     do { 
      cout << "Enter value: "; 
      cin >> val; 
      counter++; 
      sum += val; 
      average = sum/counter; 
     } while (!cin.eof()); 
     return address; 
} 

void main() { 
     int num; 
     cout << "Enter Value: "; 
     cin >> num; 
     int *ptr = calculate(num); 
     cout << "SUM: " << *ptr << " AVG: " << *(ptr+1); 
} 

Mein Problem ist, dass diese mit unterschiedlichen Eingabetypen statt nur int funktionieren sollte, so dass, wenn ein Benutzer zum ersten Mal Betritt einen Float, behandelt es alles wie diesen Typ, genauso wie wenn der Benutzer einen Char eingibt.

Auch kann die Template-Funktion nicht die Endwerte drucken.

+1

1. Declareing oder definieren 'void main()' im globalen Namensraum ist illegal in Standard C++. Sie sollten 'int main()' als Einstiegspunkt verwenden. 2. Semikolons fehlen nach 'statischem Typ * Adresse = & sum',' cin >> num' und 'berechnen (num)' 3. '! Cin.eof()' als Schleifenbedingung [scheint schlecht] (http: // stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong) und ich schlage vor, sollten Sie prüfen, ob 'cin >> val' stattdessen erfolgreich ist. – MikeCAT

+0

'* (ptr + 1)' ist schlecht, weil es außerhalb des Bereichs dereferenziert. – MikeCAT

+0

Es ist nicht möglich. Ein Programm kann nicht entscheiden, welchen Typ eine Variable basierend auf der Standardeingabe hat. Alle Arten aller Variablen müssen im Voraus bekannt sein. –

Antwort

1

Eine normale Variable sum wird als Ein-Elementfeld für Zeiger aritimetic (N3337 5,7 Additive Operatoren) behandelt und bei ptr Punkte, an es, und daher ptr+1 dereferenziert werden muss, nicht in einem gültigen Objektpunkt nicht. Wenn Sie eine kontinuierliche Speicherregion wünschen, verwenden Sie Arrays.

Beachten Sie auch, dass

  • !cin.eof() Kontrolle nach sum und average Aktualisierung keine gute Idee erscheinen, weil sie ein ungültiges (doppelte) Daten verwenden werden. Überprüfen Sie, ob die Eingabe erfolgreich ist vor Verarbeitung der Daten.
  • Die Deklaration void main() (oder main mit einem anderen Rückgabetyp als int) im globalen Namespace ist im Standard C++ unzulässig. Wenn Sie keinen besonderen Grund haben - zum Beispiel verbietet Ihr Chef oder Lehrer das Schreiben von standardkonformem Code - sollten Sie int main() (in diesem Fall) verwenden.
  • Sie sollten counter zu 1 initialisieren inputVal in der Zahl zu setzen. Das Vermeiden von Eingaben als Argument, um das Schreiben von doppeltem Code zu vermeiden, scheint besser zu sein.

Try this:

#include <iostream> 
using std::cin; 
using std::cout; 

template <class type > type* calculate(type inputVal) { 
    type val; 
    static int counter = 1; 
    static type buffer[2]; 
    type& sum=buffer[0]; 
    type& average=buffer[1]; 
    sum=average=inputVal; 
    static type* address = buffer; 

    for(;;) { 
    cout << "Enter value: "; 
    if(!(cin >> val)) break; 
    counter++; 
    sum += val; 
    average = sum/counter; 
    } 
    return address; 
} 

int main() { 
    int num; 
    cout << "Enter Value: "; 
    cin >> num; 
    int *ptr = calculate(num); 
    cout << "SUM: " << *ptr << " AVG: " << *(ptr+1); 
} 

Oder dies ohne Eingabe von dem Argument:

#include <iostream> 
using std::cin; 
using std::cout; 

template <class type > type* calculate() { 
    type val; 
    static int counter = 0; 
    static type buffer[2]; 
    type& sum=buffer[0]; 
    type& average=buffer[1]; 
    sum=0; // the type used has to be capable to be converted from integer 0 
    average = 0; 
    static type* address = buffer; 

    for(;;) { 
    cout << "Enter value: "; 
    if(!(cin >> val)) break; 
    counter++; 
    sum += val; 
    average = sum/counter; 
    } 
    return address; 
} 

int main() { 
    int *ptr = calculate<int>(); 
    cout << "SUM: " << *ptr << " AVG: " << *(ptr+1); 
} 
+0

ist es sowieso, es ohne die Verwendung von Arrays zu tun? Und was ist, wenn der Benutzer einen Gleitkommawert berechnen möchte? – leakybytes

+0

@GeorgeVentura Verwenden Sie Strukturen, um in diesem Fall die Verwendung von Arrays zu vermeiden. Lassen Sie den Benutzer Code erhalten, um mit float umzugehen, wenn der Benutzer es wünscht. – MikeCAT

+0

Ich habe versucht, dieses Programm nicht, können Sie wird beendet erklären, wenn diese Bedingung if (! (Cin >> val)) wahr sein – Kapil

Verwandte Themen