默认情况下,类的成员在c ++中是私有的.
因此,我想知道是否有任何可能的用法来创建一个将其所有成员(变量和函数)默认设置为private的类.
换句话说,没有任何关键字是否存在任何有意义的类定义public,protected或者private?
显然,std::optional如果使用C++ 17或boost,则从函数返回可选值是最佳选择(另请参阅GOTW#90)
std::optional<double> possiblyFailingCalculation()
Run Code Online (Sandbox Code Playgroud)
但是,如果一个人坚持使用旧版本(并且不能使用提升),那么什么以及为什么会是最好的选择呢?
我看到几个选项:
STL智能指针(仅限C++ 11)
std::unique_ptr<double> possiblyFailingCalculation();
Run Code Online (Sandbox Code Playgroud)
将它与bool配对
std::pair<double,bool> possiblyFailingCalculation();
Run Code Online (Sandbox Code Playgroud)老式
bool possiblyFailingCalculation(double& output);
Run Code Online (Sandbox Code Playgroud)
auto value = calculation() 样式不兼容 一个DIY模板:一个具有相同功能的基本模板很容易编码,但是实现一个健壮的std::optional<T>外观模板是否有任何陷阱?
抛出一个例外
在cplusplus'在map :: insert()上的条目我读到了一个可以添加的位置,作为函数的提示,"函数优化了插入时间,如果position指向插入元素之前的元素",则为c ++ 98 ,对于c ++ 11,优化发生"如果position指向将跟随插入元素的元素(或者指向结尾,如果它将是最后一个)".
这是否意味着以下形式的代码片段的性能(在我正在研究和模仿Scott Meyer的"有效STL",第24项之后的遗留代码中很丰富)在切换到C++时受到影响11兼容的编译器?
auto pLoc = someMap.lower_bound(someKey);
if(pLoc != someMap.end() && !(someMap.key_comp()(someKey, pLoc->first)))
return pLoc->second;
else
auto newValue = expensiveCalculation();
someMap.insert(pLoc, make_pair(someKey, newValue)); // using the lower bound as hint
return newValue;
Run Code Online (Sandbox Code Playgroud)
改进此模式以与C++ 11一起使用的最佳方法是什么?
当我尝试将const-correctness应用于我自己的代码时,我经常需要const在其他模块中添加资格(由其他程序员编写)以便在我自己的代码中使用这些函数.(参见补丁修正的正确性)
我一直认为如果一切都编译得很好,这可能会导致功能损坏,因为const标签只在编译时很重要.
然而,有一天,我的一位同事坚持要在我提交添加const标签的代码之前重新运行所有自动化测试,我认为编译这些代码就足够了.
他有意见吗?有没有办法应用const-correctness可能破坏现有的功能?
编辑:重要的是要注意,通常,我只需要为函数的指针参数执行此操作(例如Something getSomething(Object* pObj),Something getSomething(const Object* pObj)我不更改返回类型或方法常量,因为这不是客户端代码的问题.
我明白这int x{};是一种默认初始化,但它和写作完全一样int x = 0;吗?
在屏幕上实现创建/更新框的类时,我想添加一个静态成员函数,确保当前没有可见的框重叠(将其信息从静态指针数组传递到所有当前可见的框)
我的初始代码具有以下结构:
class Box
{
public:
// ...
static void arrangeOverlappingBoxes();
};
static void Box::arrangeOverlappingBoxes()
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
我很惊讶这产生了一个错误C2724:'static'不应该用在文件范围定义的成员函数上.
通过一些试验,谷歌和错误,我发现我的函数定义应该丢失关键字static,即它应该是
void Box::arrangeOverlappingBoxes()
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
但我不知道这背后的理由是什么.在类定义及其自己的定义中,它的声明具有不同的函数头似乎是如此不对称和令人困惑.这有什么理由吗?
这是C#中可能的(参见如何将枚举转换为类型),但我想知道如何在C++ 11中实现它?
可能的代码框架(也显示我的预期用途)将是:
// classify.h (part of public API)
// definitions of classes A, B, C cannot be exposed, only a list of names
// (some names might even refer to the same type of object)
enum EAllowedTypes { eA, eB, eC };
class Entity;
bool classifyEntityAs(const Entity& ent, EAllowedTypes type);
Run Code Online (Sandbox Code Playgroud)
_
// classify.cpp
#include "A.h" // defines class A (derived from a common base class)
#include "BC.h" // defines class BC (derived from a common base class) …Run Code Online (Sandbox Code Playgroud) 我在理论上认为这个问题的答案是肯定的.
但是,在实践中,我的编译器(VS2010)似乎并没有在以下情况下抱怨:我有一个抽象基类提供了一些通用接口(但没有数据成员)以及从中派生的各种子类和子类.
class Base
{
public:
Base() {}
virtual ~Base() {}
virtual void interfaceFunction1() = 0;
virtual void interfaceFunction2() = 0;
private:
Base(const Base&); // all derived classes should be uncopyable
Base& operator=(const Base&);
// no data members
};
Run Code Online (Sandbox Code Playgroud)
我的编译器发现甚至在子子类或子子类中实现完整拷贝构造函数也没有问题.
如何确保从Base派生的每个类都是不可复制的?
编辑:如果我理解得很好,这正是Scott Meyers在Effective C++(第3版,2005)第6项中解释的他对类的想法Uncopyable(仅扩展到完整的接口类).是什么让他的想法发挥作用?(我知道他私下继承,但这不应该造成问题)
当我有一个函数接收一个应该引用某个东西的(智能)指针时,我总是按如下方式开始:
class Foo;
void doSomething(const std::shared_ptr<Foo>& pFoo)
{
assert(pFoo);
// ...
}
Run Code Online (Sandbox Code Playgroud)
现在我正在为(智能)指针的向量(或其他容器)寻找类似的断言条件.我能想到的最好的是:
void doSomething(const std::vector<std::shared_ptr<Foo> >& pFoos)
{
assert(std::all_of(pFoos.begin(), pFoos.end(), [](const std::shared_ptr<Foo>& pFoo) { return pFoo; }));
// ...
}
Run Code Online (Sandbox Code Playgroud)
我想知道这是否可以改善..可以避免lambda吗?(我尝试使用shared_ptr的get()方法,但模板推导失败)或者是否有另一种断言整个容器的方法?
我最近在 Visual Studio 中调试 C++ 时(使用 VS2012)发现了“Step into specific”选项,这真的很有帮助,尤其是在有很多构造函数、智能指针等的情况下。
但是,由于我主要使用键盘(F9、F10、F11、Shift-F11)进行调试,我想知道是否可以以某种方式将此功能添加到键盘曲目中?
或者,因为我主要在诸如
void doSomethingInterestingWith(sharedPtrToDb->getEltFromDb(EltId(atoi(key))))
Run Code Online (Sandbox Code Playgroud)
我想知道是否可以创建一个直接进入外部函数的快捷方式(doSomethingInterestingWith())
c++ ×10
c++11 ×5
private ×2
assert ×1
base-class ×1
class ×1
compilation ×1
const ×1
dictionary ×1
enums ×1
insert ×1
optional ×1
return-value ×1
shared-ptr ×1
static ×1
templates ×1
testing ×1
vector ×1