Questions tagged «c++»

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

4
为什么要使用“ using”关键字来访问我的基类方法?
我编写了以下代码,以解释我的问题。如果我注释第11行(使用关键字“ using”),则编译器不会编译该文件并显示此错误:invalid conversion from 'char' to 'const char*'。void action(char)在Parent类中似乎看不到该类的方法Son。 为什么编译器以这种方式运行?还是我做错了什么? class Parent { public: virtual void action( const char how ){ this->action( &how ); } virtual void action( const char * how ) = 0; }; class Son : public Parent { public: using Parent::action; // Why should i write …
75 c++  oop  inheritance  using 


5
glBindVertexArrays vs glBindBuffer的作用是什么,它们之间的关系是什么?
我是OpenGL和Graphics Programming的新手。到目前为止,我一直在阅读一本非常详尽且编写得很好的教科书,但是我碰到了我不太了解的代码中的一个要点,在此之前我想先了解一下这些内容继续。 GLuint abuffer; glGenVertexArrays(1, &abuffer); glBindVertexArray(abuffer); GLuint buffer; glGenBuffers(1, &buffer); glBindBuffer(GL_ARRAY_BUFFER, buffer); glBufferData(GL_ARRAY_BUFFER, sizeof(points), points, GL_STATIC_DRAW); 该书解释说,前三行正在创建一个顶点数组对象,该对象用于将关联数据与顶点数组捆绑在一起。第二行找到一个未使用的名称(我猜是存储在中的一个无符号整数标识符abuffer),第三行创建了对象/使其成为活动对象。 这本书解释说,第4-7行创建了一个缓冲区对象来存储我们的数据,第5行给出了一个未使用的标识符(类似于顶点数组对象的第2行?),第6行创建了缓冲区,第7行创建了缓冲区这行代码在CPU上分配了足够的内存,并为我们的数据(点)创建了一个指针GL_STATIC_DRAW。 该对象处于活动状态意味着什么?您随后何时使用abuffer?顶点数组捆绑关联的数据是什么意思,数据何时与该顶点数组对象关联? 我对abuffer和之间的关系感到困惑buffer。我对顶点数组与缓冲区对象的关系以及在什么时候形成该关系感到困惑。我不确定它们是否确实相关,但是它们在教科书中紧接着出现。 任何帮助,将不胜感激。谢谢。
75 c++  opengl 


6
#将所有.cpp文件包含到一个编译单元中?
想要改善此职位?提供有关此问题的详细答案,包括引文和为什么您的答案正确的解释。答案不够详细的答案可能会被编辑或删除。 最近,我有理由要使用常规的Debug和Release配置来处理某些Visual Studio C ++项目,还需要处理“ Release All”和“ Debug All”,这是我以前从未见过的。 事实证明,项目的作者只有一个ALL.cpp,其中#includes所有其他.cpp文件。*所有配置仅构建此一个ALL.cpp文件。它当然不包含在常规配置中,并且常规配置不会构建ALL.cpp 我只是想知道这是否是常见的做法?它带来什么好处?(我的第一反应是闻起来很香。) 您可能会遇到什么样的陷阱?我能想到的是,如果您的.cpps中有匿名名称空间,它们不再是该cpp的“专用”对象,而是现在在其他cpps中也可见? 所有项目都构建DLL,因此将数据存储在匿名名称空间中不是一个好主意,对吗?但是功能会好吗?

12
如何在C ++中获取文件的MD5哈希?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 3年前关闭。 改善这个问题 我有文件路径。如何获得它的MD5哈希?
75 c++  hash  md5 

6
C ++ 11 std :: set lambda比较函数
我想std::set用自定义比较功能创建一个。我可以使用来将其定义为类operator(),但是我想享受在其中使用lambda的能力,因此我决定在具有std::set作为成员的类的构造函数的初始化列表中定义lambda函数。但是我无法获得lambda的类型。在继续之前,这里有一个例子: class Foo { private: std::set<int, /*???*/> numbers; public: Foo () : numbers ([](int x, int y) { return x < y; }) { } }; 搜索后,我发现了两种解决方案:一种是使用std::function。只需将设置比较函数类型设置为be,std::function<bool (int, int)>然后像我一样完全传递lambda即可。第二种解决方案是编写一个make_set函数,例如std::make_pair。 解决方案1: class Foo { private: std::set<int, std::function<bool (int, int)> numbers; public: Foo () : numbers ([](int x, int y) { return …

19
是否需要“做{…} while()”循环?
Bjarne Stroustrup(C ++创建者)曾经说过,他避免执行“ do / while”循环,而是更喜欢使用“ while”循环来编写代码。[请参阅下面的引用。] 自从听到这句话以来,我发现这是真的。你怎么认为?有没有一个示例,其中“ do / while”比使用“ while”更清晰,更容易理解? 针对某些答案:是的,我了解“ do / while”和“ while”之间的技术区别。这是一个涉及循环的可读性和结构化代码的更深层问题。 让我问另一种方式:假设您被禁止使用“ do / while”-是否有一个现实的示例,除了使用“ while”编写不干净的代码,别无选择? 来自“ C ++编程语言”,6.3.3: 以我的经验,做陈述是错误和混乱的根源。原因是在评估条件之前,它的主体总是执行一次。但是,为了使身体正常工作,即使是第一次也必须保持这种状态。比起我想像的更多,我发现该条件在首次编写和测试程序时,或者在修改其之前的代码之后,均未达到预期。 我也更喜欢“可以看到它的前面”条件。因此,我倾向于避免执行陈述。-比耶恩
75 c++  c  loops 

13
头文件中有多个类,而每个类中只有一个头文件
无论出于何种原因,我们公司都有一个编码准​​则,其中指出: Each class shall have it's own header and implementation file. 因此,如果我们编写了一个名为的类,MyString则需要一个关联的MyStringh.h和MyString.cxx。 还有其他人这样做吗?结果有人看到过任何编译性能影响吗?10000个文件中的5000个类的编译速度是否与2500个文件中的5000个类的编译速度一样快?如果不是,差异是否明显? [我们编码C ++,并使用GCC 3.4.4作为我们的日常编译器]

6
什么是Mixins(概念)
我试图让我了解Mixin概念,但是我似乎无法理解它的含义。我看到的是,这是一种通过使用继承来扩展类功能的方法。我读过人们将它们称为“抽象子类”。谁能解释为什么? 如果您能根据以下示例解释您的答案,将不胜感激(摘自我的演讲幻灯片之一):
75 c++  oop  templates  mixins 

4
为什么不推荐使用std :: strstream?
我最近发现std::strstream已弃用,而赞成std::stringstream。自从我使用它已经有一段时间了,但是它做了我当时需要做的事情,所以听到它被弃用感到惊讶。 我的问题是为什么要做出这个决定,而std::stringstream提供的好处是什么std::strstream呢?

2
C ++ 11的原始字符串文字R“(…)”中括号的基本原理是什么?
C ++ 11中引入了一个非常方便的功能,称为原始字符串文字,即没有转义字符的字符串。而不是这样写: regex mask("\\t[0-9]+\\.[0-9]+\\t\\\\SUB"); 您可以简单地这样写: regex mask(R"(\t[0-9]+\.[0-9]+\t\\SUB)"); 更具可读性。但是,请注意,必须在字符串周围附加括号以定义原始字符串文字。 我的问题是,为什么我们甚至需要这些?对我来说,这看起来很丑陋且不合逻辑。这是我所看到的缺点: 额外的冗长性,而整个功能则使文字更加紧凑 难以区分文字的正文和定义的符号 我的意思是硬区分: "good old usual string literal" ^- body inside quotes -^ R"(new strange raw string literal)" ^- body inside parenthesis -^ 这是专业人士: 更大的灵活性,原始字符串中提供了更多字符,尤其是与定界符一起使用时: "delim( can use "()" here )delim" 但是,如果您需要更大的灵活性,则可以使用旧的可转义字符串字面量。为什么标准委员会决定用这些绝对不必要的括号来污染每个原始字符串文字的内容?这背后的原因是什么?我没有提到哪些专业人士? UPD Kerrek的答案很好,但不幸的是,这不是答案。由于我已经描述过,所以我了解它的工作原理以及它带来的好处。自从我问了这个问题已经过去了五年,但仍然没有答案。我仍然对该决定感到沮丧。可以说这是一种品味问题,但我不同意。你用多少空间,你怎么命名的变量,这是SomeFunction()还是some_function()-这是品味的问题。而且我真的可以轻松地从一种样式切换到另一种样式。 但这吗?。这么多年后仍然感到笨拙和笨拙。不,这与味道无关。这是关于无论如何我们都希望涵盖所有可能的情况。每当我们需要编写Windows特定路径,正则表达式或多行字符串文字时,我们注定要编写这些丑陋的括号。那又是什么?..对于那些实际上需要放入"字符串的罕见情况?我希望我在那个委员会会议上决定以这种方式这样做。我会坚决反对这个错误的决定。我希望。现在我们注定了。 感谢您阅读本文。现在我感觉好多了。 UPD2这是我的替代建议,我认为这两个建议都将比现有建议更好。 提议1.受python启发。无法支持带三引号的字符串文字:R"""Here is a …

5
如何完全禁用对assert()的调用?
我的代码充满了对的调用assert(condition)。在调试版本中,我使用g++ -g它触发我的断言。出乎意料的是,在我的发行版本中也触发了相同的断言,即没有-g选项的情况下编译的断言。 如何在编译时完全禁用我的断言?我应该NDEBUG在生产的任何版本中明确定义,而不管它们是调试,发布还是其他任何形式?
75 c++  c  assert 

4
如何在Visual C ++中构建导入库(.lib)和DLL?
我想要一个构建DLL文件和导入库(.lib)文件的Visual Studio项目。(导入库是静态链接的库,负责在使用该DLL文件的其他项目中加载该DLL文件)。 因此,我去了Visual Studio C ++ 2008 Express Edition,创建了类库类型的新项目,并将“配置类型”设置为“ Dyanamic库(.dll)”。 但是,当我构建解决方案时,我看到的唯一相关的输出文件是DLL文件。我看不到生成任何LIB文件。我查看了项目目录和所有子目录(发布和调试)。 我相信可以同时构建LIB和DLL文件,因为在MSDN上显示“链接程序在DLL生成时会创建导入库”。 另外,该网站的另一个用户正在使用Visual C ++同时创建LIB和DLL文件。 那我该怎么办呢?

6
qsort vs std :: sort的性能?
斯科特·迈耶斯(Scott Meyers)认为,在他的有效STL书中-项目46。他声称由于内联的事实,这种std::sort方法的速度要快670%std::qsort。我测试了自己,发现qsort更快:(!!有人可以帮我解释一下这种奇怪的行为吗? #include <iostream> #include <vector> #include <algorithm> #include <cstdlib> #include <ctime> #include <cstdio> const size_t LARGE_SIZE = 100000; struct rnd { int operator()() { return rand() % LARGE_SIZE; } }; int comp( const void* a, const void* b ) { return ( *( int* )a - *( int* )b …
75 c++  performance  sorting  stl 

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.