首页 > 解决方案 > 结构成员的长列表

问题描述

我有一个有很多成员的结构。我决定为我的结构编写一些函数,但是将所有成员作为参数输入到函数调用中感觉不对。有什么办法可以缩短这个吗?

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;    
}

标签: c++functionstructrepeat

解决方案


我们可以使用构建器模式解决您的问题。我们将有一个非常简单的 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;
}

运行代码


有用的链接:


推荐阅读