2014-07-16 56 views
0

是否有可能重载一个运算符返回一个字符串而不是类类型?重载操作符返回类型

string operator++() { 
    index++; 
    if (index > num_atts) { 
     index = 0; 
    } 

    string ret = att_names[index]; 
    return ret; 

} 
+3

您有[未定义的行为](http://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-accessed-outside-its-scope)。返回一个'std :: string'。 – chris

+0

您可以返回任何你喜欢的类型。但是,您的上述代码表现出未定义的行为。 –

+0

为什么你认为这是不可能的?你可以回报你想要的任何东西。还有heed @ chris的评论 – EdChum

回答

0

您可以返回任何您喜欢的类型,就像您编写的任何其他函数一样。但是就像任何其他函数一样,你不能返回一个指向即将超出范围的本地堆栈变量的指针,这是未定义的行为。要解决这个问题,最简单的事情就是简单地返回string,是这样的:

std::string operator++() { 
    // ... 
    return ret; 
} 
+0

谢谢,纠正之后我发布了这个问题:) – manatttta

1

该代码对语法没有错误。但是,它在语义上有至关重要的错误。

const char *operator++() { 
    index++; 
    if (index > num_atts) { 
     index = 0; 
    } 

    string ret = att_names[index]; // 1 
    return ret.c_str();   // 2 & 3 
}         // 4 
  1. ret对象被创建
  2. 你叫ret.c_str()ret对象为您制作C字符串,并将其返回。
  3. 现在,您正试图返回c字符串。
  4. 但是在这个时候,ret被销毁,并且它也销毁c字符串,因为该c字符串的所有者是ret
  5. 因此,现在你正在返回指针破坏
+2

准确地说,“指向被破坏的对象”。 – Greg