我有
struct IMyInterface
{
virtual method1() = 0;
virtual method2() = 0;
};
Run Code Online (Sandbox Code Playgroud)
海湾合作委员会坚持认为我有
struct IMyInterface
{
virtual method1() = 0;
virtual method2() = 0;
virtual ~IMyInterface(){};
};
Run Code Online (Sandbox Code Playgroud)
我不明白为什么.纯接口就是接口(duh).析构函数是接口的具体实现者的内部实现细节的一部分; 它不构成界面的一部分.我理解整个切片问题(或者至少我认为我这样做)
所以我的问题是 - GCC是否有权坚持它,如果是这样,为什么呢?
我真的不喜欢类的函数的整体实现(用 C++ 说)。在那种语言中,我可以随心所欲地拆分事物;在 Rust 中,对于文件中的内容有严格的规则。
impl对于一个结构,我有大约 2000 行(没有评论/文档)。从逻辑上讲,它们可以分解为不同的集合;用于管理方面 A 的功能,用于管理方面 B 的功能,......它们都在struct大数据上浪费时间,因此struct进一步切碎无济于事。
我在一个答案中看到你可以拥有
// in thing.rs
struct Thing{
.......
}
impl Thing{
fn1
fn2
}
Run Code Online (Sandbox Code Playgroud)
// in more_thing.rs
use crate::thing::*;
impl Thing{
fn3,
fn4
}
Run Code Online (Sandbox Code Playgroud)
// in lib.rs
mod thing;
mod more_thing;
Run Code Online (Sandbox Code Playgroud)
这几乎有效(我很惊讶它完全有效)。它是一种中途的房子。问题是,对于 more_thing.rs 中的方法,我必须声明Thingall的字段pub。这是可行的,但不是很好。还有其他选择吗?
我知道我可以限制pub范围,但它仍然破坏了封装。
我有一组cpp文件,我想直接编译成二进制文件,并编译成共享库.
我有
bin_PROGRAMS=mybin
lib_LTLIBRARIES=libmylib.la
COMMON_SOURCES=f1.cpp f2.cpp f3.cpp
mybin_SOURCES=main.cpp $(COMMON_SOURCES)
libmylib_la_SOURCES=$(COMMON_SOURCES)
Run Code Online (Sandbox Code Playgroud)
当我运行它时,cpp文件被编译两次,一次使用libtool,一次没有,有时libtool/automake抱怨
Makefile.am: object `f1.$(OBJEXT)' created both with libtool and without`
Run Code Online (Sandbox Code Playgroud)
我尝试将COMMON_SOURCES放入.a文件中,但是当我将.a与.la链接时,libtool会抱怨(说它不可移植).
我需要的是类似的东西
bin_LTPROGRAMS=mybin
Run Code Online (Sandbox Code Playgroud)
但那并不存在
编辑:澄清 - 我正在使用automake/autoconf.我上面展示的是我的automake Makefile.am的内容
我有一个具有cdecl回调的ac库.我如何从c#中使用这些.
一切似乎都说他们必须是stdcall回调
要清楚:
delegate int del();
[dllimport("mylib.dll",CallingConvention=CallingConvention.Cdecl)]
public static extern int funcwithcallback(del foo);
Run Code Online (Sandbox Code Playgroud)
其中del必须被称为cdecl-wise
function x(){
window.setTimeout(function(){
foo();
if(notDone()){
x();
};
},1000);
}
Run Code Online (Sandbox Code Playgroud)
我担心无限制的堆栈增长.我认为这不是递归,因为定时器中的x()调用会导致基于JS引擎中的新调度的全新堆栈帧集.
但是把代码看成是一个老式的非JS人,这让我感到不安
一个额外的问题,如果我安排了某些事情(基于数学而不是文字)会导致没有延迟会发生什么.是执行还是立即执行异步,或者是实现定义
在我的 .razor 文件中,我有这些标签(只是一个示例)。它们有效,但我无法向自己解释各种语法背后的原因
<HxButton Text=@StartButtonText OnClick="StartClick" Color="ThemeColor.Primary"/>
<Listener @ref=_listener/>
<button @onclick=Show>Modal</button>
Run Code Online (Sandbox Code Playgroud)
具体来说
我讨厌每次都随机循环语法来找到有效的语法。
注意,HxButton来自HAVIT组件库,Listener是我构建在HAVIT HxModal之上的组件
module foo/bar.pm
package foo::bar;
stuff
stuff
package foo::wizzy;
require Exporter;
our @ISA=qw(Exporter);
our @EXPORT=qw(x);
use constant
{
x=>1
};
Run Code Online (Sandbox Code Playgroud)
这样做的消费者
use Foo::bar;
Run Code Online (Sandbox Code Playgroud)
没有得到foo::wizzy::x出口
我知道我可以把它分成两个独立的模块,但我仍然可以做到这一点,不是吗?
我有
function Foo($a, $b)
{
$o = @{}
$o.A = $a
$o.B = $b
$post = @{}
$post.X="x"
$post.entity =$o
$newton::SerializeObject($post)
}
Run Code Online (Sandbox Code Playgroud)
然后做
foo "a" "b"
Run Code Online (Sandbox Code Playgroud)
我明白了
Exception calling "SerializeObject" with "1" argument(s): "Self referencing loop detected for property 'Value' with type 'System.Management.Automation.PSParameterizedProperty'. Path 'entity.Members[0]'."
Run Code Online (Sandbox Code Playgroud)
然而
function Foo2($o)
{
$post = @{}
$post.X="x"
$post.entity =$o
$newton::SerializeObject($post)
}
foo2 @{a="a"; b="b"}
Run Code Online (Sandbox Code Playgroud)
工作良好.也
function foo3($a, $b)
{
$o = @{}
$o.A = $a
$o.B = $b
$newton::SerializeObject($o)
}
foo3 "a" "b"
Run Code Online (Sandbox Code Playgroud)
工作,但 …
我发现我经常使用这种模式。
Arc<Mutex<dyn SomeTrait + Send>>;
Run Code Online (Sandbox Code Playgroud)
所以我想我会这样做:
pub type NicePtr<T> = Arc<Mutex<dyn T + Send>>;
Run Code Online (Sandbox Code Playgroud)
但这不能编译
Compiling rsim v0.1.0 (C:\work\pdp\rsim)
error[E0404]: expected trait, found type parameter `T`
--> src\common.rs:9:37
|
9 | pub type NicePtr<T> = Arc<Mutex<dyn T + Send>>;
| ^ not a trait
Run Code Online (Sandbox Code Playgroud)
我认为这是可能的,但我只是不知道正确的语法。
我有
public void Foo(string name, params object[] args)
Run Code Online (Sandbox Code Playgroud)
我想用一个可以变化的args列表来调用它.我需要做点什么
Foo("yo",a,b,x==42?c);
Run Code Online (Sandbox Code Playgroud)
即如果x是42则传入a,b,c否则传入a,b.当然,这种语法不起作用.我知道我可以将args编组到List并将列表传递给函数,但是这样做组织代码的方式会非常混乱.那么我可以使用一些语法魔法
编辑:让我添加具体案例
var xml = new XDocument(....,
new XElement(....),
new XElement(....),
new XElement(....),
x==42? new XElement(.....),
new XElement(....),
new XElement(....)
....
Run Code Online (Sandbox Code Playgroud)