草庐IT

虚拟空间

全部标签

c++ - 在 C++ 中将主体添加到纯虚拟/抽象函数?

纯虚函数不应该有主体,但我只是注意到编译器接受了以下代码:classfoo{virtualvoiddummy()=0{cout那么,为什么允许纯虚函数有函数体?另外,即使函数有主体,类仍然无法实例化,这是为什么? 最佳答案 纯虚函数可以有一个函数体,但您将它们声明为纯虚函数的事实恰恰表明派生实现是必需的。您可以从派生方法执行纯虚方法(使用显式BaseClass::method()),但您仍然必须提供一个实现。不能用未被覆盖的纯虚方法实例化一个类是纯虚声明的要点。换句话说,将方法声明为纯虚拟的想法是确保程序员不会忘记提供其实现。

c++ - 在不同的命名空间中测试特定的类名(SFINAE?)

假设我在不同的命名空间中有几个同名的类。namespaceA{classFoo{...};}namespaceB{classFoo{...};}namespaceC{classFoo{...};}如果类名为Foo,我想在编译时进行检测尽管命名空间。例如一些SFINAE类,templatestructis_Foo{staticconstboolvalue=/*somemagichere*/;};那我要is_Foo::value是真的,is_Foo::value是真的,is_Foo::value是假的。然后,我想使用is_Foo在static_assert或std::enable_if.可

c++ - 编译时消除虚拟表?

假设我有这个层次结构:classSuper{public:virtualvoidbar();};classSub:publicSuper{public:virtualvoidbar()override;};有没有办法让我在使用virtual关键字的情况下避免vtables?(好奇心)我读过一些关于编译器优化的文章,当对象在编译期间已知时,它会消除vtables,我不太确定,在谷歌上搜索了一段时间,但找不到任何答案,这是否意味着这些?Subsb;sb.bar();//avoidsvtable?Super&sr=sb;sr.bar();//avoidsvtable?Super*srp=&s

c++ - 后缀运算符重载中虚拟参数的用途? C++

重载后缀运算符时,我可以做一些简单的事情ClassFoo{private:intsomeBS;public://declarationofpre&postfix++Foooperator++();//restofclassnotshown};Prefix不需要带任何参数,所以当我定义它的时候,就像FooFoo::operator(){someBS++;return*this;}这对我来说非常有意义。当我去定义后缀重载时,我必须包含一个虚拟int参数FooFoo::operator++(int){Footemp=*this;someBS++;returntemp;}我的问题是为什么?我从

c++ - 您是否需要从所有派生类调用虚拟基类构造函数?即使它们不是最衍生的?

我在多重继承和菱形问题上遇到了麻烦。出现问题是因为我的基类构造函数需要一个参数。编译器尝试为我的两个抽象类生成默认构造函数,但失败了,因为默认构造函数无法确定基类的参数。我不明白为什么我的抽象类要调用基本构造函数。我认为最派生的类是调用虚拟基类构造函数的类。这是重现我所说内容的代码:classVirtualBase{public:VirtualBase(intinitial):count(initial){}intgetCount()const{returncount;}voidincrement(){count++;}private:intcount;};classContractA

C# 虚拟鼠标和键盘按键(三)【SendInput】

1.概述在前面两篇“C#虚拟键盘按键(一)【SendKeys】”和“C#虚拟键盘按键(二)【keybd_event】”文章中,我们讲了虚拟键盘按键的方法,它们只能虚拟键盘的按键操作,不能虚拟鼠标。本文介绍的WindowAPI的SendInput函数,不仅能虚拟键盘,而且还能虚拟鼠标,同时微软用它取代了我们第二文章中说的keybd_event方法,所以相对来说功能更加丰富和先进,并且我们也能更多地了解一些键盘和鼠标的结构体和一些Window消息。2.说明2.1下面代码需要用到的引用是:usingSystem;usingSystem.Runtime.InteropServices;usingSys

c++ - 为什么我们没有适用于所有类型(具有虚拟继承的类型除外)的 offsetof?

目前,offsetof仅适用于标准布局类型。但是,我一直不明白这个限制。当然,对于具有虚拟继承的类型,offsetof不起作用。但对于没有虚拟继承的类型,它可以。我知道,该标准允许非标准布局类型对每个实例具有不同的成员偏移量。但是,我从未听说过任何使用它的编译器实现。为什么它会做这样的事情?我所知道的所有编译器,对于没有虚拟继承的类型,成员的偏移量是编译时常量。那么问题是:是否有任何编译器,成员的偏移量不是编译时常量(对于没有虚拟继承的类型)?为什么委员会不放宽offsetof的要求?(我在stackoverflow这里看了很多相关的回答,也在各个地方讨论过这个问题,但是我还没找到原因

c++ - 如何解决两个不使用命名空间的第三方库之间的类名冲突?

我的项目使用了两个第三方开源库,两个库都定义了类型BDD,并且都没有使用命名空间。有没有办法解决名称冲突?也许强制一个库进入自定义命名空间?附加信息:第一个库仅使用BDD作为类型别名(typedefintBDD),因此它不会调用BDD上的任何方法。 最佳答案 由于您的一个库仅使用BDD作为int的别名(我假设这个库叫做lib1,另一个叫做lib2),你可以通过告诉预处理器在包含库之前重命名它来更改这个别名的名称,就像这样:#defineBDDBDD_lib1#include#undefBDD#include如果您需要使用名称BDD来

c++ - 在匿名命名空间中定义自定义相等运算符

我有一个C结构(在C头文件中),如下所示:structFoo{inta;intb;intc;};typedefstructFooFoo;我想测试这些结构的两个vector是否相等,因此我想为我的翻译单元为此结构定义一个自定义相等运算符。我可以这样做staticinlinebooloperator==(constFoo&,constFoo&){...}但不是namespace{booloperator==(constFoo&,constFoo&){...}}为什么std::vector的相等模板找不到这个运算符,有没有比在全局命名空间中扔一个静态内联更好的方法?

c++ - 我是不是遗漏了什么,或者虚拟电话的表现不如人们想象的那么糟糕

我一直在为嵌入式环境开发一个简单的框架。我做出了是使用虚拟调用、CRTP还是switch语句的设计决定。我听说vtables在嵌入式中表现不佳。从这个问题跟进vftableperformancepenaltyvs.switchstatement我决定进行自己的测试。我运行了三种不同的方式来调用成员函数。使用etl库的etl::function,一个旨在模仿STL库但用于嵌入式环境的库。(无动态分配)。使用将根据对象的intID调用对象的主switch语句使用对基类的纯虚拟调用我从来没有用基本的CRTP模式尝试过这个,但是etl::function应该是用于该模式的机制的变体。我在ARM