如何使用C++从派生类调用父函数?例如,我有一个名为的类parent
,以及一个child
从父派生的类.每个班级都有一个print
功能.在孩子的打印功能的定义中,我想调用父母的打印功能.我该怎么做呢?
由于std::list
和std::vector
存在,是有什么原因在C++中使用传统的C数组,还是应该尽量避免,只是喜欢malloc
?
为什么不能使三元运算符超载?:'?
我经常使用三元运算符来合并if语句,并且很好奇为什么语言设计者选择禁止此运算符过载.我找到了解释为什么在C++运算符重载但未找到描述为什么这是不可能的解释.脚注提供的唯一信息是它不能超载.
我最初的猜测是,重载运算符几乎总是违反上面链接中给出的第一或第二原则.重载的含义很少是明显的或明显的,或者它将偏离其原始的已知语义.
所以我的问题更多的是为什么这不可能而不是如何,因为我知道它无法完成.
c++ operator-overloading operators ternary-operator visual-c++
当性能对应用程序至关重要时,应该考虑是否在堆栈上声明一个数组而不是堆?请允许我概述为什么会出现这个问题.
由于C/C++中的数组不是对象并且衰减为指针,因此编译器使用提供的索引来执行指针算法来访问元素.我的理解是,当经过第一个维度时,此过程与静态声明的数组不同,是动态声明的数组.
如果我要在堆栈上声明一个数组,如下所示;
int array[2][3] = { 0, 1, 2, 3, 4, 5 }
//In memory { row1 } { row2 }
Run Code Online (Sandbox Code Playgroud)
该数组将以行主格式存储在内存中,因为它存储在连续的内存块中.这意味着当我尝试访问数组中的元素时,编译器必须执行一些加法和乘法才能确定正确的位置.
所以如果我要做以下事情
int x = array[1][2]; // x = 5
Run Code Online (Sandbox Code Playgroud)
然后编译器将使用以下公式:
i =行索引j =列索引n =单行的大小(此处n = 2)
array =指向第一个元素的指针
*(array + (i*n) + j)
*(array + (1*2) + 2)
Run Code Online (Sandbox Code Playgroud)
这意味着如果我循环遍历此数组以访问其每个元素,则通过索引对每个访问执行额外的乘法步骤.
现在,在堆上声明的数组中,范例是不同的,需要一个多阶段解决方案.注意:我也可以在这里使用C++ new运算符,但我相信数据的表示方式没有区别.
int ** array;
int rowSize = 2;
// Create a 2 by 3 2d array on the heap
array = malloc(2 * …
Run Code Online (Sandbox Code Playgroud) 我做了一个图像映射,它不能在Firefox中工作.它适用于Chrome和Safari.
这是网站bryanedwardcollins.com
请帮忙!
<MAP NAME="menumap" >
<AREA
HREF="contact.html" ALT="contact"
SHAPE="POLY" COORDS="425,100, 572,89, 594,142, 488,150, 460,166, 423,100">
<AREA
HREF="insameit.html" ALT="insame i.t."
SHAPE="POLY" COORDS="382,239, 462,245, 461,343, 608,344, 610,395, 354,405, 354,341">
<AREA
HREF="floorpart.html" ALT="floor part"
SHAPE="POLY" COORDS="307,185, 429,185, 430,221, 379,222, 374,235, 283,224">
<AREA
HREF="iouse.html" ALT="I O Use"
SHAPE="POLY" COORDS="27,18, 231,16, 243,0, 382,0, 253,265, 69,252, 193,73, 27,73">
<AREA
HREF="worldpart.html" ALT="world part"
SHAPE="POLY" COORDS="25,303, 122,305, 122,448, 27,449">
</MAP>
Run Code Online (Sandbox Code Playgroud) 我正在开发一个带有VBA的MS Excel 2013工具,它涉及使用QueryTables.我遇到的一个不便是访问Excel工作表中的现有 QueryTables.目前,我可以找到访问查询表的唯一方法是通过整数索引.我提出了以下代码,以便快速验证概念
Sub RefreshDataQuery()
Dim querySheet As Worksheet
Dim interface As Worksheet
Set querySheet = Worksheets("QTable")
Set interface = Worksheets("Interface")
Dim sh As Worksheet
Dim QT As QueryTable
Dim startTime As Double
Dim endTime As Double
Set QT = querySheet.ListObjects.item(1).QueryTable
startTime = Timer
QT.Refresh
endTime = Timer - startTime
interface.Cells(1, 1).Value = "Elapsed time to run query"
interface.Cells(1, 2).Value = endTime
interface.Cells(1, 3).Value = "Seconds"
End Sub
Run Code Online (Sandbox Code Playgroud)
这有效,但我真的不想这样做.最终产品工具最多有五个不同的QueryTable.我想要的是通过名称引用QueryTable.
如果我能翻译下面的代码,那会更好
Set QT = querySheet.ListObjects.item(1).QueryTable
Run Code Online (Sandbox Code Playgroud)
对于某些事情
Set QT = …
Run Code Online (Sandbox Code Playgroud) 我复制并粘贴了这个确切的代码,在这里找到我的IDE,并得到一个错误,我不明白它为什么会发生,并想知道为什么.
std::array<int, 3> a2 = {1, 2, 3}; // except after =
Run Code Online (Sandbox Code Playgroud) 我很好奇为什么在使用ArrayLists时使用Arrays?使用ArrayList不总是更好吗?
最近我一直在阅读Scott Meyers的Effective C++ Second Edition,以改进C++最佳实践.他列出的一个项目鼓励C++程序员避免使用预处理器宏并且"更喜欢编译器".他说,除了#include和#ifdef/#ifndef之外,C++中几乎没有宏的原因.
我同意他的推理,因为你可以完成以下宏
#define min(a,b) ((a) < (b) ? (a) : (b))
Run Code Online (Sandbox Code Playgroud)
具有以下C++语言功能
template<class T>
inline const T & min(const T & a, const T & b) {
return a < b ? a : b;
}
Run Code Online (Sandbox Code Playgroud)
其中inline为编译器提供了删除函数调用和插入内联代码和模板的选项,该代码和模板可以处理具有重载或内置>运算符的多种数据类型.
编辑 -如果a和b的数据类型不同,则此模板声明将不会与所述宏完全匹配.有关示例,请参阅Pete的评论.
但是,我很想知道使用宏进行调试日志记录是否是C++中的有效用法.如果我在下面提出的方法不是很好的做法,那么有人会建议另一种方法吗?
我去年在Objective-C中进行了编码,我最喜欢的2D引擎之一(cocos2d)利用宏来创建日志语句.宏如下:
/*
* if COCOS2D_DEBUG is not defined, or if it is 0 then
* all CCLOGXXX macros will be disabled
*
* if COCOS2D_DEBUG==1 then:
* CCLOG() will be enabled
* CCLOGERROR() will be …
Run Code Online (Sandbox Code Playgroud) 我试图覆盖 Vector_container 中的大小函数,但 IDE 告诉我“标记为‘覆盖’的非虚拟成员函数隐藏虚拟成员函数”
class Container {
public:
virtual double& operator[](int) = 0; // pure virtual function
virtual int size() const = 0; // const member function (§4.2.1)
virtual ~Container() {} // destructor (§4.2.2)
};
class Vector_container : public Container { // Vector_container implements Container
public:
Vector_container(int s) : v(s) { } // Vector of s elements
~Vector_container() {}
double& operator[](int i) override { return v[i]; }
int size() override { return v.size(); }
private:
Vector v;
};
Run Code Online (Sandbox Code Playgroud)
但它不是一个虚函数吗?
c++ ×7
arrays ×3
inheritance ×2
c ×1
constants ×1
conventions ×1
debugging ×1
excel ×1
html ×1
imagemap ×1
java ×1
logging ×1
macros ×1
memory ×1
oop ×1
operators ×1
overriding ×1
performance ×1
polymorphism ×1
vba ×1
visual-c++ ×1