我正在编写一个类的成员函数,我想根据传递给成员函数的字符串名称打印出一些动态分配的数组。以下代码以某种方式获得编译错误:
error: 'tmp' was not declared in this scope
我该怎么做编码?我的代码有什么问题?
void backgrnd::print(const char m[]){
if (m == "interior")
int* tmp = this->interior;
else if (m == "fB")
float* tmp = this->fB;
for (int i=0;i<this->n_vox;++i)
cout << tmp[i] << ' ';
}
答案 0 :(得分:2)
如果您不熟悉编程,请使用大括号..这些变量位于本地范围内。
if (m == "interior")
{
int* tmp = this->interior;
}
....
tmp is out of scope..
答案 1 :(得分:2)
tmp
变量仅在if / else范围内,for loop
中不可用。
但是,我建议使用更好的打印功能:
void backgrnd::print(const std::string& m)
{
if (m == "interior")
{
std::cout << *interior << std::endl;
}
else if (m == "fB")
{
std::cout <<fB << std::endl;
}
}
答案 2 :(得分:2)
您的代码存在一些问题。
你是通过指针传递一个字符串(写const char []
与写const char *
完全相同 - 顺便说一句,const
是左关联的,你可以把它写成{{1}也是)。
char const *
无论如何,在下一行中,您将此指针void backgrnd::print(const char m[]){
与指向字符串文字常量m
的指针进行比较
"interior"
而这不你最有可能的想法。此操作比较指针的值而不是字符串!如果传递给函数的指针是相同字符串文字 if (m == "interior")
的指针,那么指针只会比较为相等,这种情况非常不可能。如果它只是任何其他字符串,即使它也包含字符序列"interior"
,它也不会比较相等。如果编译器和/或链接器没有将冗余字符串文字编译成单个指针常量,也会发生这种情况。
当然,其他指针 - 字符串文字比较也会遇到同样的问题。
现在接下来的问题是,您创建了一个范围指针变量interior
,您可以使用相同类型的某个实例类成员指针变量进行初始化。但只要保留范围,变量就不再可见了......
tmp
...而且这个for循环再也看不到了。现在这个循环本身就存在问题,因为它不清楚 int* tmp = this->interior;
else if (m == "fB")
float* tmp = this->fB;
的含义。
n_vox
我猜你上面写的是为了节省一些代码重复。问题是:C ++是一种静态类型语言,因此以下语句不能“动态”键入 for (int i=0; i < this->n_vox; ++i)
变量的类型。
tmp
以下是一些建议:
使用C ++时,应使用 std :: string 而不是裸字符数组。这也使等于运算符 cout << tmp[i] << ' ';
}
做你天真的预期。如果你坚持使用C风格的char数组,请使用像==
这样的字符串比较函数。
因为无论如何都需要编写静态类型的strncmp
语句,所以将该循环移到cout<<
子句中。 使用花括号将它们括起来!。