【问题标题】:constructor overloading creating confusion构造函数重载造成混乱
【发布时间】:2017-09-08 12:26:09
【问题描述】:
#include<bits/stdc++.h>
#define mpq pair<int,Query>
using namespace std;

class Query{
    public:
    int a1,a2,b1,b2,c1,c2,d,l,r;
    Query(){}
    Query(int a1,int a2,int b1,int b2,int c1,int c2,int d,int l,int r){
        this->a1=a1; this->a2=a2;
        this->b1=b1; this->b2=b2;
        this->c1=c1; this->c2=c2;
        this->d=d; this->l=l; this->r=r;
        print();
    }
    Query(int d,int l,int r){
        Query(0,1,0,1,0,1,d,l,r);
    }

    void print(){
        cout<<d<<" "<<l<<" "<<r<<endl;
    }
};

map<int,Query> query;
int main(){
    query.insert(mpq(1,Query(0,1,0,1,0,1,1,1,1)));
    query[1].print();
    cout<<endl;

    query[4]=Query(4,4,4);//not working properly
    query[4].print();//giving output of query[1].print
    cout<<endl;

    query[2]=Query(0,1,0,1,0,1,2,2,2);
    query[2].print();

}

我无法解释这段代码的输出 query[4].print() 给出了意外的输出

我期待输出是

4 4 4

但它正在给予

1 1 1

作为输出

【问题讨论】:

  • 如果 typedef 更适合用例,则不要在 c++ 中使用 #define:typedef std::pair mpg;
  • 这段代码的前三行都是不好的做法。没有名为“bits/stdc++.h”的标准头文件;像这样的文本宏是等待发生的事故(使用typedef);而using namespace std; 迟早会咬你(使用std::cout)。当我在做的时候,你真的需要std::endl 做的额外的东西吗? '\n' 结束一行。

标签: c++ dictionary constructor std stdmap


【解决方案1】:

这里的问题是

Query(int d,int l,int r){
    Query(0,1,0,1,0,1,d,l,r);
}

什么都不做。 Query(0,1,0,1,0,1,d,l,r); 创建一个临时的Query 然后销毁它。我认为您打算使用委托构造函数,这看起来像

Query(int d,int l,int r) : Query(0,1,0,1,0,1,d,l,r) {}

【讨论】:

    猜你喜欢
    • 2018-08-11
    • 2014-01-26
    • 1970-01-01
    • 2017-04-06
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 2021-07-24
    • 2011-07-30
    相关资源
    最近更新 更多