- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试实现一个模型 (gfx) 类,但我似乎找不到适合它的设计。
我有的是:[伪代码]
class Material {
public:
virtual void SetPerFrameInfo(void* pData)=0;
//[...]
}
class SpecificMaterial : public Material {
public:
void SetPerFrameInfo(void* pData);
//[...]
}
void SpecificMaterial::SetPerFrameInfo(void* pData) {
ThisMaterialPerFrameInfoStruct* pInfo = (ThisMaterialPerFrameInfoStruct*)pData;
//[...]
}
class Model {
public:
Model(Material* pMaterial){m_pMatirial = pMaterial;}
void Draw();
private:
Material* m_pMaterial
//[...]
}
void Model::Draw() {
PerFrameInformation info;
m_pMaterial->SetPerFrameInfo(&info);
}
使用方法:
Material* pMaterial = new SpecificMaterial();
Model someModel(pMaterial);
如您所见,我有两个主要问题:
1) 传递给SetPerFrameInfo()的struct类型取决于实际素材,应该怎么填写?
2) 模型类可能需要一些其他数据成员,具体取决于实际 Material ,因为对于某些 Material ,我可能决定实现计时器,而对于某些 Material ,我可能不会。在所有 Material 的模型类中拥有数据成员将是一种内存浪费。
请帮忙,我似乎找不到任何合适的设计模式。
最佳答案
1.) 我认为您遇到的问题是因为试图在基类中放置太多内容。由于模型在调用 SetPerFrameInfo 函数时需要知道它使用的是什么特定 Material 类型,为什么不只为每个 Material 派生类提供其自己的 Set..() 函数,该函数采用正确的类型而不是 void*?因为 Material 基类无法与其每帧信息进行交互(它是 void*),那么为什么要将其泛化到基类中?
2.) 只需将特定于 Material 的数据成员放入派生的 Material 类中。我假设每个 Material 实例都对应一个唯一的模型,因此模型的特定于 Material 的信息应该在其 Material 派生类中。
好吧,我误解了两个类之间的关系。基本上,在理想情况下,您需要一组不知道模型细节的 Material 类,以及一组可以使用任何 Material 但不知道 Material 细节的模型。因此,您可能希望将粗糙 Material 实例应用于六个不同的模型。
我不认为有任何问题,如果每个 Material 实例由多个模型共享并且每个模型实例对不同的 Material 一无所知,则需要第三个每个模型对象来存储计时器或任何实例数据绘图所需。因此,每个模型都会收到自己的 AppliedMaterial 对象,该对象指向共享的 Material 实例以及将 Material 应用于该模型所需的数据成员。每种 Material 类型都必须有不同的 AppliedMaterial 子类,存储与每种 Material 相关的数据值。使用第三个上下文对象的示例:
struct GlossMaterialContext
{
Timer t;
int someContextValue;
};
class GlossMaterial : Material
{
void * NewApplicator() { return new GlossMaterialContext; }
void FreeApplicator(void *applicator) { delete (GlossMaterialContext*)applicator; }
void ApplyMaterial(void *applicator)
{
// Set up shader...
// Apply texture...
}
};
class 3DModel
{
Material *material;
void *materialContext;
void SetMaterial(Material *m)
{
material = m;
materialContext = m->NewApplicator();
}
void Draw()
{
material->ApplyMaterial(materialContext);
}
};
这不是一种非常干净的技术。我总觉得处理 void* 指针是一件麻烦事。您还可以让第三个上下文对象基于一个类,例如:
class AppliedGlossMaterial : AppliedMaterial
和:
class GlossMaterial : Material
{
AppliedMaterial * NewApplicator() { return new AppliedGlossMaterial; }
...
如果数据成员同时依赖于模型类型和 Material 类型,那么您的模型和 Material 的耦合度太高,以至于无法将它们放入相互之间不了解的单独类中。您必须创建模型的子类:Glossy3DModel、Rough3DModel 等。
关于c++ - 这种情况下合适的设计模式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8858294/
假设我正在使用 segues 转换 View Controller 。我在 View Controller 1 上有一个 textField,在第二个 View Controller 上有一个标签。当
在下面的代码中,当我在表中插入数据时,回滚的目的是什么,如果我想回滚,我不应该插入它,那么使用回滚的合适方法是什么? BEGIN TRANSACTION Insert into dimCustomr
我一直在阅读一些帖子,并想知道是否有人可以介绍 TrieMap 何时比使用 HashMap 更可取的情况。 那么本质上是什么架构决策应该激励使用 TrieMap? 最佳答案 根据文档。 它是可以在多线
什么时候 do-while 比其他类型的循环更好?有哪些常见场景比其他场景更好? 我了解 do-while 的功能,但不了解何时使用它。 最佳答案 当您需要至少完成一次某事,但不知道启动循环之前的次数
fileExistsAtPath 的文档如下: Attempting to predicate behavior based on the current state of the file syst
当 XCode 分析我的代码时,它发现了潜在的内存泄漏。我使用 ARC,但我了解到 ARC 不处理 C 类型。因为我使用 CGImageRef 来创建 UIImage 并分配给 UIImageView
我有一个每天更新一次的大型数据集。我正在缓存对该数据进行昂贵查询的结果,但我想每天更新该缓存。我正在考虑使用 CacheItemRemovedCallback 每天重新加载我的缓存,但我有以下问题:
我了解 IoC 容器是什么,并且一直在阅读结构图。该技术似乎很容易使用。我的问题是,使用 IoC 容器的适当粒度级别是多少? 我看到以下可能的 IoC 应用级别: 打破所有对象之间的所有依赖关系——当
我用 Java 编写了一个应用程序。我从数据库中获取一个表(客户端),其中包含以下字段: 名称 |姓氏 |地址 在我的应用中存储这些数据的最佳解决方案是什么?我应该为每个客户端创建一个对象并将这些对象
这个问题在这里已经有了答案: Use of 'prototype' vs. 'this' in JavaScript? (16 个答案) 关闭 8 年前。 function A() { this
我已经试验了一段时间 asyncio 并阅读了 PEPs ;一些教程;甚至是 O'Reilly book 。 我想我已经掌握了窍门,但我仍然对 loop.close() 的行为感到困惑,我不太清楚何时
它是否正确,因为在 Windows 中并没有说它不好或不推荐。 例如像这样: int APIENTRY _tWinMain(HINSTANCE hInstance,
我在更新我的网站时遇到问题,谷歌搜索结果显示指向旧页面的链接,这些链接现在是 404,其中一些甚至包含已弃用的内容。 我的问题是关于 301 的使用。旧页面具有深层嵌套页面,如下例所示: ww
我使用 JUnit 和 FEST 对我们的应用程序进行 Swing 集成测试,我在测试用例中多次启动和停止。 @after 是否应该包含对 robot.cleanUp() 的调用? 最佳答案 一般规则
我是一名从未真正使用过 .dll 文件的程序员。当然,当我需要第 3 方软件时,例如图形库、帮助我创建图形的库等。我会将引用/ddl 文件添加到我的程序中并在我的代码中使用它们。 此外,您似乎可以将
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我目前正在尝试更多地利用 kotlin 协程。但我面临一个问题:在这些协程中使用 moshi 或 okhttp 时,我收到警告: “不适当的阻塞方法调用” 解决这些问题的最佳方法是什么?我真的不想不合
我有点不确定什么时候适合使用 Html.RenderAction() 来渲染我的 View ,什么时候不适合。我的理解是,因为它不是 ASP.NET MVC 的“官方”组件,所以使用它是不好的做法,它
假设你想开发你的 Controller ,以便你使用 ViewModel 来包含你渲染的 View 的数据,所有数据都应该包含在 ViewModel 中吗?什么条件下可以绕过 ViewModel? 我
您何时考虑在 .NET 中创建用户控件?您是否有一些基本标准来从页面中排除您的代码并引入新的用户控件? 通常我倾向于遵循这些来决定我是否需要用户控件: 当使用单独的用户控件使页面看起来更具可读性时 当
我是一名优秀的程序员,十分优秀!