gpt4 book ai didi

c++ - 循环遍历 C++ 类的对象

转载 作者:行者123 更新时间:2023-11-30 03:19:39 24 4
gpt4 key购买 nike

所以我有一个包含 120 个对象的类,每个对象都有相同的成员变量。像这样:

Area f1;Area f2; Area f3; Area f4; Area f5; Area f6; [...]

f1.SetCoal(1);
f2.SetCoal(0.7); f2.SetCoal(.3);
f3.SetCoal(.5950); f3.SetCopper(0.2833); f3.SetIron(0.0917); f3.SetAmber(0.025); f3.SetGold(0.005);
f4.SetCoal(.5425); f4.SetCopper(0.325); f4.SetIron(0.1025); f4.SetAmber(0.0225); f4.SetGold(0.0075);
f5.SetCoal(.49); f5.SetCopper(0.3667); f5.SetIron(0.1133); f5.SetAmber(0.02); f5.SetGold(0.01);
f6.SetCoal(.4375); f6.SetCopper(0.4083); f6.SetIron(0.1242); f6.SetAmber(0.0175); f6.SetGold(0.0125); [...]

因此,其中一些区域通过用户输入“激活”,将成员变量设置为 TRUE。是否可以遍历所有对象并检查它们是否处于事件状态?

for (int i = 0; i <= 119; i++)
{

if(f(i).active == true)
//do stuff
}

代替

if(f1.active) //do stuff
if(f2.active) //do stuff
if(f3.active) //do stuff

最佳答案

您可以为所有区域创建一个 std::vector 并使用初始化列表用它们的起始值初始化它们。然后您可以使用基于范围的 for 循环遍历它们。

#include <vector>

class Area {
double m_coal;
double m_copper;
double m_iron;
double m_amber;
double m_gold;

bool m_active;
public:
Area(double coal, double copper, double iron, double amber, double gold) :
m_coal(coal), m_copper(copper), m_iron(iron), m_amber(amber), m_gold(gold), m_active(false)
{}
bool is_active() const { return m_active; }
};

int main() {
// initialize all areas
std::vector<Area> areas = {
{1., 0., 0., 0., 0.},
{0.7, 0., 0., 0., 0.},
{.5950, 0.2833, 0.0917, 0.025, 0.005}
};

for (auto& area : areas) {
if (area.is_active()) {
// do stuff
}
}
}

如果您想更进一步,您可以将资源放在 std::array 中,从而更轻松地处理您的资源。有一天您可能想要扩展资源列表,如果它们在所有地方都被硬编码,那将会非常耗时。更温和的方法可能是这样的:

#include <iostream>
#include <initializer_list>
#include <array>
#include <vector>

// append to the list when you invent a new resource
enum Resource : size_t { coal, copper, iron, amber, gold, LAST=gold, COUNT=LAST+1 };

class Area {
std::array<double, Resource::COUNT> m_resources;
bool m_active;
public:

Area(std::initializer_list<double> il) :
m_resources(),
m_active(false)
{
std::copy(il.begin(), il.end(), m_resources.begin());
}

double get(Resource x) const { return m_resources[x]; }
void set(Resource x, double value) { m_resources[x]=value; }
void add(Resource x, double value) { m_resources[x]+=value; }

void set_active() { m_active=true; }
void set_inactive() { m_active=false; }
bool is_active() const { return m_active; }
};

int main() {
// initialize all areas
std::vector<Area> areas = {
{1.},
{0.7},
{.5950, 0.2833, 0.0917, 0.025, 0.005},
{.1232, 0.3400, 0.0000, 0.234, 0.001}
};

areas[0].set_active(); // just for testing
for (auto& area : areas) {
if (area.is_active()) {
// do stuff
std::cout << "coal before: " << area.get(coal) << "\n";
area.add(coal, -0.1);
std::cout << "coal after : " << area.get(coal) << "\n";
}
}
}

关于c++ - 循环遍历 C++ 类的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53500155/

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