2012-11-18 50 views
0
class foo{ 

public: 
    int a, b, c; 
    double val; 

    foo(int a){ 
     ... 
    } 

... 
} 

运营商现在我想做的事:重载[]在C++ STL地图

map <foo*, double> mymap; 

foo fa(2); 
foo fb(4); 

mymap[fa] = 1.0; 
mymap[fb] = 2.0; 

显然,我得到的[]是未定义Foo类型的错误。但是,我该如何重载这个操作符?就此而言,我如何获得指向foo的指针?因为我假设它没有定义,因为foo是一个自定义类

+0

“我如何获得指针”应该是C++教科书或课程材料的一部分。 “为什么我需要一个指针”是一个完全不同的问题:-) –

回答

1

没有必要在这里加载任何东西。您的地图期望指向foo,因此您需要将指针传递给foo。您可以修复你的代码是这样的:

mymap[&fa] = 1.0; 
mymap[&fb] = 2.0; 

当心你必须绝对确保foo对象将生活,只要或大于地图长,否则后者将结束与悬摆指针。举例来说,这可能会流下眼泪:

map <foo*, double> mymap; 

{ 
    foo fa(2); 
    foo fb(4); 
    mymap[&fa] = 1.0; 
    mymap[&fb] = 2.0; 
} // fa and fb cease to exist 

// state of mymap is messed up here. 
+2

然而,通过引用操作符插入指向本地对象的指针通常是一个非常糟糕的主意。顺便说一句,我知道地图是在相同的范围内的对象,所以它不应该是一个问题,但如果用法改变它真的需要考虑 – emartel

+0

@emartel地图和'foos'在相同的范围内,所以它是相当安全的。 – juanchopanza

+2

是的,这就是为什么我编辑我的评论,指出我知道这一点,但如果OP没有意识到,他知道 – emartel

3

关键必须是foo*。所以,你需要这样写:

mymap[&fa] = 1.0; 
mymap[&fb] = 2.0; 

但请记住,如果fafb是本地对象,那么当你从函数返回,他们将被销毁。所以你不应该返回函数mymap,因为一旦函数返回,用作键的对象就不存在了。

0

保持和使用指向地图内某些本地对象的指针可能是extemely危险。首先,当对象超出范围时,您可能会通过取消引用std::map键来使应用程序崩溃。此外,它真的很难使用,并且在大多数情况下不是程序员的意图。你的情况:

auto it = mymap.find(&foo(2)) 

不会编译:

foo fc(2); 
auto it = mymap.find(&fc); 

将找不到容器内任意值(fa具有相同的价值,但不同的指针)。它真的是你想要的吗?

这就是为什么我会建议重新定义您的std::mapstd::map<foo, double> mymap;这将保持和比较foo的价值。要使其工作,您需要执行foo::operator<()或提供您自己的求解算法作为模板参数std::map。第一种情况如下:

class foo { 
    int a, b, c; 
    double val; 
public: 
    foo(int a) {} 
    bool operator<(const foo &other) const 
    { return a < other.a && b < other.b && c < other.c; } 
}; 


int main() 
{ 
    std::map<foo, double> mymap; 

    foo fa(2); 
    foo fb(4); 

    mymap[fa] = 1.0; 
    mymap[fb] = 2.0; 

    auto it = mymap.find(foo(2)); 
}