小编pm1*_*100的帖子

纯抽象基类上的虚拟析构函数

我有

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++ virtual-destructor

10
推荐指数
1
解决办法
5806
查看次数

如何将大型 impl 拆分为多个文件?

我真的不喜欢类的函数的整体实现(用 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范围,但它仍然破坏了封装。

rust

10
推荐指数
2
解决办法
1024
查看次数

如何使用libtool创建二进制文件和.so

我有一组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的内容

c++ automake autoconf gcc libtool

9
推荐指数
2
解决办法
9340
查看次数

如何使用pinvoke使用cdecl回调

我有一个具有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

c# pinvoke callback

9
推荐指数
1
解决办法
7861
查看次数

这是递归还是没有

function x(){
  window.setTimeout(function(){
     foo();
     if(notDone()){ 
        x();
     };
  },1000);
}
Run Code Online (Sandbox Code Playgroud)

我担心无限制的堆栈增长.我认为这不是递归,因为定时器中的x()调用会导致基于JS引擎中的新调度的全新堆栈帧集.

但是把代码看成是一个老式的非JS人,这让我感到不安

一个额外的问题,如果我安排了某些事情(基于数学而不是文字)会导致没有延迟会发生什么.是执行还是立即执行异步,或者是实现定义

javascript recursion

9
推荐指数
1
解决办法
549
查看次数

有人可以解释 Blazor 组件标签的各种语法吗

在我的 .razor 文件中,我有这些标签(只是一个示例)。它们有效,但我无法向自己解释各种语法背后的原因

<HxButton Text=@StartButtonText OnClick="StartClick" Color="ThemeColor.Primary"/>
        
<Listener @ref=_listener/>
    
<button  @onclick=Show>Modal</button>
Run Code Online (Sandbox Code Playgroud)

具体来说

  • 为什么有些标签的名称开头有 @(例如 ref 和 onclick),而其他标签则没有。
  • 为什么 ThemeColor.Primary 在引号中而不是 StartButtonText
  • 为什么 StartButtonText 有一个 @ 符号
  • 为什么按钮的 @onclick 具有纯文本(而不是 @Show 或“Show”)

我讨厌每次都随机循环语法来找到有效的语法。

注意,HxButton来自HAVIT组件库,Listener是我构建在HAVIT HxModal之上的组件

blazor

8
推荐指数
2
解决办法
1201
查看次数

perl:从具有> 1个包的模块导出符号

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出口

我知道我可以把它分成两个独立的模块,但我仍然可以做到这一点,不是吗?

perl

7
推荐指数
3
解决办法
572
查看次数

奇怪的使用newtonsoft json.net与powershell

我有

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)

工作,但 …

powershell json.net

7
推荐指数
2
解决办法
2542
查看次数

如何创建包含特征的泛型类型

我发现我经常使用这种模式。

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)

我认为这是可能的,但我只是不知道正确的语法。

rust

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

如何为函数设置条件参数参数

我有

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)

c# params

6
推荐指数
1
解决办法
2805
查看次数