gpt4 book ai didi

c++ - 如何处理运行时在对象上定义的不同操作

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:07:53 24 4
gpt4 key购买 nike

我在项目中遇到了一些设计问题,希望得到一些帮助。我想出了一个例子,我认为它概述了我遇到的问题。我是软件设计的新手,如果我完全遗漏了什么,请原谅我。

在这个例子中说我有:

struct Book {
std::string author_first_name;
std::string author_last_name;
int year_published;
double price_in_dollars;
};

class BookCase {
std::vector<Book> all_books;
// Rest of class implementation
}

我从一个文件或多个文件中读取所有书籍并将它们存储在 BookCase 中。然后我想在运行时定义的 BookCase 上做一堆操作,这就是我卡住的地方。

假设用户想按作者排序然后导出,下次按名字排序,或按价格排序,或者想添加一个新操作可能删除 X 年之前出版的书籍。

我的问题是:

  1. 将这些操作放在什么地方最好。我可以轻松地将这些操作添加到 BookCase:

    class BookCase {

    void SortByLastNameAscending();
    void SortByLastNameDescending();
    void SortByPriceAscending();
    // etc...};

    我知道这是错误的,这会使类膨胀,每次添加新操作时都必须更改类。我可以拥有类似类甚至 namespace “BookCaseProcessor”的东西,它具有所有操作并在那里添加新操作。有没有更优雅的方式来处理这样的事情,也许是我所缺少的设计原则。

  2. 如何以一种很好的方式将操作串联起来。假设用户想要 RemoveBooksBeforeYear()、RemoveBooksThatCostLessThan()、SortByLastNameDescending()。下次他们运行时,他们只想做一件事,或者 10 件事。现在我能想到的唯一解决方案就是一堆 if 语句。

最佳答案

我认为最简单的方法是使用 std::function。

假定您像这样实现各种操作:

void SortByLastNameAscending(BookCase&) {...}
void SortByLastNameDescending(BookCase&) {...}
void SortByPriceAscending(BookCase&) {...}

您可以填充要执行的简单操作列表:

std::vector<std::function<void(BookCase&)>> pipeline;

//populate the pipeline
if(user_choice == "sort") {
pipeline.emplace_back(SortByLastNameAscending);
}

并依次执行:

BookCase data;
for(auto& op : pipeline) {
op(data);
}

关于c++ - 如何处理运行时在对象上定义的不同操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41701435/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com