C++中的这一件事让我感到不舒服很长一段时间,因为我老实说不知道该怎么做,尽管听起来很简单:
目标:允许客户端使用工厂方法而不是对象的构造函数来实例化某个对象,而不会产生不可接受的后果和性能损失.
"工厂方法模式"是指对象内部的静态工厂方法或另一个类中定义的方法,或全局函数.通常只是"将类X的实例化的正常方式重定向到构造函数之外的任何其他位置的概念".
让我略过一些我想到过的可能答案.
这听起来不错(实际上通常是最好的解决方案),但不是一般的补救措施.首先,有些情况下,对象构造是一个复杂的任务,足以证明它被提取到另一个类.但即使将这个事实放在一边,即使对于仅使用构造函数的简单对象,通常也不会这样做.
我所知道的最简单的例子是2-D Vector类.这么简单,但很棘手.我希望能够从笛卡尔坐标和极坐标两者构造它.显然,我做不到:
struct Vec2 {
Vec2(float x, float y);
Vec2(float angle, float magnitude); // not a valid overload!
// ...
};
Run Code Online (Sandbox Code Playgroud)
我的自然思维方式是:
struct Vec2 {
static Vec2 fromLinear(float x, float y);
static Vec2 fromPolar(float angle, float magnitude);
// ...
};
Run Code Online (Sandbox Code Playgroud)
其中,而不是构造函数,导致我使用静态工厂方法...这实际上意味着我正在以某种方式实现工厂模式("类成为自己的工厂").这看起来不错(并且适合这种特殊情况),但在某些情况下失败,我将在第2点中描述.继续阅读.
另一种情况:试图通过某些API的两个opaque typedef(例如不相关域的GUID,或GUID和位域)重载,类型在语义上完全不同(所以 - 理论上 - 有效的重载)但实际上它们实际上是同样的事情 - 像无符号的int或void指针.
Java很简单,因为我们只有动态分配的对象.制造工厂同样简单:
class FooFactory {
public Foo createFooInSomeWay() {
// can be a static method as well,
// if we don't need the factory …
Run Code Online (Sandbox Code Playgroud) 我有以下方框:
构建和运行我的项目所需的编译器和硬件都只在机器B上.
我想使用Eclipse CDT从该项目的Windows框中"透明地"工作,并能够在IDE中远程构建,运行和调试项目.
我如何设置:
rsync
,然后调用远程makefile来启动实际构建?Eclipse托管构建是否具有此功能?由于GPU驱动程序供应商通常不愿意noiseX
在GLSL中实现,我正在寻找"图形随机化瑞士军刀"效用函数集,最好在GPU着色器中进行优化.我更喜欢GLSL,但任何语言代码都可以为我做,我可以将它自己翻译成GLSL.
具体来说,我希望:
a)伪随机函数 - 在[-1,1]或[0,1]上的N维,均匀分布,从M维种子计算出来(理想情况下是任何值,但我可以将种子限制在内比方说,0..1表示统一的结果分配).就像是:
float random (T seed);
vec2 random2 (T seed);
vec3 random3 (T seed);
vec4 random4 (T seed);
// T being either float, vec2, vec3, vec4 - ideally.
Run Code Online (Sandbox Code Playgroud)
b)像Perlin Noise这样的连续噪声 - 再次,N维,+ - 均匀分布,具有约束的值集合,并且看起来很好(配置外观像Perlin级别的一些选项也可能是有用的).我希望签名如下:
float noise (T coord, TT seed);
vec2 noise2 (T coord, TT seed);
// ...
Run Code Online (Sandbox Code Playgroud)
我不太关注随机数生成理论,所以我最急切地想要一个预先制定的解决方案,但我也很感激"这是一个非常好,高效的1D兰特()这些答案,让我解释一下你如何在它上面制作一个好的N维兰特()...".
我有以下ES6模块:
network.js
export function getDataFromServer() {
return ...
}
Run Code Online (Sandbox Code Playgroud)
widget.js
import { getDataFromServer } from 'network.js';
export class Widget() {
constructor() {
getDataFromServer("dataForWidget")
.then(data => this.render(data));
}
render() {
...
}
}
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种方法来测试Widget的模拟实例getDataFromServer
.如果我使用单独的<script>
s代替ES6模块,比如在Karma中,我可以编写我的测试:
describe("widget", function() {
it("should do stuff", function() {
let getDataFromServer = spyOn(window, "getDataFromServer").andReturn("mockData")
let widget = new Widget();
expect(getDataFromServer).toHaveBeenCalledWith("dataForWidget");
expect(otherStuff).toHaveHappened();
});
});
Run Code Online (Sandbox Code Playgroud)
但是,如果我在浏览器之外单独测试ES6模块(比如使用Mocha + babel),我会写一些类似于:
import { Widget } from 'widget.js';
describe("widget", function() {
it("should do stuff", function() {
let getDataFromServer = spyOn(?????) …
Run Code Online (Sandbox Code Playgroud) 普通的民间传说说:
类型系统存在是有原因的.整数和指针是不同的类型,它们之间的转换在大多数情况下是一种弊端,可能表示设计错误,应该避免.
即使执行了这样的强制转换,也不应该对整数和指针的大小做出任何假设(强制void*
转换int
是使代码在x64上失败的最简单方法),而不是int
应该使用intptr_t
或uintptr_t
来自stdint.h
.
知道什么时候执行这样的演员表真的有用吗?
(注意:可移植性价格的代码稍微短一点并不算"实际上有用".)
我知道一个案例:
更多的东西?
我正在寻找一种方法来轻松地将任何外部二进制数据嵌入到由GCC编译的C/C++应用程序中.
我想做的一个很好的例子就是处理着色器代码 - 我可以把它保存在源文件中,const char* shader = "source here";
但这是非常不切实际的.
我希望编译器为我做:在编译(链接阶段)时,读取文件"foo.bar"并将其内容链接到我的程序,以便我能够从内容中访问内容作为二进制数据码.
对于我想作为单个.exe文件分发的小型应用程序可能很有用.
GCC是否支持这样的事情?
我正在使用time.h
C中的文件来帮助我们处理时间/日期功能.
我碰到:
struct tm * _Cdecl localtime(const time_t *__timer);
Run Code Online (Sandbox Code Playgroud)
...似乎返回指向tm结构的指针.我发现按地址返回主要用于返回新的内存分配.
如果是这样,上面的返回实际上是如何工作的(a的返回地址struct tm
).返回的对象是在某处定义的吗?
谢谢
我很困惑如何在C++中以通用方式实现某些东西.这有点令人费解,所以让我一步一步解释.
考虑这样的代码:
void a(int) {
// do something
}
void b(int) {
// something else
}
void function1() {
a(123);
a(456);
}
void function2() {
b(123);
b(456);
}
void test() {
function1();
function2();
}
Run Code Online (Sandbox Code Playgroud)
很容易注意到function1
并function2
做同样的事情,唯一不同的部分是内部功能.
因此,我想制作function
通用的以避免代码冗余.我可以使用函数指针或模板来完成它.我现在就选择后者.我的想法是,它更好,因为编译器肯定能够内联函数 - 我是否正确?编译器是否可以通过函数指针进行内联调用?这是一个侧面问题.
好的,回到原点...带模板的解决方案:
void a(int) {
// do something
}
void b(int) {
// something else
}
template<void (*param)(int) >
void function() {
param(123);
param(456);
}
void test() {
function<a>();
function<b>();
}
Run Code Online (Sandbox Code Playgroud)
一切都好.但是我遇到了一个问题:我还可以做,如果a
和b …
关于静态多态性的概念我有些疑问,我有些时候会听到; 您可能主要在C++的上下文中解释它们,但我会欣赏适用的语言无关的答案(因此标记C++和语言不可知).
我们如何定义静态多态?作为一个例子,我相信,std::sort
因为它取决于由一些对象,其提供了一些接口上从C++函数应被视为静态多态性表现得像迭代器,并且提供迭代器的接口下确切行为可在编译时被确定.这是解释我们如何定义静态多态,或者它只是对特定案例的描述,还有更多内容吗?
在C++中使用静态多态的常见代码模式是什么?另外:SP 只能通过C++中的模板实现吗?
这是真的,一个给定的UML类图不直接描述多态性是如何处理的,因此,它可以被至少部分地或者静态地或者动态地执行?换句话说:静态与动态多态的选择是否独立于OOP模型,因此由实现者决定?
静态多态只是C++特定的并且与模板的工作方式有关吗?如果没有,它是否存在于C++以外的任何其他主流语言中?我们可以在Java,C#中拥有等效的静态多态性吗?任何东西,它会带来什么好处吗?
最重要的...... 使用静态多态性的实际好处是什么?我认为我们可以同意它降低了代码的灵活性; 有什么优点,除了 - 在C++的情况下 - 保存一个指针解除引用(虚函数/指针到函数/委托成本)?什么是静态多态性特别有用的问题类,是实现的正确选择?
c++ ×5
c ×4
pointers ×2
casting ×1
dry ×1
eclipse ×1
eclipse-cdt ×1
ecmascript-6 ×1
function ×1
gcc ×1
glsl ×1
idioms ×1
javascript ×1
mocha.js ×1
noise ×1
perlin-noise ×1
random ×1
resources ×1
shader ×1
ssh ×1
struct ×1
templates ×1
unit-testing ×1
vim ×1