更新对象引用的值

Update the value of object reference

我有一个功能如下。我试图通过使用 dir = Directory(path); 将对象引用的值更改为新对象,但出现如下编译错误。有什么建议吗?这也是一个很好的方法吗?

Error C2280 'Directory &Directory::operator =(const Directory &)': attempting to reference a deleted function

class Directory
{
public:
    const fs::path path;
    Directory *parent;
    std::vector<Directory *> sub_dir;
    std::vector<File *> files;

    Directory(const fs::path path, Directory *parent = NULL);
    double const deltaBase = .001;

    Directory(const Directory&) = default;
    Directory& operator=(const Directory&) = default;

    std::string getDirName(void);
};

void create_imgui_window(ImGui::FileBrowser *fileDialog, const char *label, char path[MAX_PATH_LENGTH], Directory &dir)
{
    // (optional) set browser properties
    fileDialog->SetTitle("Browse");

    ImGui::Begin(label);
    IMGUI_LEFT_LABEL(ImGui::InputText, "Path", path, MAX_PATH_LENGTH);
    if (ImGui::IsItemHovered() && path[0])
        ImGui::SetTooltip(path);
    ImGui::SameLine();
    if (ImGui::Button("Browse"))
        fileDialog->Open();

    create_directory_tree(dir);

    ImGui::End();

    fileDialog->Display();

    if (fileDialog->HasSelected())
    {
        strcpy_s(path, MAX_PATH_LENGTH, fileDialog->GetSelected().string().c_str());
        std::cout << "Selected directory: " << path << std::endl;
    
        dir = Directory(path);

        fileDialog->ClearSelected();
    }
}

最终答案:删除 fs::path path;

上的常量
class Directory
{
public:
    fs::path path;
    Directory *parent;
    std::vector<Directory *> sub_dir;
    std::vector<File *> files;

    Directory(const fs::path path, Directory *parent = NULL);

    Directory& operator=(const Directory&) = default;

    std::string getDirName(void);
};

您要求隐式定义您的复制赋值运算符:

Directory& operator=(const Directory&) = default;

同时你有 const 个数据成员:

const fs::path path; // Consider omitting the const here
const double deltaBase = .001; // Seems like a candidate for a static member

合成的(隐式定义)复制赋值运算符defined as deleted如果class有一个数据成员是const 或引用 (或者如果 class 有一个数据成员,该成员本身有一个已删除或不可访问的复制赋值运算符).

考虑两种方法:

  • const path 数据成员,以及 deltaBase 不是每个 Directory 实例中的 const
  • create_imgui_window 函数变为 return 一个 Directory,而不是修改一个。