2016-07-27 10 views
-1

Ich habe std::vector<Training> _classes; in Training.h als private Variable deklariert. Ich möchte zunächst _noOfClasses vom Benutzer erhalten und dann initialisieren vector mit, dass viele Elemente, aber ich erhalte eine Fehlermeldung:Wie kann man Benutzereingaben für die Größe eines Vektors akzeptieren?

call of an object of a class type without appropriate operator() or conversion functions to pointer-to-function type

Training::Training() : _noOfClasses(0) { 
    std::cout << "Enter the number of class\n"; 
    std::cin >> _noOfClasses; 
    _classes(_noOfClasses); //Error 
} 

Wie kann ich die Größe des vector von Benutzereingabe initialisieren, getrennt ?

+2

Randbemerkung: keine führende verwenden Unterstrichen bei der Benennung Ihrer eigene Symbole: _ "Jeder Name, der mit einem Unterstrich beginnt, ist für die Implementierung als Name im globalen Namespace reserviert." _ (C++ ISO-Standard, Abschnitt 17.6.4.3.2). – Michael

+1

@Michael Member-Variablen sind nicht im globalen Namespace, das ist also in Ordnung. – Quentin

+0

@Michael Und es wird nicht sofort von einem Großbuchstaben gefolgt, also wäre in Ordnung. – songyuanyao

Antwort

1

I würde die Reihenfolge umkehren - es wäre denn, die Training Klasse ist eine „I/O“ -Klasse, würde ich die Konstruktion der Training Klasse von jeder Benutzereingabe trennen. Besorgen Sie sich zuerst die Anzahl der Klassen und konstruieren Sie dann die Instanz Training aus der erhaltenen Benutzereingabe.

std::size_t noOfClasses; 
std::cout << "Enter the number of class\n"; 
std::cin >> noOfClasses; 
// ... 
Training::Training(std::size_t noOfClasses) 
: classes_(noOfClasses), noOfClasses_(noOfClasses) { 
} 

Das heißt, können Sie die I/O-out in Abhängigkeit von seiner eigenen Faktor und verwenden Sie das Ergebnis als Argument (Fehler ausgelassen Prüfung);

std::size_t GetTrainingSize() 
{ 
    std::size_t i; 
    std::cout << "Enter the number of class\n"; 
    std::cin >> i; 
    return i; 
} 

Training::Training() : classes_(GetTrainingSize()) { 
    // if needed... 
    _noOfClasses = classes_.size(); 
} 

ein std::vector nach dem Bau Zum Ändern der Größe, kann das Element resize() Verfahren verwendet werden. Der OP-Code würde dann aussehen;

Training::Training() : _noOfClasses(0) { 
    std::cout << "Enter the number of class\n"; 
    std::cin >> _noOfClasses; 
    _classes.resize(_noOfClasses); 
} 
3

_classes(_noOfClasses); ist keine gültige Syntax, _classes ist kein Funktor und Sie können keine Funktion darauf aufrufen. Sie könnten std::vector::resize() verwenden, um die Größe so zu ändern, dass sie _noOfClasses Elemente enthält.

_classes.resize(_noOfClasses); 
Verwandte Themen