0

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

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

3 回答 3

2

如果您不熟悉编程,请使用大括号。这些变量在本地范围内。

if (m == "interior")         
{                                              
        int* tmp = this->interior;
}
....
tmp is out of scope..
于 2013-01-29T01:49:20.850 回答
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;                                                 
    }
}        
于 2013-01-29T01:51:21.293 回答
2

您的代码存在一些问题。

您正在通过指针传递一个字符串(写入const char []与写入完全相同const char *- 顺便说一句,const是左关联的,您也可以编写它char const *)。

void backgrnd::print(const char m[]){

无论如何,在下一行中,您将此指针m与引用字符串文字常量的指针进行比较"interior"

    if (m == "interior")

不是您最可能想到的。此操作比较指针的值而不是字符串!如果您传递给函数的指针是相同的字符串字面量,那么指针只会比较相等,"interior"这种情况不太可能发生。如果它只是任何其他字符串,即使它也包含字符序列interior,它也不会比较相等。如果编译器和/或链接器没有将冗余字符串文字编辑为单个指针常量,也会发生这种情况。

当然,其他指针 - 字符串文字比较也会遇到同样的问题。

现在下一个问题是,您创建了一个作用域指针变量tmp,您使用一些相同类型的实例类成员指针变量对其进行初始化。但是一旦离开范围,该变量就不再可见......

        int* tmp = this->interior;                                             
    else if (m == "fB")                                                        
        float* tmp = this->fB;

...而这个 for 循环再也看不到它了。现在这个循环本身就有问题,因为不清楚是什么n_vox意思。

    for (int i=0; i < this->n_vox; ++i)

我猜你写上面是为了节省下面的一些代码重复。问题是:C++ 是一种静态类型的语言,所以下面的语句不能“动态”类型为tmp变量的类型。

        cout << tmp[i] << ' ';                                                 
}

这里有一些建议:

使用 C++ 时,您应该使用std::string而不是裸字符数组。这也使相等运算符==执行您天真的期望的操作。如果您坚持使用 C 风格的 char 数组,请使用字符串比较函数,例如strncmp.

由于无论如何您都需要编写静态类型cout<<的语句,因此将该循环移动到if子句中。使用花括号将它们括起来!.

于 2013-01-29T02:10:22.667 回答