这篇文章主要介绍“C++如何封装必要的违反”,在日常操作中,相信很多人在C++如何封装必要的违反问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++如何封装必要的违反”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
为了保证代码简单和安全。有些时候,因为逻辑或者性能上的原因,难看的,不安全,或者易错的技术也是必要的。如果(必须)这样,将它们限定在局部,而不是传染给接口从而导致更多的程序员必须小心处理它们。实现层面的复杂性应该尽可能的不用通过接口影响到用户的代码。
译者注:面向对象的第一个特性:封装的目的之一就是隔离实现和接口。如果实现影响到接口,一个根本原因就是对封装的理解有问题。
Example(示例)
考虑依赖某种形式的输入(例如main函数的参数)的程序,假设其输入来自文件,命令行或者标准输入,代码可能这样写:
bool owned;owner<istream*> inp;switch (source) {case std_in: owned = false; inp = &cin; break;case command_line: owned = true; inp = new istringstream{argv[2]}; break;case file: owned = true; inp = new ifstream{argv[2]}; break;}istream& in = *inp;
这段代码违反了针对未初始化变量的准则,针对忽略所有权的准则和针对魔术常量的准则。通常,某人必须记着在某些写下:
if (owned) delete inp;
我们可以使用带有特殊删除器的unique_ptr来处理这段常见的示例代码,这个删除器对cin不做任何事情,但是这个技术对初学者(很容易遭遇这个问题的人)是有困难的。另外这段示例代码只是某个应该被认为是静态的属性(这里是所有权)需要在执行时处理的更普遍问题的一个例子。一般来说,更多的情况,最安全的示例可以被静态处理,因此我们不想增加额外的代价和复杂性。但是我们也必须处理不常见的,不够安全的和必要的高代价的情况。这样的例子在[Str15]中被讨论。
So, we write a class
因此我们写了一个类:
class Istream { [[gsl::suppress(lifetime)]]public: enum Opt { from_line = 1 }; Istream() { } Istream(zstring p) :owned{true}, inp{new ifstream{p}} {} // read from file Istream(zstring p, Opt) :owned{true}, inp{new istringstream{p}} {} // read from command line ~Istream() { if (owned) delete inp; } operator istream& () { return *inp; }private: bool owned = false; istream* inp = &cin;};
现在,作为istream动态特性的所有权已经被包装了。实际的代码可能还需增加一点关于潜在错误的检查。
译者注:删除也好,不删除也好,调用者都不需要关心了。
Enforcement(实施建议)
Hard, it is hard to decide what rule-breaking code is essential
困难,很难判断哪种违反规则的代码是必要的。
Flag rule suppression that enable rule-violations to cross interfaces
标记那些导致规则违反的影响透过接口传播的规则抑制行为。
到此,关于“C++如何封装必要的违反”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。