用构造的结构对象填充向量的问题

问题描述 投票:-1回答:1

我正在使用ncurses实现我的餐饮哲学家问题版本,并遇到了初始化Fork对象的向量的问题。

#include <vector>
#include <mutex>
#include <ncurses.h>

...

struct Fork
{
    Fork(WINDOW *fork_window) : fork_window(fork_window) {}
    std::mutex m;
    WINDOW *fork_window;
};

std::vector<WINDOW *> fork_windows; // properly populated later
std::vector<Fork> forks;

...

for (int i = 0; i < num_of_phils; i++)
{
    forks.emplace_back(Fork(fork_windows[i]));
}

我想知道我的错误是什么(我没有现代C ++的经验)。是Fork中的初始化程序列表错误,还是std::mutex成员导致了问题?我以类似的方式成功地填充了另一个向量,但是另一个结构没有std::mutex成员,只有WINDOW *和三个ints

终端中的错误很长,并说:

error: use of deleted function ‘Fork::Fork(Fork&&)’, 

...

note: ‘Fork::Fork(Fork&&)’ is implicitly deleted because the default definition would be ill-formed:

这是我第一次看到这样的错误,并且由于没有在任何地方找到类似的情况而对其进行谷歌搜索也没有帮助。

c++ vector struct constructor initializer-list
1个回答
1
投票

就目前情况而言,您无法拥有std::vector<Fork>,因为std::mutex既不可复制也不可移动,并且这会隐式删除Fork的copy和move构造函数。

考虑使用std::vector<std::unique_ptr<Fork>>,而不是这样:

#include <vector>
#include <mutex>
#include <memory>
#include <ncurses.h>

...

struct Fork
{
    Fork(WINDOW *fork_window) : fork_window(fork_window) {}
    std::mutex m;
    WINDOW *fork_window;
};

std::vector<WINDOW *> fork_windows; // properly populated later
std::vector<std::unique_ptr <Fork>> forks;

...

for (int i = 0; i < num_of_phils; i++)
{
    forks.emplace_back(new Fork(fork_windows[i]));
}

如果您愿意,可以替换:

forks.emplace_back (new Fork (fork_windows [i]));

with:

forks.push_back (std::make_unique <Fork> (fork_windows [i]));

在很大程度上取决于样式。


编辑:

修复代码的另一种方法是像这样声明Fork

struct Fork
{
    Fork(WINDOW *fork_window) : fork_window(fork_window) {}
    std::unique_ptr <std::mutex> m = std::make_unique <std::mutex> ();
    WINDOW *fork_window;
};

现在Fork可移动(但不可复制)。

© www.soinside.com 2019 - 2024. All rights reserved.