这段代码有问题吗?

查看 84|回复 7
作者:sbldehanhan   
#include [i]
#include
#include
#include
#include
class MyClass {
public:
    MyClass(int num_conds) : conds_(num_conds), mutexes_(num_conds) {
    }
private:
    std::vector conds_;
    std::vector mutexes_;
};
int main() {
    int num_conds = 5;
    MyClass my_class(num_conds);
    return 0;
}
我的目的是想在类初始化时根据传入的参数设置条件变量容器 cons_和互斥锁容器 mutexes_的大小,并向其中添加对应数量的元素。但是 c++的条件变量不支持拷贝复制,所以不能 push_back 。
这是 newbing 给的一段代码,能编译能跑,请问对吗?

num_conds, include, std, myclass

crissx   
GPT4 这样说的:
你的目标是在类初始化时根据传入的参数设置 conds_和 mutexes_的大小。目前的代码确实做到了这一点。
但你提到了关于 std::condition_variable 不支持拷贝构造的问题,这确实是一个问题。然而,你的当前代码不会触发这个问题,因为你在初始化列表中使用了构造函数直接设置了其大小,而没有使用 push_back 。
具体来说,这里:
MyClass(int num_conds) : conds_(num_conds), mutexes_(num_conds) {
}
你用的是 std::vector 的"fill constructor",它会创建指定数量的默认初始化的元素。在这种情况下,不涉及拷贝或移动。
总结,你的代码是可以编译和运行的,并且它按预期工作。不过,你确实要注意不要试图拷贝 std::condition_variable ,因为它确实不支持拷贝操作。如果需要移动这些对象,那么你可以考虑使用 std::vector>这样的结构,但在当前的代码和需求下,你不需要这么做。
sheyueji   
push_back()除了支持拷贝构造外,还支持传递右值引用,就像楼上说的,你可以传递智能指针向 std::vector>中添加元素
sbldehanhan
OP
  
@crissx #1 牛啊。说的好详细啊。
sbldehanhan
OP
  
@sheyueji #2 那我也需要有条件变量的实例。我就是要在初始化时根据参数指定的数量创建条件变量的个数。
cnbatch   
除了 push_back ,还有 emplace_back 吧
如果以后需要动态添加的话,就 emplace_back
sheyueji   
@sbldehanhan 没理解你什么意思,你在构造函数里创建对应数量的实例不就行了
ysc3839   
看上去没问题,不支持拷贝的对象在 vector 中也可以构造时一次性初始化。
您需要登录后才可以回帖 登录 | 立即注册

返回顶部