gpt4 book ai didi

c++ - 限制 Light 类实例化

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

我有一个开箱即用的类“Light”,但我知道 OpenGL 只允许有限数量的灯在任何时候处于事件状态。根据 glGetIntegerfv(GL_MAX_LIGHTS, ..),最大灯数为 8,因此无论是在编译时还是在运行时,我都应该只允许 Light 类最多实例化 8 次。

我尝试了一种尝试解决问题的方法:

int Light::sCounter = 0;

Light::Light() : // initialiser-list
{
sCounter++;

if (sCounter > getMaxLightCount())
// do something, but what?
}

其中 sCounter 是一个 static int 并且 getMaxLightCount() 调用上述 OpenGL 函数。如果计数器高于最大灯数,则应该发生一些事情;但我不知道该如何回应。我不能在构造函数中返回 NULL 或其他东西,但我一直在寻找异常来解决问题;尽管我通常不喜欢异常,因为它会使情况过于复杂。我也研究过实现 Manager 类,但这会使事情违反直觉,因为它实际上意味着用户不会调用 Light 类,而是调用其中的 Manager。

在限制 Light 类的实例化数量方面我有哪些选择,哪种解决方案可以有效地直观地重用?

最佳答案

如果不是太严格,您可以阻止Light 类的实例化,除非使用工厂。以下示例需要 C++11,但没有它也可以工作(尽管需要更多工作,使用 boost 等)。

即使下面的例子还不够,也许它能给你一些想法。

示例代码

#include <iostream>
#include <functional>
#include <memory>

class Light
{
public:
using Ptr = std::unique_ptr<Light, std::function<void (Light*)>>;

static void destroyLight(Ptr light)
{
// Do nothing, 'light' will be deleted when it falls out of scope
}

static Ptr createLight()
{
if (sInstanceCount < MAX_INSTANCE_COUNT)
{
++sInstanceCount;
return Ptr(new Light(), &Light::destroyLightImpl );
}
else
{
return Ptr();
}
}

private:
Light() {} // Prevent others from creating instances
~Light() {} // Prevent others from deleting instances

static void destroyLightImpl(Light* light)
{
delete light;
--sInstanceCount;
}

static const int MAX_INSTANCE_COUNT = 3;
static int sInstanceCount;
};

int Light::sInstanceCount = 0;

int main()
{
Light::Ptr light1 = Light::createLight();
Light::Ptr light2 = Light::createLight();
std::cout << light1.get() << "\n";
std::cout << light2.get() << "\n";

Light::Ptr light3 = Light::createLight();
Light::Ptr light4 = Light::createLight();
std::cout << light3.get() << "\n";
std::cout << light4.get() << "\n";

Light::destroyLight(std::move(light3));
Light::Ptr light5 = Light::createLight();
std::cout << light5.get() << "\n";

return 0;
}

示例输出

您可以在这里看到前 3 个实例化成功,但第 4 个没有。但是,第 5 个灯确实有效,因为第 3 个灯已被删除。

005872C0
005872F0
00587320
00000000
00587320

关于c++ - 限制 Light 类实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29416386/

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