创建不明确类型的向量,或转义变量范围?
Creating a vector of ambiguous type, or escaping variable scope?
我被分配了一个 C++ class (heh) 作业,其中规定我必须编写一个程序来对数据向量执行特定操作。数据可以是 int 类型或 double 类型。程序必须首先询问用户将使用哪种类型,然后声明适当的向量,并将其用于程序的其余部分。我在想这些:
// 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;
然而,这并没有起作用,因为 typedef 语句的范围没有超出它们在 switch
语句中的大小写。
我尝试的其他方法是创建一个 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
上收到 "undefined identifier" 错误...whaaaa?
然后,我尝试使用 typename
变量,但显然这不是 C++ 中的事情。 (类似于 typename TYPE; ... TYPE = double; ... vector<TYPE> numbers;
)
然后出现了一个聪明的想法:编写一个模板化的 MAKE_VECTOR() 函数,returns 一个指向模板类型向量的指针,然后让它接受一个相同类型的参数指定矢量类型。这很难解释;这是代码:
// 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);
,但也没有类似的方法。
我没主意了。我该怎么办?
哇。那真是怪了。我只是再次尝试了方法#2,即 void 指针,它起作用了。卧槽,Visual Studio.
我被分配了一个 C++ class (heh) 作业,其中规定我必须编写一个程序来对数据向量执行特定操作。数据可以是 int 类型或 double 类型。程序必须首先询问用户将使用哪种类型,然后声明适当的向量,并将其用于程序的其余部分。我在想这些:
// 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;
然而,这并没有起作用,因为 typedef 语句的范围没有超出它们在 switch
语句中的大小写。
我尝试的其他方法是创建一个 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
上收到 "undefined identifier" 错误...whaaaa?
然后,我尝试使用 typename
变量,但显然这不是 C++ 中的事情。 (类似于 typename TYPE; ... TYPE = double; ... vector<TYPE> numbers;
)
然后出现了一个聪明的想法:编写一个模板化的 MAKE_VECTOR() 函数,returns 一个指向模板类型向量的指针,然后让它接受一个相同类型的参数指定矢量类型。这很难解释;这是代码:
// 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);
,但也没有类似的方法。
我没主意了。我该怎么办?
哇。那真是怪了。我只是再次尝试了方法#2,即 void 指针,它起作用了。卧槽,Visual Studio.