草庐IT

function-centered

全部标签

C++多态/继承问题: Redefinition of base functions vs virtual functions

我知道派生类可以简单地“重新定义”基类成员函数,并且当派生类对象的函数是被调用,派生类中定义的函数被使用,但是......这不会使“virtual”关键字变得多余吗?我读过这两种情况之间存在一些明显的显着差异(即:如果你有一个指向派生类的基类指针,你调用一个函数,如果它是虚拟的,则派生类函数将是调用,但如果不调用,将调用基类函数)。换句话说,能够重新定义成员的目的是什么用作非虚拟函数,这是一个常用的练习?就我个人而言,这似乎会变得非常困惑。谢谢! 最佳答案 对于最常见的OOP语言(Java、SmallTalk、Python等),最常

c++ - 使用 std::function 和 std::bind 来存储回调和处理对象删除。

我想实现一个管理器,它使用C++11存储对多态类成员函数的回调。问题是我不确定如何处理成员所属的对象被删除或应该被删除的情况,我希望使界面尽可能简单。所以我想到了以下内容:将std::weak_ptr存储到对象,将std::function存储到成员。以下似乎有效:classMyBase{public:MyBase(){}virtual~MyBase(){}};//--------------------------------------------------classMyClass:publicMyBase{public:MyClass():MyBase(){}voidmyDou

c++ - 禁用 "bad function cast"警告

我收到以下警告:warning:convertingfrom'void(MyClass::*)(byte)'to'void(*)(byte)'这是因为我需要将成员函数而不是普通函数作为参数传递。但是程序运行正常。我想禁用此警告(Wno-bad-function-cast不适用于C++)或实现一种不同的方式来传递成员函数。 最佳答案 否。请认真对待此警告。您应该更改代码来处理这种情况。指向成员函数的指针(void(MyClass::*)(byte))和普通函数指针(void(*)(byte))是完全不同的。Seethislink.你不

c++ - 如何 : c++ Function Pointer with default values

我有:typedefvoid(*RespExtractor)(constcv::Mat&image,cv::Mat&resp);virtualvoidpredict_image(constcv::Mat&src,cv::Mat&img_detect,cv::Sizepatch_size,RespExtractor);voidcreate_hough_features(constcv::Mat&image,cv::Mat&resp,FeatureParams¶ms=FeatureParams());我将如何定义RespExtractor以接受具有默认参数的函数,这样我可以调用:p

c++ - 错误 C2280 : attempting to reference a deleted function

我是游戏开发的新手,也是C++的新手,但我已经开始开发一款打砖block小游戏。我以前让它运行过,但在重构(引入ArkanoidGame类)后它无法编译,我也不知道为什么。我得到的错误是:d:\dropbox\development\gamedev\c++\arkanoid\arkanoid\main.cpp(14):errorC2280:'ArkanoidGame::ArkanoidGame(void)':attemptingtoreferenceadeletedfunctiond:\dropbox\development\gamedev\c++\arkanoid\arkanoid\

c++ - 如何使用 std::function<void(void)> 调用方法

我正在尝试使用一种方法std::function作为输入。不幸的是,我以前从未使用过这种数据类型,而且我在理解它时遇到了问题。我需要做的就是在它被调用时说出执行一个方法,例如:std::functiondoThing=object.isMethod();虽然这个语法显然是不正确的。有人可以向我解释一下吗? 最佳答案 你可以bind方法的对象std::functiondoThing=std::bind(&type::isMethod,&object);或使用lambdastd::functiondoThing=[&]{object.i

C++ 虚函数 : Can the linker remove entries in the virtual function table which aren't called?

这个问题是对eliminateunusedvirtualfunctions的一种跟进,这对我的兴趣来说还不够深入。问题:在定义具有虚函数的类时,编译器为虚函数表分配存储空间,并在表中存储指向函数的指针。这会导致链接器保留这些函数的代码,而不管它们是否被调用过。这可能会导致大量死代码保留在可执行文件中,即使编译器优化设置要求消除死代码也是如此。现在,如果在可执行文件中没有任何地方有特定虚函数的调用(或者换句话说,访问虚函数表的相应槽),则可以从虚函数中省略相应的函数指针表,链接器将删除该函数的代码,并可能进一步省略其他未引用的代码。显然,这不能由编译器完成,因为只有在链接时才会清楚是否调

c++ - 重载 std::function 参数以匹配 lambda

这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Disambiguatingcallstofunctionstakingstd::functionsIsn'tthetemplateargument(thesignature)ofstd::functionpartofitstype?我想重载一个函数,以便可以使用各种不同的lambda自然地调用它(通常有更多或更少的参数)。我尝试过的显而易见的事情是:#include#includeexternvoidfn(std::function);externvoidfn(std::function);voidtest

c++ - 我可以在编译时检测到 "function arguments"是编译时常量吗

我可以在编译时检测“函数参数”1是否是编译时常量吗?例如,函数print(inti)如果调用print(5)可以打印"constant5"但是"non-constant5"如果作为print(i)调用,其中i是一些非常量变量。特别是,在“isconstant”分支中,我应该能够将i视为constexpr,包括将其用于模板参数等。宏技巧、模板元编程和SFINAE技巧都可以。理想情况下它是可移植的,但特定于编译器的解决方案总比没有好。如果存在“假阴性”也没关系-即,如果常量值有时被检测为非常量(例如,当某些优化被禁用时)。如果解决方案可以检测到常量值何时被间接传递给函数(例如,当常量值被传

c++ - Clang 与 MSVC : Treatment of template function prototypes

下面是一段测试代码,我分别用MSVC和Clang来对比编译结果。每个编译器的输出如下所示。MSVC假装未使用的模板声明甚至不存在。Clang产生错误。问题是,哪个编译器在这里最符合标准?我见过依赖MSVC行为的遗留生产代码,但我不确定它是否可以继续依赖。classS{structP{};};templateS::PBat(T);在MSVC10中干净地编译:E:\clangbuild\bin\Release>cl/c/nologotest.cpptest.cpp在Clang中产生错误:E:\clangbuild\bin\Release>clang++test.cpptest.cpp:9: