我一直在研究和测试一个基于这里描述的自我注册的抽象工厂:
在我的所有测试用例中,它都像魅力一样工作,并提供我想要的功能和重用.
使用cmake在我的项目中链接这个工厂一直很棘手(尽管它似乎更像是一个问题).
我有相同的base.hpp,derivedb.hpp/cpp和一个等效的deriveda.hpp/cpp链接的示例.在main中,我只是实例化工厂并调用createInstance()两次,每次使用"DerivedA"和"DerivedB".
该行创建的可执行文件:
g++ -o testFactory main.cpp derivedb.o deriveda.o
Run Code Online (Sandbox Code Playgroud)
按预期工作.将我的派生类移动到一个库中(使用cmake,但我也单独用ar测试过它),然后链接失败:
ar cr libbase.a deriveda.o derivedb.o
g++ -o testFactory libbase.a main.cpp
Run Code Online (Sandbox Code Playgroud)
只调用第一个静态实例化(来自derivedA.cpp)而从不调用第二个静态实例化,即
// deriveda.cpp (if listed first in the "ar" line, this gets called)
DerivedRegister<DerivedA> DerivedA::reg("DerivedA");
// derivedb.cpp (if listed second in the "ar" line, this does not get called)
DerivedRegister<DerivedB> DerivedB::reg("DerivedB");
Run Code Online (Sandbox Code Playgroud)
请注意,在ar行中交换两个调用仅调用derivedb.cpp静态实例化,而不调用deriveda.cpp实例化.
我是否遗漏了一些使用ar或静态库的东西,这些库在某种程度上与C++中的静态变量不相称?
以下是无效的Python:
def myInvalidFun(kw arg zero=6):
pass
Run Code Online (Sandbox Code Playgroud)
以下是有效的Python:
def myValidFun(**kwargs):
if kwargs.has_key("kw arg zero"):
pass
Run Code Online (Sandbox Code Playgroud)
myValidFun然而,打电话是很棘手的。例如,以下几种方法不起作用:
myValidFun(kw arg zero=6) # SyntaxError: invalid syntax
myValidFun("kw arg zero"=6) # SyntaxError: keyword can't be an expression
kwargs = dict("kw arg zero"=6) # SyntaxError: keyword can't be an expression
myValidFun(**kwargs)
Run Code Online (Sandbox Code Playgroud)
(也许与最后两个错误相同的错误暗示了幕后发生的情况?)但是,这确实有效:
kwargs = {"kw arg zero": 6}
myValidFun(**kwargs)
Run Code Online (Sandbox Code Playgroud)
myValidFun("kw arg zero"=6)鉴于创建字典的 {:} 语法,是否有特别无效的 原因?
(更多背景:我有一个很像字典的类,只是进行了大量的验证,并且__init__使用字典的条目构建一个容器,但不是字典......它实际上是一个 XML ElementTree,它在某些方面类似于列表,而在其他方面则类似于字典。该__init__方法必须采用“我的第一个元素”和“my_first_element”之类的键,并将它们视为不同的事物。类和__init__**kwargs 一起工作正常,但初始化我的类是我的示例形式的多行代码,它确实有效,而且似乎可以更简单。)
编辑:我理解标识符的概念,我的无效代码是为了说明这一点。我想我的问题应该改写为:
为什么以下内容有效?:
myValidFun(**{"invalid identifier":6})
Run Code Online (Sandbox Code Playgroud)