我不确定如何陈述我的问题,但我们走了......
所以,我有这个类operator[]
有一个空体(尚未实现)。但是,当我从main()
调用它时,它会产生一个输出。更重要的是,输出正是前一行中分配给它的输出。
EDIT
:我添加了一个名为emptyValue
的私有属性,并在类构造函数中将其初始化为TipVrijednosti()
。
以下是示例:
template<typename TipKljuca, typename TipVrijednosti>
class BinStabloMapa : public Mapa<TipKljuca, TipVrijednosti>
{
.
.
TipVrijednosti &operator[] (const TipKljuca &kljuc) {
return emptyValue;
}
const TipVrijednosti &operator[] (const TipKljuca &kljuc) const {
return emptyValue;
}
.
.
}
int main()
{
BinStabloMapa<int, int> m;
m[100] = 200;
cout << m[100] << endl;
return 0;
}
OUTPUT: 200
有人能告诉我为什么会这样吗?
答案 0 :(得分:8)
您有未定义的行为,因为您没有从具有非void
返回类型的函数返回任何内容。
§6.6.3:
离开函数末尾相当于没有值的返回;这会导致值返回函数中的未定义行为。
§1.3.24:
未定义的行为
本国际标准没有要求的行为
答案 1 :(得分:2)
不是一个很大的难题。您的operator []
正在返回对名为emptyValue
的某个数据变量的引用。
m[100] = 200;
等同于
m.emptyValue = 200;
然后你写 cout&lt;&lt;米[100];
就像
cout << m.emptyValue;
注意:索引'100'无关紧要。
答案 2 :(得分:0)
没有任何相关内容:
#include <iostream>
using namespace std;
template<typename TipKljuca, typename TipVrijednosti>
class BinStabloMapa /* : public Mapa<TipKljuca, TipVrijednosti> */
//comment inheritance to make it compile, not relevant to the problem
{
//C++11 syntax, not relevant either
TipVrijednosti emptyValue=TipVrijednosti();
public:
TipVrijednosti &operator[] (const TipKljuca &kljuc) {
return emptyValue;
}
const TipVrijednosti &operator[] (const TipKljuca &kljuc) const {
return emptyValue;
}
};
int main()
{
BinStabloMapa<int, int> m;
m[100] = 200; //calls no const operator[], thus emptyValue is changed
cout << m[100] << endl; //calls const operator[], thus emptyValue is return
return 0;
}