jjzjj

c++ - 将所有项目依赖项放入项目存储库中是好习惯吗?

我有一个项目使用几个(目前约6个)依赖项(其他库)。它们中的大多数都在MIT/简化的BSD许可证上,所以将它们复制到我的repo应该不是问题。将所有这些库放入我的存储库并推送它们是否是一个好习惯(当新版本出现时,也更新它们)?或者我的项目仓库应该只包含项目文件(代码、Assets等)?优点:建筑非常简单,因为我拥有我需要的一切close添加库意味着我使用这些版本测试了我的项目,因为其他版本(旧版/新版)可能会产生一些问题缺点:项目代码库膨胀必须手动更新依赖项如果我还想粘贴构建版本,我将不得不粘贴很多文件,它会占用大量空间,所以可能坚持使用源代码只有?有些库可能没有很好的许可证,直接使用

c++ - 如何在 C++ 中针对克隆习惯创建 spy 类

来自Java/PHP世界,我对C++还是个新手。一些用其他语言做的简单事情用C++做起来有点棘手。我的主要问题如下。现在,我有一个类(即“Something”),构造函数为其注入(inject)了虚拟类依赖项(即“Base”的子级)。然后,构造函数将这个注入(inject)的实例存储在unique_ptr中。类字段(使用克隆成语)。这在应用程序级别运行良好,一切似乎都按预期运行。这是示例代码:classBase{public:virtualstd::unique_ptrclone()=0;virtualvoidsayHello()const=0;};classSomething{pub

c++ - 使用作用域对象实现 "execute-around"习惯用法是否滥用?

作用域对象(在构造函数和析构函数中实现了补充逻辑)是否应该仅用于资源清理(RAII)?或者我可以使用它来实现应用程序逻辑的某些方面吗?前一段时间我问了关于FunctionhookinginC++的问题.结果是Bjarneaddressedthisproblem他提出的解决方案是创建一个代理对象来实现operator->并在那里分配一个作用域对象。“之前”和“之后”分别在作用域对象的构造函数和析构函数中实现。问题是析构函数不应该抛出。因此,您必须将析构函数包装在try{/*...*/}catch(...){/*empty*/}block中。这严重限制了处理“之后”代码中的错误的能力。作用

c++ - 在基类中混合使用虚函数和非虚函数是否是一种糟糕的编程习惯?

我有一个基类Base,我声明了它的几个多态子类。一些基类的函数是纯虚函数,而另一些则由子类直接使用。(这都是C++)例如:classBase{protected:floatmy_float;public:virtualvoidFunction()=0;voidSetFloat(floatvalue){my_float=value}classsubclass:publicBase{voidFunction(){std::cout因此,如您所见,子类将依赖于设置“my_float”的函数的基类,但对于其他函数而言将是多态的。所以我想知道这是否是一种好的做法。如果您有一个抽象基类,您应该使它

c++ - 为方法提供一个空实例是一种好习惯吗?

这里是C++新手!有一个Individual类分配了大量内存,因此我们希望避免复制。让mother和father成为两个Individual。我希望他们使用reproduce方法进行复制,以创建另一个名为baby的Individual。直觉上,我会使用默认构造函数初始化baby,将其作为参数传递给reproduce并返回引用(尽管我认为没有必要返回引用).这是执行此操作的代码classIndividual{public:voidreproduce(constIndividual&father,Individual&baby){//Setallattributesofbaby}priva

没有动态调度开销的基类抽象方法的 C++ 习惯用法?

在C++中,是否有任何方法可以在不将方法声明为的情况下拥有“抽象”基类方法(即,从基类声明和调用,但在子类中实现)虚拟?当然,这个问题只适用于不需要多态性的情况(从未使用过的基类型的指针/引用)。请考虑以下事项:#defineNO_OPTasmvolatile("");//topreventsomecompileroptimizationtemplatevoiddoSomething(DerivedType&d){d.foo();}namespacetest1{structBase{inlinevoidfoo(){//...docommonstuffpre-call...foo_imp

c++ - 这是使用访问功能的好习惯

我有以下代码,我也想在使用GCC4.8的Linux上工作这是使用VS2013if(_access(trigger->c_str(),0)!=-1){...}我知道在Linux上我可以使用function:accessfrom"unistd.h"有没有办法避免出现类似下面的情况(更优雅的解决方案)?#ifdef__linux__#include#endif#ifdef__linux__if(access(trigger->c_str(),0)!=-1){...}#elseif(_access(trigger->c_str(),0)!=-1){...}#endif

c++ - 使用 move-constructor 时将 self 重置为 nullptr 是个好习惯吗?

在C++11中,移动构造函数/运算符支持资源/内存移动。这是我的例子:classA{public:A():table_(nullptr),alloc_(0){}~A(){if(table_)delete[]table_;}A(constA&other){//table_isnotinitialized//if(table_)//delete[]table_;table_=newint[other.alloc_];memcpy(table_,other.table_,other.alloc_*sizeof(int));alloc_=other.alloc_;}A&operator=(co

c++ - 使用非成员函数是一种好习惯吗?

假设我有一个类,其中有多个具有相似逻辑的函数。由于我不想重复自己,所以我将类似的逻辑提取到一个函数中。如果similarLogic不使用任何类成员,那么将其作为非成员函数是一种好习惯吗?或者有更好的方法吗?请注意,在我的例子中,similarLogic函数严格特定于MyClass,因此不会在它之外的任何地方使用。非成员函数示例:MyClass.hclassMyClass{public:intfunc1();intfunc2();};MyClass.cppintsimilarLogic(intp_num){return5+p_num;}intMyClass::func1(){return

c++ - 在 C++ 类的构造函数中抛出异常是好习惯吗?

我有这个抛出异常的构造函数GenericSocket::GenericSocket(conststring&hostname,conststring&servname):_hostname(hostname),_servname(servname){initHints();intrv;if((rv=getaddrinfo(_hostname.c_str(),_servname.c_str(),&_hints,&_servinfo))!=0){throwGenericSocketException();}}initHints()执行_hints的内存集并设置一些变量。我用这样的谷歌测试框