草庐IT

c++ - 基类的未定义模板参数

我很确定我已经在SO的某处阅读了编译器无法处理这段代码的原因,但是,经过几个小时的搜索,我仍然找不到它。相关代码如下:#includetemplateclassbase{};classderived:base{public:structmyStruct{};};intmain(){return0;}问题是解析器首先尝试生成base解析前的特化derived,因此,我收到此错误:“错误C2065:‘myStruct’:未声明的标识符”。作为一个愚蠢的把戏,我注意到如果我预先声明structmyStruct;,VS2010会停止提示。就在classderived之上.在我看来,myStru

c++ - 为什么虚基多重继承只调用基类默认构造函数?

这个问题在这里已经有了答案:c++virtualinheritance(3个答案)关闭9年前。在多重继承中,我有一个虚拟的Base类,它被类A和类B继承。A和B是AB的基类。请看下面的代码。在A和B的构造函数中,调用了Base(string)构造函数。我期待得到以下输出:Base::Base(std::string)A::A()B::B()但我得到以下输出:Base::Base()A::A()B::B()为什么要调用Base的默认构造函数?#include#includeusingnamespacestd;classBase{public:Base(){cout

c++ - 如何在派生类中存储在基类初始化期间获得的信息?

我的情况是,作为提供数据来初始化基类的副作用,派生类计算了一条信息,该信息稍后必须通过其接口(interface)提供。下面给出了问题的想法,使用bool值作为所需的信息:classbase{public:base(some_initialization_data);//...};classderived:publicbase{public:derived():base(calc_init_data()){}boolcondition_x_occurred()const{//Howtogetattheinformationobtained//duringthecalltocalc_in

c++ - 无法使用大括号初始化智能感知错误调用基类构造函数

我刚刚遇到了以下问题:#include"stdafx.h"#include#includeclasstransaction{protected:transaction(conststd::string&log){printLog(log);}private:voidprintLog(conststd::string&log)const{std::coutVisualStudio2013将第一个“{”标记为红色并显示以下错误:"Errorprotectedfunction"transaction::transaction(conststd::string&log)"(declaredat

c++ - 将空基类指针转换为子类指针?

我有一些代码使用了从基类类型到子类类型的有点偷偷摸摸的转换,其中子类类型被指定为模板参数。我假设因为基类没有声明数据成员并且大小为零,所以基类指针地址将与子类相同,并且转换将成功。到目前为止代码运行正确。这是我正在做的事情的简化版本:templatestructCppIterator{CppIterator(constRangeT&range){...}//...methodscallingRangeT'smembers};//Baseclass,providesbegin()/end()methods.templatestructCppIterableBase{CppIterator

java - 我应该针对接口(interface)还是抽象基类编程?这句话到底是什么意思?

在面向对象的编程中,我读到你应该针对接口(interface)而不是实现进行编程,但它们是否意味着文字接口(interface)(根本没有共享代码)?除了这个“接口(interface)”中有所有子类都应该有的变量之外,是否可以对一个本应是接口(interface)的抽象基类进行编程?跨子类复制变量会带来不便,因为如果我更改其中一个子类中的一个变量的名称,我将不得不更改所有子类中该变量的名称。遵循“针对接口(interface)而不是实现编程”的原则,这样可以吗,或者您会在抽象基类之上创建另一个接口(interface)并针对该接口(interface)编程吗?

c++ - reinterpret_cast 指向基类的指针的 vector 的 vector

考虑以下代码#include#include#include#includestructBase{intx;Base(intx):x(x){}};structDerived:publicBase{inty,z;Derived(intx):Base(x),y(x+1),z(x+2){}};voidupdate(conststd::vector>&elements){for(constautoelem:elements){std::coutx>elements(4);{intctr=0;std::generate(begin(elements),end(elements),[&ctr]()

c++ - 继承函数返回派生类,而不是基类

在C++中是否可以在Base类中制定返回Base类型的函数,以便在Derived类中,它们返回Derived类型,而不重载?最小的例子:classBase{public:Base(doublev){value=v;}Baseadd(Baseb){returnBase(b.value+this->value);}voidprint(){std::cout动机在实际例子中,Base代表一个线性代数矩阵,Derived代表一个vector。矩阵提供了许多适用于vector的函数,例如标量的加法或乘法。在这种情况下,最好不必手动覆盖所有这些矩阵函数来返回vector。如果可能的话,我想表达无论

c++ - 基类的派生类充当抽象类

我定义了一个父类(superclass)元素。有一些element的派生类,比如triangle,quad和cube。一些element对象是边界元素。如果element是边界元素,那么我必须定义额外的数据成员和函数。如果element类不是基类,我可以很容易地派生一个boundary_element类。(我的意思是,如果triangle,quad和cube是单独的类我可以定义单独的派生类,如boundary_triangle、boundary_quad和boundary_cube).所以我的问题是我必须定义一个子类boundary_element,它必须是定义派生类boundary_

c++ - 虚拟基类的创建顺序

我有以下问题:structA1{A1(){std::cout当您运行这段代码时,答案是:A1A2A1AA2A2AA1B我想了解第一个A1是在哪里创建的。我知道虚拟类在非虚拟类之前调用​​的规则,但第一个A1是困扰我的问题。 最佳答案 第一个A1来自B的(非虚拟)基AA1的(虚拟)基的初始化。首先初始化B的所有虚基,依次为A1、A2和AA2。(AA2的初始化导致输出A1AA2。)然后是直接基,其中只有一个,AA1(其初始化打印A2AA1),最后是类本身,打印B。首先是所有虚拟基地,然后才是剩余的非虚拟基地。