我有方便的对象工厂模板,它按类型ID名称创建对象.实现非常明显:ObjectFactory包含从std::string对象创建者函数的映射.然后,所有要创建的对象都应在此工厂中注册.
我使用以下宏来做到这一点:
#define REGISTER_CLASS(className, interfaceName) \
class className; \
static RegisterClass<className, interfaceName> regInFactory##className; \
class className : public interfaceName
Run Code Online (Sandbox Code Playgroud)
这里RegisterClass是
template<class T, class I>
struct RegisterClass
{
RegisterClass()
{
ObjectFactory<I>::GetInstance().Register<T>();
}
};
Run Code Online (Sandbox Code Playgroud)
用法
class IFoo
{
public:
virtual Do() = 0;
virtual ~IFoo() {}
}
REGISTER_CLASS(Foo, IFoo)
{
virtual Do() { /* do something */ }
}
REGISTER_CLASS(Bar, IFoo)
{
virtual Do() { /* do something else */ }
}
Run Code Online (Sandbox Code Playgroud)
类在工厂中同时定义和注册.
问题是regInFactory...静态对象是在.h文件中定义的,因此它们将被添加到每个翻译单元中.同一个对象创建者将被多次注册,更重要的是,会有很多具有静态存储持续时间的冗余对象. …
"MagicFunction"的实现会如何使以下(nunit)测试通过?
public MagicFunction_Should_Prepend_Given_String_To_Each_Line()
{
var str = @"line1
line2
line3";
var result = MagicFunction(str, "-- ");
var expected = @"-- line1
-- line2
-- line3";
Assert.AreEqual(expected, result);
}
Run Code Online (Sandbox Code Playgroud) 是否可以仅使用C++编写完整的C++标准库(当然包括STL,但只包含内部依赖项)?我会想象容器和<cstdlib>功能将在以下方面可行charS,bitshifts,以及循环和其他字节花哨的东西,但这样的东西例外,或许std::cout并std::cin似乎很难给我一个不依赖开始.假设有一组可用的OS功能,它们完全在汇编中实现(以避免任何C污染).
我假设编译器理解从类和虚函数到模板和函数重载的所有内容,这些是语言级别的东西,并且在库IMHO中没有位置.
如果以前曾经问过这个问题或者是一个非常愚蠢的问题,请原谅我.我不打算在这里开始一场C < - > C++战争,只是想弄清楚实施野兽的局限性,比如标准库...
谢谢!
如何在Haskell中编写一个双端队列("deque").数据结构应该具有emptyDeque,front,back,removeFront,removeBack,addFront,addBack和isEmpty等函数,然后在 - >和< - 之间显示双端队列.
这是相同的,但对于一个队列:
module Queues (Queue, emptyQueue, front, remove, add, isEmpty)
newtype Queue a = Queue [a]
emptyQueue = Queue []
front (Queue (x:xs)) = x
front (Queue []) = error("No front of empty queue")
add (Queue xs) x = Queue (xs ++ [x])
remove (Queue (x:xs)) = Queue xs
remove (Queue []) = error("Nothing on queue to remove")
isEmpty (Queue []) = True
isEmpty (Queue (x:xs)) = False
showElems [] = ""
showElems (x:xs) = " …Run Code Online (Sandbox Code Playgroud) 我必须设计大约5个不同的课程.
这些类的许多部分将非常相似,但它们会有轻微的差异(当然).
如果我写了interface一个我设计的每个类都实现了,那么必须完全编写每个abstract方法interface.
如果我编写一个我的base每个设计类派生的类,那么每个类将自动在virtual我在base类中创建的方法中具有一些功能,但是它们都需要被覆盖,调用base功能,包含细微的差异.
有没有办法结合这些功能?我喜欢要求实现interface的方法,但我也喜欢设置由base类预先编程的功能.
我在这里和其他地方看过很多例子,但看起来并没有人像我所描述的那样.它甚至可能吗?
编辑:所以,鉴于此:
abstract class Base
{
virtual protected void OptionallyOverridable() {}
abstract protected void SubclassMustImplement();
}
Run Code Online (Sandbox Code Playgroud)
...有没有办法写出这样的东西:
abstract class Base2
{
DataEventType EventType;
DataChangedEventHandler OnDataChange;
virtual protected void OptionallyOverridable() {}
abstract protected void SubclassMustImplement() {
// values here are guaranteed
}
}
Run Code Online (Sandbox Code Playgroud) 如何创建自定义数组构造函数,它是本机Array构造函数的扩展版本?
例如,jQuery看起来像一个带有其他方法的数组,例如$().addClass.但是,它没有修改Array.prototype,因为new Array().hasClass是undefined.
那么,如何在不修改的情况下创建扩展数组实现Array.prototype呢?
Employees( ... ) //-> [{name: 'John', age: 32}, {name: 'Bob', age: 29}];
Employees( ... ).byAge(32)//-> [{name: 'John', age: 32}];
// and
Array().byAge //-> undefined
Run Code Online (Sandbox Code Playgroud) 我想自己实现二进制序列化,而不使用Boost或任何其他第三方库.
在C++中,实现它的最简单方法是使用ofstream然后通过网络发送二进制文件.但是有没有其他流类可以用作临时缓冲区以避免将文件写入磁盘?
另外,我怎样才能在纯C中实现这一目标?
由于在其他线程中完成了基准测试(参见/sf/answers/27833221/),因此可以看出Java 6中的instanceof实际上非常快.这是如何实现的?
我知道对于单继承,最快的想法是使用一些嵌套间隔编码,其中每个类维持[低,高]间隔,而instanceof只是间隔包含测试,即2个整数比较.但它是如何制作接口的(因为区间包含仅适用于单继承)?如何处理类加载?加载新的子类意味着必须调整很多间隔.
我正在尝试在我的程序的实现部分下初始化一个对象,因为我打算为多个方法使用相同的对象.我试图做到这一点我得到了一个错误,我只是想知道为什么.以下是一些示例:
@implementation Fraction {
NSString *test = [[NSString alloc] init];
}
Run Code Online (Sandbox Code Playgroud)
要么
@implementation Fraction {
int x = 0;
}
Run Code Online (Sandbox Code Playgroud)
虽然如果不初始化变量,它们可以正常工作而不会出现任何错误或警告.我确定这是代码的设计方式,但我只是好奇为什么.提前感谢您的回答!
我在这里运行一些代码.我试过了-40 % 3.它给了我输出2.当我在C中执行相同的操作时,我得到:
int i = (-40) % 3
printf("%d", i);
Run Code Online (Sandbox Code Playgroud)
输出是
-1
Run Code Online (Sandbox Code Playgroud)
两种语言如何在内部执行模运算?
implementation ×10
c++ ×3
c ×2
c# ×2
abstract ×1
allocation ×1
arrays ×1
binary ×1
class ×1
constructor ×1
deque ×1
haskell ×1
instanceof ×1
interface ×1
java ×1
javascript ×1
jvm ×1
math ×1
modulo ×1
objective-c ×1
overriding ×1
ruby ×1
string ×1
types ×1
visual-c++ ×1