确定C ++函数中的左值和右值

时间:2015-06-17 07:08:46

标签: c++

更新:我修改了一些地方,现在问题已经发生了某些变化。

我正在写一个C ++课程。像:

class qqq{
    map<int,int> core;
    //......
    int& operator[](int n){return core[n];};
};
int main(){
    qqq a;
    a[3]=7;a[5]=0;//Case a
    int b=a[3];//Case b
    return 0;
}

虽然案例A和案例B正在调用相同的函数(重载运算符),但案例a用作左值,而案例b用作右值。

出于某种原因,我希望如果将0传递给[5],则删除核心中的节点5。像:

int& operator[](int n){
    if(CASE A && THE VALUE PASSED TO IT IS 0)
        core.erase(core.find(n));
    else
        return core[n];
}

也许我的描述不准确。

4 个答案:

答案 0 :(得分:0)

您必须始终返回一个值,该值可用作赋值表达式中的左值。因此,我建议使用垃圾int变量。我将garbage声明为静态因为我们只需要这个变量的一个实例而我们不关心它的值。

例如,

 class qqq{
    static int garbage;
    map<int,int> core;
    //......

    int& operator[](int n){
        if(CASE A && THE VALUE PASSED TO IT IS 0)
            return garbage;
        else
            return core[n];
    }
};

但是,此解决方案在我看来令人困惑,因为行为完全根据您在方括号中指定的内容而更改。如果输入中传递的值不正确,我可能会抛出异常。

*编辑*

我认为您使用[]运算符使问题复杂化。您可以使用setter和getter轻松解决问题。例如:

int set(int index, int value){
    if( value == 0)
        core.erase(core.find(index));
    else
        return core[index];
}

int get(int index) {
 return core[index];
}

[]仅允许返回引用,您不知道赋值中使用的值是什么。

答案 1 :(得分:0)

以下是评论中提到的代理模式的实现。

就个人而言,我不使用它,我的地图包含在完全不提供operator[]的类中,而是有.get(key, default) .init(key),{{1}等功能等等,取决于班级。

.setdefault(key, default)

答案 2 :(得分:0)

正如评论所说,使用代理类。

<script type="text/javascript">
$(document).ready(function(){
  e.preventDefault();
  $("#bttn_<?php echo $rnt['id'];?>").click(function(){
     $("#myModal_<?php echo $rnt['id'];?>").modal('show');
  });
});
</script>

这应该有效,但5总会给你一个垃圾结果。

答案 3 :(得分:-1)

你的问题现在已经很清楚,遗憾的是你无法做到这一点就是C ++。 operator[]不是getter和setter:它只能返回一个引用,并且该引用仅用于仅仅是一个assignement。在操作员返回其参考时,您无法知道将用于分配的值,并且您几乎不知道如何使用参考。

恕我直言,你需要的更多:

int getCore(int i) {
    return core[i];
}

void setCore(int i, int newval) {
    if (newval == 0) {
        core.erase(core.find(i));
    }
    else {
        core[i] == newval;
}
相关问题