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

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

Fork

我想知道我的错误是什么(我不是现代C ++的经验者)。 #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])); } 中的初始化程序列表是否错误,或者Fork成员导致问题?我以类似的方式成功地填充了另一个向量,但是另一个结构没有std::mutex成员,只有std::mutex和三个WINDOW *

终端中的错误很长,并显示:

ints

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

zilan112 回答:用构造的结构对象填充向量时出现问题

就目前情况而言,您无法拥有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]));

具有:

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是可移动的(但不可复制)。

本文链接:https://www.f2er.com/2593757.html

大家都在问