2016-07-27 29 views
-1

std::vector<Training> _classes;Training.hにプライベート変数として宣言しました。私は最初のユーザーから_noOfClassesを取得し、その多くの要素でvectorを初期化したいが、私はエラーを取得しています:ベクターのサイズに対するユーザー入力を受け入れる方法は?

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 
} 

私は別に、ユーザの入力からvectorのサイズを初期化するにはどうすればよいです?

+2

サイドノート:あなたの名前を付けるときに先頭のアンダースコアを使いません_ _ "アンダースコアで始まる各名前は、 グローバル名前空間の名前として使用するための実装に予約されています。" _(C++ ISO標準、セクション17.6.4.3.2)。 – Michael

+1

@Michaelメンバー変数はグローバル名前空間にはありませんので、問題ありません。 – Quentin

+0

@Michaelそして大文字ですぐには続いていないので、大丈夫でしょう。 – songyuanyao

答えて

1

Iは、順序を逆になる - Trainingクラスは、「I/O」クラスでない限り、私は、ユーザー入力からTrainingクラスの構造を分離することになります。最初にクラスの数を取得し、取得したユーザー入力からTrainingインスタンスを構築します。あなたは、独自の機能の中にI/Oを考慮し、引数(エラーチェックは省略)として結果を使用することができ、言っ

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) { 
} 

。建設後std::vectorのサイズを変更する

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(); 
} 

、部材resize()方法を用いることができます。 OPコードは次のようになります。

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

_classes(_noOfClasses);は有効な構文ではありません。_classesはファンクタではなく、関数を呼び出すことはできません。 std::vector::resize()を使用して、_noOfClasses要素を含むようにサイズを変更できます。

_classes.resize(_noOfClasses); 
関連する問題