gpt4 book ai didi

c++ - 编译 C++ 多对多类关系

转载 作者:搜寻专家 更新时间:2023-10-31 01:08:56 24 4
gpt4 key购买 nike

我想知道如何实现下面的设计。我没有努力遵循标准约定以将此虚拟代码保持在最低限度(例如,包括守卫)。出于争论的原因,我使用的是 C++03,并且仅使用标准库组件。

TL;DR:我的 Restaurant 之间存在循环依赖关系和 Recipe类。我有一个 std::set<>一个指向 Recipe 对象的指针在Restaurant类,反之亦然。我不能 #include一个在另一个,但由于前向声明,编译器不允许我为集合声明自定义比较器,如 value_type那时 s 仍然是不完整的类型。有办法实现吗?

我在代码中加入了注释,更详细地解释了我的问题。

/*
* restaurant.h
*/
#include <string>
#include <set>
/*
* I cannot do this as recipe.h would need to include
* restaurant.h, which restricts
* me when I want to write a custom comparator.
*/
// #include "recipe.h"

class Recipe;

// I know this will not work as Recipe has not yet been declared.
struct RecipeComparator {
bool operator() (const Recipe* lhs, const Recipe* rhs) {
return lhs->price() < rhs->price();
}
};

class Restaurant {
public:
Restaurant(const std::string& name, float averagePrice);
float averagePrice() { return m_averagePrice; }

private:
std::string m_name;
float m_averagePrice;
/*
* I want to have the recipies sorted by their prices.
* I cannot define RecipeComparator here as Restaurant
* is an incomplete type till now.
*/
std::set< Recipe*, RecipeComparator > m_recipiesSorted;

/*
* This works, but does not do what I want.
*/
std::set< Recipe* > m_recipies;
};

/*
* recipe.h
*/
#include <string>
#include <set>
/*
* I cannot do this as restaurant.h would need to include
* recipe.h, so I need to forward declare, which restricts
* me when I want to write a custom comparator.
*/
// #include "restaurant.h"

class Restaurant;

// I know this will not work as Restaurant has not yet been declared.
struct RestaurantComparator {
bool operator() (const Restaurant* lhs, const Restaurant* rhs) {
return lhs->averagePrice() < rhs->averagePrice();
}
};

class Recipe {
public:
Recipe(const std::string& name, float price);
float price() { return m_price; }

private:
std::string m_name;
float m_price;
/*
* This is what I want as I want to have the restaurants sorted
* by their average prices.
* I cannot define RestaurantComparator here as Restaurant
* is an incomplete type till now.
*/
std::set< Restaurant*, RestaurantComparator > m_restaurantsSorted;

/*
* This works, but does not do what I want.
*/
std::set< Restaurant* > m_restaurants;

};

最佳答案

一个想法是将您的 Comparator 定义移动到 .cpp 源,同时将声明保留在 header 中。这样,restaurant.hrecipe.h 仍将仅通过名称相互引用,因此前向声明仍然足够。

// restaurant_recipe_comparators.h
// probably too long, give it a better name
struct RestaurantComparator
{
bool operator() (const Restaurant *, const Restaurant *);
};

struct RecipeComparator
{
bool operator() (const Recipe *, const Recipe *);
};

// restaurant_recipe_comparators.cpp
bool RestaurantComparator::operator() (const Restaurant* lhs, const Restaurant* rhs)
{
return lhs->averagePrice() < rhs->averagePrice();
}


bool RecipeComparator::operator() (const Recipe* lhs, const Recipe* rhs)
{
return lhs->price() < rhs->price();
}

关于c++ - 编译 C++ 多对多类关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17518599/

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