c ++指针未声明

时间:2013-01-29 01:48:05

标签: c++ pointers

我正在编写一个类的成员函数,我想根据传递给成员函数的字符串名称打印出一些动态分配的数组。以下代码以某种方式获得编译错误:

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] << ' ';                                                 
}         

3 个答案:

答案 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<<子句中。 使用花括号将它们括起来!