小编sym*_*nic的帖子

按常量id对自定义类型的矢量进行排序

我需要std::vector<Blah> v通过Blah的整数id 对自定义类型的向量进行排序.我这样做是因为std::sort(v.begin(), v.end())操作员<在内部过载Blah

bool operator< (const Blah& b) const { return (id < b.id); }
Run Code Online (Sandbox Code Playgroud)

我注意到Blah的私有id不能被声明为const int id,否则该类型Blah不符合要求std::sort(我认为它与不是ValueSwappable冲突?)

如果id不是const一切都很好.但是,我不喜欢对象没有常数id的想法只是为了在向量中重新排列它们的顺序.

有办法还是这样?

c++ sorting vector

7
推荐指数
1
解决办法
167
查看次数

重载的构造函数 - 具有bool参数的constructur具有优先权

我最近遇到了类似以下的课程

class Foo {
public:
    Foo(std::string msg) {}
private:
    Foo(bool b) {}
};
Run Code Online (Sandbox Code Playgroud)

我注意到试图通过创建这个类的对象

Foo foo("blah");
Run Code Online (Sandbox Code Playgroud)

导致编译错误,告知它Foo::Foo(bool)是私有的.显然,如果参数不是实际的std :: string,编译器更喜欢将构造函数与bool参数一起使用.另一方面,如果没有给出私有构造函数,上面的代码编译就好了.

为什么"-constructor bool"优先于string"-constructor"althogh传递的参数的类型不适合它们中的任何一个?这只是一个定义的问题,还是有更深层次的意义和一些好理由?

c++ overloading type-conversion

6
推荐指数
1
解决办法
203
查看次数

被破坏的C++对象的数据仍然可以访问?

在以下代码中,该getObj()函数返回对本地对象的引用.这显然是非常糟糕的,因为当函数返回时对象被破坏(ctor和dtor输出强调对象的生命周期).正如所料,编译器(gcc44)给出了相应的警告.

#include <iostream>

class Blah {

private:
    int a_;

public:
    Blah(int a) : a_(a) { std::cout << "Constructing...\n"; }
    ~Blah() { std::cout << "...Destructing\n"; }
    void print() { std::cout << a_ << "\n"; }
};

Blah& getObj() 
{
    Blah blah(3);
    return blah; // returning reference to local object
}

int main()
{
    Blah& b = getObj();
    b.print(); // why does this still output the correct value???

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是,调用print()明显被破坏的对象仍然会打印私有变量的正确值a_.这是输出:

构建......
...破坏
3

怎么会这样?我本来希望所有的对象数据都被销毁.

c++

1
推荐指数
1
解决办法
96
查看次数

标签 统计

c++ ×3

overloading ×1

sorting ×1

type-conversion ×1

vector ×1