小编Eth*_*oon的帖子

连接一个自我注册的抽象工厂

我一直在研究和测试一个基于这里描述的自我注册的抽象工厂:

/sf/answers/40771951/

在我的所有测试用例中,它都像魅力一样工作,并提供我想要的功能和重用.

使用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++中的静态变量不相称?

c++ g++ cmake unix-ar

7
推荐指数
1
解决办法
1718
查看次数

功能:**kwargs 允许不正确命名的变量

以下是无效的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)

python python-2.x

5
推荐指数
1
解决办法
3316
查看次数

标签 统计

c++ ×1

cmake ×1

g++ ×1

python ×1

python-2.x ×1

unix-ar ×1