2016-07-26 4 views
1

私はC++クラス(heh)の割り当てを受けています。これは、データのベクトルに対して特定の操作を実行するプログラムを作成する必要があると述べています。データは、int型またはdouble型のいずれかです。プログラムはまず、どの型を使用するかをユーザーに尋ね、次に適切なベクタを宣言し、それをプログラムの残りの部分に使用する必要があります。私はこれらの線に沿って何かを考えていた:typedefの文スコープがswitch声明の中で彼らのケースを超えて拡張しないので、あいまいな型のベクトルを作成するか、変数スコープをエスケープしますか?

// Determine type of data values 
cout << "What type of values: Int (1), or Double (2)?" << endl 
    << "Type: "; 
int entry; 
cin >> entry; 
cin.ignore(); 

// Execute a typedef accordingly 
switch (entry) 
{ 
case 1: 
    typedef int TYPE; 
    break; 
case 2: 
    typedef double TYPE; 
    break; 
default: 
    typedef double TYPE; // Defaults to double 
    break; 
} 

// Declare the vector 
vector<TYPE> numbers; 

はしかし、これは動作しないことが判明しました。

私が試した何か他のものがvoidポインタを行い、その後、適切なベクトルに割り当て、そのようにすることでした:

// Declare pointer 
void * numbers = nullptr; 

// Declare both possible vectors 
vector<int> intVector; 
vector<double> doubleVector; 

// Assign pointer to proper vector 
switch (entry) 
{ 
case 1: 
    numbers = &intVector; 
    break; 
case 2: 
    numbers = &doubleVector; 
    break; 
default: 
    numbers = &doubleVector; 
    break; 
} 

それは右、動作するはずのように思える。これは?さて、別のスコープの問題が発生します。何らかの理由で、スイッチのnumbersに「未定義の識別子」というエラーが表示されます... whaaaa?

次に、typename変数を使用しようとしましたが、明らかにそれはC++のものではありません。 (typename TYPE; ... TYPE = double; ... vector<TYPE> numbers;のような)

次に、テンプレートの型のベクトルへのポインタを返すテンプレートMAKE_VECTOR()関数を書いて、ベクトルを指定するために同じ型の引数を取るようにしてくださいタイプ。これは説明が難しい。コードは次のとおりです。

// Returns a pointer to a new vector of a specified type.  template<typename T> 
vector<T> * MAKE_VECTOR(T var) 
{ 
    void * ptr; 
    vector<T> vec; 
    ptr = &vec; 

    return ptr; 
} 

これは動作していたようです。関数宣言に構文エラーはありませんが、使用するときには...

void * numbers; 

// Determine type 
... 

switch(entry) 
{ 
case 1: 
    numbers = MAKE_VECTOR((int)1); 
    break; 
    ... 
} 

// Test 
numbers->push_back(2); 

機能しません。エラー:Expression must have pointer-to-class type.私はオンラインで見て、最初にポインタを参照解除する必要があることに気付きましたか?だから、私は(*numbers)->push_back(2);を試しましたが、どちらもうまくいきません。

私はアイデアがありません。私は何をすべきか?

答えて

0

ワウ。それは変だ。私はちょうどメソッド#2をもう一度試しました。つまり、voidポインタです。それはうまくいきました。 WTF、Visual Studio。

+1

@halerええ、それは私が私の答えを受け入れる前に2日待たなければならないと言われたので、それは私にそれをさせてくれませんでした... – vasilescur

関連する問題