2016-07-26 2 views
1

J'ai reçu une affectation pour une classe C++ (heh), qui stipule que je dois écrire un programme pour effectuer une certaine opération sur un vecteur de données. Les données peuvent être de type int ou double type. Le programme doit d'abord demander à l'utilisateur quel type sera utilisé, puis déclarer le vecteur approprié et l'utiliser pour le reste du programme. Je pensais quelque chose le long de ces lignes:Création d'un vecteur de type ambigu ou de portée de variable d'échappement?

// 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; 

Cependant, cela est avéré ne pas travailler parce que le champ d'application des déclarations typedef ne débordent pas leur cas dans la déclaration switch.

Quelque chose d'autre que j'ai essayé était de faire un pointeur vide, puis attribuez-lui au vecteur propre, comme ceci:

// 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; 
} 

Cela semble que cela devrait fonctionner, non? Eh bien, je reçois un autre problème de portée: Pour une raison quelconque, je reçois une erreur "identificateur non défini" sur numbers dans le commutateur ... whaaaa?

Puis, j'ai essayé d'utiliser une variable typename, mais apparemment ce n'est pas une chose en C++. (Quelque chose comme typename TYPE; ... TYPE = double; ... vector<TYPE> numbers;)

Puis est venu une idée géniale: Ecrire une fonction MAKE_VECTOR() basée sur un modèle qui renvoie un pointeur vers un vecteur du type du modèle, puis lui faire prendre un argument du même type pour spécifier le vecteur type. C'est difficile à expliquer; voici le code:

// 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; 
} 

Cela a semblé fonctionner. Pas d'erreurs de syntaxe dans la déclaration de la fonction, mais quand je vais l'utiliser ...

void * numbers; 

// Determine type 
... 

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

// Test 
numbers->push_back(2); 

Ne fonctionne pas. Erreur: Expression must have pointer-to-class type. J'ai regardé en ligne, et réalisé que je dois déréférencer le pointeur d'abord, non? J'ai donc essayé (*numbers)->push_back(2);, mais rien de tel ne fonctionne non plus.

Je suis à court d'idées. Que devrais-je faire?

Répondre

0

Wow. C'est bizarre. J'ai juste essayé la méthode # 2 encore, c'est-à-dire, le pointeur de vide, et cela a fonctionné. WTF, Visual Studio.

+1

@halfer ouais, il ne me laisserait pas faire ce jour-là car il m'a dit que je devais attendre 2 jours avant d'accepter ma réponse ... – vasilescur