c++ - 结构成员的长列表
问题描述
我有一个有很多成员的结构。我决定为我的结构编写一些函数,但是将所有成员作为参数输入到函数调用中感觉不对。有什么办法可以缩短这个吗?
items::items(std::string name_, std::string role_, uint16_t prize_, uint16_t phys_power_, uint16_t mag_power_,
uint16_t attack_speed_, uint16_t life_steal_, uint16_t flat_pen_, uint16_t perc_pen_, uint16_t crit_,
uint16_t phys_prot_, uint16_t mag_prot_, uint16_t cc_red_, uint16_t health_, uint16_t hp5_, uint16_t speed_,
uint16_t cd_red_, uint16_t mana_, uint16_t mp5_) {
name = name_;
role = role_;
prize = prize_;
phys_power = phys_power_;
mag_power = mag_power_;
attack_speed = attack_speed_;
life_steal = life_steal_;
flat_pen = flat_pen_;
perc_pen = perc_pen_;
crit = crit_;
phys_prot = phys_prot_;
mag_prot = mag_prot_;
cc_red = cc_red_;
health = health_;
hp5 = hp5_;
speed = speed_;
mana = mana_;
mp5 = mp5_;
}
void items::print_item(items s) {
std::cout << name << " " << role << " " << prize << " " << phys_power << " " << mag_power << " " << attack_speed << " " << life_steal << " " << flat_pen <<
" " << perc_pen << " " << crit << " " << phys_prot << " " << mag_prot << " " << cc_red << " " << health << " " << hp5 << " " << speed << " " << mana << " " <<
mp5 << std::endl;
}
解决方案
我们可以使用构建器模式解决您的问题。我们将有一个非常简单的 item 构造函数,它只将名称作为参数。我们将使用构建器模式构建其余属性。让我们从 ItemBuilder 和 Item 结构的前向声明开始。
struct ItemBuilder;
struct Item
{
Item (std::string name_):name (name_)
{
};
static ItemBuilder getBuilder(std::string name_);
std::string name;
std::string role;
uint16_t prize;
uint16_t phys_power;
uint16_t mag_power;
uint16_t attack_speed;
uint16_t life_steal;
uint16_t flat_pen;
uint16_t perc_pen;
uint16_t crit;
uint16_t phys_prot;
uint16_t mag_prot;
uint16_t cc_red;
uint16_t health;
uint16_t hp5;
uint16_t speed;
uint16_t cd_red;
uint16_t mana;
uint16_t mp5;
};
现在让我们编写我们的 ItemBuilder。
struct ItemBuilder
{
private:
Item m_item;
public:
ItemBuilder (std::string name_):m_item (name_)
{
}
operator Item () const
{
return std::move (m_item);
};
ItemBuilder & role (std::string role_)
{
m_item.role;
return *this;
};
ItemBuilder & prize (uint16_t prize_)
{
m_item.prize = prize_;
return *this;
};
ItemBuilder & phys_pow (uint16_t phys_power_)
{
m_item.phys_power = phys_power_;
return *this;
};
ItemBuilder & mag_power (uint16_t mag_power_)
{
m_item.mag_power = mag_power_;
return *this;
};
ItemBuilder & attack_speed (uint16_t attack_speed_)
{
m_item.attack_speed = attack_speed_;
return *this;
};
ItemBuilder & life_steal (uint16_t life_steal_)
{
m_item.life_steal = life_steal_;
return *this;
};
ItemBuilder & flat_pen (uint16_t flat_pen_)
{
m_item.flat_pen = flat_pen_;
return *this;
};
};
最后,我们不应该忘记Item::getBuilder
ItemBuilder Item::getBuilder(std::string name_) { return ItemBuilder (name_); }
int
main ()
{
auto builder = Item::getBuilder("any");
Item it = builder.role("mage").phys_pow(1).attack_speed(2).mag_power(100);
std::cout << it.name << " " << it.phys_power << " " << it.attack_speed << " " << it.mag_power;
return 0;
}
有用的链接:
推荐阅读
- python - 用一行代码从两个单独的列表生成一个新列表
- reactjs - 将 react 集成到现有的 html 管理面板中
- c# - 统一刚体
- php - woocommerce 变量产品以百分比和价格显示 NaN 0
- firebase - React-native Firebase Firestore - NSException raise:format:arguments
- angular - Angular - 将功能模块拆分为不同的文件
- jackson-databind - 杰克逊对象映射器如何将对象序列化为具有嵌套对象的字符串?
- firebase - Firebase-Admin 验证 ID 令牌时出错
- c# - .net 中用于 SOAP 请求的异步 Web 方法
- oracle - 根据表中的现有值插入行号