小编Kos*_*Kos的帖子

如何正确实现C++中的工厂方法模式

C++中的这一件事让我感到不舒服很长一段时间,因为我老实说不知道该怎么做,尽管听起来很简单:

如何正确地在C++中实现Factory方法?

目标:允许客户端使用工厂方法而不是对象的构造函数来实例化某个对象,而不会产生不可接受的后果和性能损失.

"工厂方法模式"是指对象内部的静态工厂方法或另一个类中定义的方法,或全局函数.通常只是"将类X的实例化的正常方式重定向到构造函数之外的任何其他位置的概念".

让我略过一些我想到过的可能答案.


0)不要制造工厂,制造建造者.

这听起来不错(实际上通常是最好的解决方案),但不是一般的补救措施.首先,有些情况下,对象构造是一个复杂的任务,足以证明它被提取到另一个类.但即使将这个事实放在一边,即使对于仅使用构造函数的简单对象,通常也不会这样做.

我所知道的最简单的例子是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指针.


1)Java方式

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)

c++ design-patterns idioms factory-method

309
推荐指数
7
解决办法
16万
查看次数

通过SSH使用Eclipse处理远程项目

我有以下方框:

  1. 带有Eclipse CDT的Windows框,
  2. 一个Linux机器,只能通过SSH访问我.

构建和运行我的项目所需的编译器和硬件都只在机器B上.

我想使用Eclipse CDT从该项目的Windows框中"透明地"工作,并能够在IDE中远程构建,运行和调试项目.

我如何设置:

  • 大楼会起作用吗?任何比编写本地makefile更简单的解决方案rsync,然后调用远程makefile来启动实际构建?Eclipse托管构建是否具有此功能?
  • 调试会有效吗?
  • 最好 - Eclipse CDT代码索引可以工作吗?我是否必须将所有必需的头文件从机器B复制到机器A并将它们手动添加到包含路径?

c eclipse ssh remote-debugging eclipse-cdt

186
推荐指数
4
解决办法
17万
查看次数

Vim:关闭所有缓冲但是这一个

如何关闭Vim中除我正在编辑的缓冲区之外的所有缓冲区?

vim

177
推荐指数
12
解决办法
5万
查看次数

GLSL的随机/噪声功能

由于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维兰特()...".

random shader glsl noise perlin-noise

167
推荐指数
8
解决办法
15万
查看次数

如何模拟ES6模块的导入?

我有以下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)

javascript unit-testing mocha.js ecmascript-6

133
推荐指数
4
解决办法
5万
查看次数

什么时候整数< - >指针转换实际上是正确的?

普通的民间传说说:

  • 类型系统存在是有原因的.整数和指针是不同的类型,它们之间的转换在大多数情况下是一种弊端,可能表示设计错误,应该避免.

  • 即使执行了这样的强制转换,也不应该对整数和指针的大小做出任何假设(强制void*转换int是使代码在x64上失败的最简单方法),而不是int应该使用intptr_tuintptr_t来自stdint.h.

知道什么时候执行这样的演员表真的有用吗?

(注意:可移植性价格的代码稍微短一点并不算"实际上有用".)


我知道一个案例:

  • 一些无锁多处理器算法利用了2 +字节对齐指针具有一定冗余的事实.然后,他们使用指针的最低位作为布尔标志.利用具有适当指令集的处理器,这可以消除对锁定机制的需要(如果指针和布尔标志是分开的,则需要锁定机制).
    (注意:甚至可以通过java.util.concurrent.atomic.AtomicMarkableReference在Java中安全地执行此操作)

更多的东西?

c c++ pointers casting

77
推荐指数
6
解决办法
6654
查看次数

使用GCC在可执行文件中嵌入资源

我正在寻找一种方法来轻松地将任何外部二进制数据嵌入到由GCC编译的C/C++应用程序中.

我想做的一个很好的例子就是处理着色器代码 - 我可以把它保存在源文件中,const char* shader = "source here";但这是非常不切实际的.

我希望编译器为我做:在编译(链接阶段)时,读取文件"foo.bar"并将其内容链接到我的程序,以便我能够从内容中访问内容作为二进制数据码.

对于我想作为单个.exe文件分发的小型应用程序可能很有用.

GCC是否支持这样的事情?

c c++ resources gcc embedded-resource

49
推荐指数
4
解决办法
2万
查看次数

如何在C中分配localtime的结果结构?

我正在使用time.hC中的文件来帮助我们处理时间/日期功能.

我碰到:

struct tm * _Cdecl localtime(const time_t *__timer);
Run Code Online (Sandbox Code Playgroud)

...似乎返回指向tm结构的指针.我发现按地址返回主要用于返回新的内存分配.

如果是这样,上面的返回实际上是如何工作的(a的返回地址struct tm).返回的对象是在某处定义的吗?

谢谢

c struct pointers function

36
推荐指数
3
解决办法
1万
查看次数

模板函数作为模板参数

我很困惑如何在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)

很容易注意到function1function2做同样的事情,唯一不同的部分是内部功能.

因此,我想制作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)

一切都好.但是我遇到了一个问题:我还可以做,如果ab …

c++ templates dry generic-programming

31
推荐指数
2
解决办法
1万
查看次数

静态多态定义和实现

关于静态多态性的概念我有些疑问,我有些时候会听到; 您可能主要在C++的上下文中解释它们,但我会欣赏适用的语言无关的答案(因此标记C++和语言不可知).

  1. 我们如何定义静态多态?作为一个例子,我相信,std::sort因为它取决于由一些对象,其提供了一些接口上从C++函数应被视为静态多态性表现得像迭代器,并且提供迭代器的接口下确切行为可在编译时被确定.这是解释我们如何定义静态多态,或者它只是对特定案例的描述,还有更多内容吗?

  2. 在C++中使用静态多态的常见代码模式是什么?另外:SP 只能通过C++中的模板实现吗?

  3. 这是真的,一个给定的UML类图不直接描述多态性是如何处理的,因此,它可以被至少部分地或者静态地或者动态地执行?换句话说:静态与动态多态的选择是否独立于OOP模型,因此由实现者决定?

  4. 静态多态只是C++特定的并且与模板的工作方式有关吗?如果没有,它是否存在于C++以外的任何其他主流语言中?我们可以在Java,C#中拥有等效的静态多态性吗?任何东西,它会带来什么好处吗?

  5. 最重要的...... 使用静态多态性的实际好处是什么?我认为我们可以同意它降低了代码的灵活性; 有什么优点,除了 - 在C++的情况下 - 保存一个指针解除引用(虚函数/指针到函数/委托成本)?什么是静态多态性特别有用的问题类,是实现的正确选择?

c++ language-agnostic design-patterns static-polymorphism

28
推荐指数
2
解决办法
2万
查看次数