Questions tagged «c++»

C ++是一种通用编程语言。它最初被设计为C的扩展,并且具有类似的语法,但是现在它是一种完全不同的语言。使用此标记可解决有关将要使用C ++编译器编译的代码的问题。对于与特定标准修订版[C ++ 11],[C ++ 14],[C ++ 17]或[C ++ 20]等相关的问题,请使用特定于版本的标记。

7
如果我要重写基类的虚函数,可以调用它吗?
假设我有课程,Foo并且Bar设置如下: class Foo { public: int x; virtual void printStuff() { std::cout << x << std::endl; } }; class Bar : public Foo { public: int y; void printStuff() { // I would like to call Foo.printStuff() here... std::cout << y << std::endl; } }; 如代码中所注释,我希望能够调用我要重写的基类的函数。在Java中有super.funcname()语法。这在C ++中可能吗?

14
为什么C ++没有反射?
这是一个有些奇怪的问题。我的目标是理解语言设计决策并确定C ++中反思的可能性。 为什么C ++语言委员会不致力于在语言中实现反射?使用不在虚拟机上运行的语言(如Java)进行反射是否太困难了? 如果要实现对C ++的反思,将面临哪些挑战? 我猜想反射的用途是众所周知的:编辑器可以更容易编写,程序代码会更小,可以为单元测试生成模拟等等。但是,如果您也可以评论反射的使用,那就太好了。
337 c++  reflection 

22
确定两个矩形是否相互重叠?
我正在尝试编写一个C ++程序,该程序需要用户输入以下内容以构造矩形(2到5之间):高度,宽度,x-pos,y-pos。所有这些矩形将平行于x和y轴存在,也就是说,它们的所有边缘的斜率均为0或无穷大。 我试图实现在此提到的内容问题中但运气并不好。 我当前的实现执行以下操作: // Gets all the vertices for Rectangle 1 and stores them in an array -> arrRect1 // point 1 x: arrRect1[0], point 1 y: arrRect1[1] and so on... // Gets all the vertices for Rectangle 2 and stores them in an array -> arrRect2 // rotated …

14
什么时候应该在C ++ 11中使用constexpr功能?
在我看来,拥有“总是返回5的函数”正在破坏或削弱“调用函数”的含义。一定有原因或需要此功能,否则C ++ 11中不会存在。为什么在那儿? // preprocessor. #define MEANING_OF_LIFE 42 // constants: const int MeaningOfLife = 42; // constexpr-function: constexpr int MeaningOfLife () { return 42; } 在我看来,如果我编写了一个返回文字值的函数,并且进行了代码审查,则有人会告诉我,我应该声明一个常量值,而不是编写return 5。
337 c++  c++11  constexpr 


5
如何在std :: map中使用基于范围的for()循环?
C ++ 11基于范围的for()循环的常见示例总是像这样简单: std::vector<int> numbers = { 1, 2, 3, 4, 5, 6, 7 }; for ( auto xyz : numbers ) { std::cout << xyz << std::endl; } 在这种情况下xyz是int。但是,当我们有地图时会发生什么?在此示例中,变量的类型是什么: std::map< foo, bar > testing = { /*...blah...*/ }; for ( auto abc : testing ) { std::cout << abc …

17
std :: string转换为char *
我想将std :: string转换为char *或char []数据类型。 std::string str = "string"; char* chr = str; 结果为:“错误:无法将'std :: string'转换为'char'...”。 有什么方法可以做到这一点?
335 c++  string  char 

20
int a [] = {1,2,}; 允许使用怪异的逗号。有什么特殊原因吗?
也许我不是来自这个星球,但是在我看来,以下内容应该是语法错误: int a[] = {1,2,}; //extra comma in the end 但事实并非如此。当在Visual Studio中编译的代码我很惊讶,但我已经学会了不信任MSVC编译器尽可能C ++的规则而言,所以我检查的标准,它是标准允许为好。如果您不相信我,可以查看8.5.1的语法规则。 为什么允许这样做?这可能是一个愚蠢的无用问题,但我想让您理解我为什么要问。如果这是一般语法规则的子情况,我会理解-他们决定不为了简化通用语法而仅仅在初始化器列表的末尾不允许多余的逗号。但是不可以,其他逗号是明确允许的。例如,不允许在函数调用参数列表的末尾(当函数采用时...)使用多余的逗号,这是正常现象。 那么,是否再次有明确的理由允许这个多余的逗号呢?

5
内联名称空间有什么用?
C ++ 11允许inline namespaces,其所有成员也自动包含在其中namespace。我想不出这有什么用处-有人可以举一个简短,简洁的例子来说明这种情况inline namespace是需要的,也是最惯用的解决方案吗? (另外,当发生了什么并不清楚,我namespace声明inline在一个但不是所有的声明,这可能住在不同的文件。这难道不是找麻烦?)


2
如何在现代C ++中实现经典的排序算法?
在大多数实现中,C ++标准库中的std::sort算法(及其表亲std::partial_sort和std::nth_element)是更多基本排序算法(例如选择排序,插入排序,快速排序,合并排序或堆排序)的复杂混合混合。 在这里以及在姐妹网站(例如https://codereview.stackexchange.com/)上,存在许多与这些经典排序算法的错误,复杂性和实现的其他方面有关的问题。提供的大多数实现都是由原始循环,使用索引操作和具体类型组成的,并且从正确性和效率方面来说,通常都是不平凡的分析。 问题:如何使用现代C ++实现上述经典排序算法? 没有原始循环,但结合了标准库的算法构建块<algorithm> 迭代器接口和模板的使用,而不是索引操作和具体类型的使用 C ++ 14样式,包括完整的标准库以及语法降噪器,例如auto,模板别名,透明比较器和多态lambda。 注意事项: 有关排序算法实现的更多参考,请参见Wikipedia,Rosetta Code或http://www.sorting-algorithms.com/ 根据Sean Parent的约定(幻灯片39),原始循环是-循环,for比使用运算符将​​两个函数组成更长。So f(g(x));or f(x); g(x);or f(x) + g(x);不是原始循环,也不是内部selection_sort和insertion_sort下面的循环。 我遵循Scott Meyers的术语将当前的C ++ 1y表示为C ++ 14,并将C ++ 98和C ++ 03都表示为C ++ 98,所以不要为此而烦恼。 正如@Mehrdad的评论中所建议的那样,我在答案的末尾提供了四个作为实时示例的实现:C ++ 14,C ++ 11,C ++ 98和Boost和C ++ 98。 答案本身仅用C ++ 14表示。在相关的地方,我表示的是各种语言版本不同的语法和库差异。

3
0是十进制文字还是八进制文字?
零永远是零,所以没关系。但是在最近与一位朋友的讨论中,他说八进制立即数在今天几乎未使用。†然后我发现实际上我的代码中几乎所有整数文字都是八进制的,即0。 0根据C ++语法,八进制文字是否正确?标准怎么说? †我知道的唯一真正用途是用于UNIX文件权限。
329 c++  zero  octal 

10
如何在C ++中正确实现工厂方法模式
在C ++中有一件事让我很长时间以来一直感到不舒服,因为老实说我不知道​​怎么做,尽管听起来很简单: 如何在C ++中正确实现Factory方法? 目标:允许客户端使用工厂方法而不是对象的构造函数实例化某些对象,而不会造成不可接受的后果和性能损失。 “工厂方法模式”是指对象内部的静态工厂方法或另一个类中定义的方法或全局函数。通常只是“将类X的常规实例化方法重定向到构造函数以外的任何其他地方的概念”。 让我浏览一下我想到的一些可能的答案。 0)不要制造工厂,制造构造函数。 这听起来不错(实际上通常是最好的解决方案),但这不是一般的补救方法。首先,在某些情况下,对象构造是一个任务复杂到足以证明将其提取到另一个类的任务。但是即使抛开这个事实,即使对于仅使用构造函数的简单对象,也常常不起作用。 我知道的最简单的示例是2-D Vector类。如此简单,但棘手。我希望能够同时从笛卡尔坐标和极坐标构造它。显然,我不能做: struct Vec2 { Vec2(float x, float y); Vec2(float angle, float magnitude); // not a valid overload! // ... }; 我的自然思维方式是: struct Vec2 { static Vec2 fromLinear(float x, float y); static Vec2 fromPolar(float angle, float magnitude); // ... }; 这不是构造函数,而是带我使用静态工厂方法……这实际上意味着我正在以某种方式实现工厂模式(“类成为自己的工厂”)。这看起来不错(并且将适合此特定情况),但是在某些情况下会失败,这将在第2点中进行描述。请继续阅读。 …

22
未初始化的局部变量是最快的随机数生成器吗?
我知道未初始化的局部变量是未定义的行为(UB),并且该值可能具有陷阱表示,这可能会影响进一步的操作,但是有时我只想将随机数用于视觉表示,而不会在其他部分使用它们程序,例如,在视觉效果中设置具有随机颜色的内容,例如: void updateEffect(){ for(int i=0;i<1000;i++){ int r; int g; int b; star[i].setColor(r%255,g%255,b%255); bool isVisible; star[i].setVisible(isVisible); } } 比那快吗 void updateEffect(){ for(int i=0;i<1000;i++){ star[i].setColor(rand()%255,rand()%255,rand()%255); star[i].setVisible(rand()%2==0?true:false); } } 并且比其他随机数生成器还快?


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.