在您看来,您遇到的最令人惊讶,奇怪,奇怪或真正的"WTF"语言功能是什么?
每个答案只能有一个功能.
为了避免我可以用Google搜索的所有标准答案,我将提供一个你可以随意攻击的例子.
C#和Java(和太多的人)有很多类型的一些"溢出"的行为,我不都不像(如type.MaxValue + type.SmallestValue == type.MinValue
例如: int.MaxValue + 1 == int.MinValue
).
但是,看到我的恶性,我会通过扩展这种行为来增加对这种伤害的一些侮辱,让我们说一个Overridden DateTime
类型.(我知道DateTime
密封在.NET中,但是为了这个例子,我使用的是一种与C#完全相同的伪语言,除了DateTime没有密封的事实).
被覆盖的Add
方法:
/// <summary>
/// Increments this date with a timespan, but loops when
/// the maximum value for datetime is exceeded.
/// </summary>
/// <param name="ts">The timespan to (try to) add</param>
/// <returns>The Date, incremented with the given timespan.
/// If DateTime.MaxValue is exceeded, the sum wil 'overflow' and
/// continue from DateTime.MinValue.
/// </returns>
public DateTime override Add(TimeSpan …
Run Code Online (Sandbox Code Playgroud) Google的Go语言作为一种设计选择没有例外,Linux的Linus称之为例外废话.为什么?
我正在讨论在新的C++项目中采用哪种方式.由于以下原因,我赞成对返回代码的异常(仅限特殊情况) -
这些是我从思考它和谷歌搜索中得出的要点.我必须承认,在过去的几年中,我倾向于使用C#工作的例外情况.请在退货代码上发布使用例外的进一步原因.对于那些喜欢返回代码的人,我也愿意倾听你的推理.谢谢
可能的例外是最具争议的C++功能.包括谷歌在内的许多团队都不使用它们.当然,是否使用它们的决定取决于上下文 - 例如,在某些游戏中,可能会在内存不足时崩溃,但在医疗设备控制软件中则不然.除了内存不足之外,一些团队可能会使用例外来解决网络中断,文件未找到等问题,但其他人可能会说这种情况太常见而不能被称为例外(其他人可能会说,但如果它很常见,那么?)
通常,不使用异常的决定是基于可能被误导的论点,即很难编写异常安全的代码.有人说这个论点是错误的,因为使用错误代码的替代方法将导致至少同样困难的代码.大卫亚伯拉罕澄清了这一点.
在这个问题上,我很想知道:
Python循环语句可能有一个else
子句,当且仅当循环未被a终止时才执行该子句break
.换句话说,当条件变为False
(有while
)或迭代器耗尽时(带for
).
这个循环 - 其他构造是否源自另一种语言(理论上的或实际的)?它是否被任何较新的语言所采用?
也许我应该问问Guido的前任,但他肯定太忙了,无法进行如此徒劳的调查.;-)
相关讨论和示例: 在for循环中使用'else'的Pythonic方法
一种是使用C++异常:尝试catch块.但是,当引发异常时,释放动态内存将成为一个问题.
第二种是使用C风格:errno变量
第三个是在错误时返回-1,在成功时返回0 :)
应该选择哪种方式进行中型项目?为什么?还有其他更好的方法..?
我们如何处理像C异常和错误在C++中,我们使用Java try {}
和catch{}
?C有什么办法吗?
我在这里阅读了几篇文章,否则可以从构造函数中抛出异常.但是,我注意到,如果从构造函数中抛出异常,它不会调用基类的析构函数或其数据成员.请考虑以下示例:
#include <iostream>
using namespace std;
struct C
{
C() { cout << __FUNCTION__ << endl; }
~C() { cout << __FUNCTION__ << endl; }
};
struct E: public C
{
C c;
E() { cout << __FUNCTION__ << endl; throw 4; }
~E() { cout << __FUNCTION__ << endl; }
};
int main()
{
E e;
}
$ g++ test.cpp; ./a.exe
C
C
E
terminate called after throwing an instance of 'int'
Aborted (core dumped)
Run Code Online (Sandbox Code Playgroud)
在这种情况下,E的构造函数抛出异常,但不会调用C的析构函数作为数据成员或基类.现在,如果C的析构函数执行一些清理操作,如关闭文件/套接字和删除堆分配,这可能会导致问题.
所以我的问题是为什么以及何时可以从构造函数中抛出异常.
假设我有一个需要返回一些整数值的函数.但它也可能失败,我需要知道它什么时候发生.
哪种方式更好?
public int? DoSomethingWonderful()
Run Code Online (Sandbox Code Playgroud)
要么
public bool DoSomethingWonderful(out int parameter)
Run Code Online (Sandbox Code Playgroud)
这可能更像是一个风格问题,但我仍然很好奇人们会采取哪种选择.
编辑:澄清,这段代码与一个黑盒子对话(我们称之为云.不,黑盒子.不,等等.云.是的).我不在乎为什么失败了.我只需要知道我是否有有效值.
如果我的类SomeType有一个方法从地图返回一个元素(使用键)说
std::unique_ptr<OtherType> get_othertype(std::string name)
{
return otMap.find(name);
}
Run Code Online (Sandbox Code Playgroud)
这会确保调用者会收到指向地图中指针而不是副本的指针吗?这样做是否可以,或者它会尝试调用复制构造函数(并且因为它已被删除而失败)因为它被返回了吗?
假设我必须使用unique_ptr作为我的地图项目.
更新::
在尝试实现代码之后,似乎unique_ptr和std:map /:pair在gcc 4.4.4中不能一起工作,对只是不喜欢unique_ptr作为类型参数.(请参阅无法创建MoveConstructibles的地图).
我将ptr更改为std :: shared_ptr并且一切正常.
我想我可以使用与共享指针相同的代码?
我正在与一群开发人员建立代码库,这些开发人员主要不是计算机科学或软件工程(主要是计算机工程)
我正在寻找一篇关于何时应该捕获异常以及何时应该尝试从中恢复的好文章.我刚才发现一篇文章,我认为解释得很好,但谷歌并没有帮我找到它.
我们正在用C++开发.文章的链接是一种可接受的答案形式,以及带有指针的摘要.我正在这里教书,所以教程格式会很好.正如非软件工程师可以访问的那样.谢谢.
我试图输出共享基类的一组对象共有的函数,我遇到了一些困难.当对象被实例化时,它们存储在一个数组中,然后我尝试使用以下代码来执行此循环中所有对象的共同功能:
if ( truck <= v ) // all types of trucks
Run Code Online (Sandbox Code Playgroud)
vptr是一个对象数组,循环中的函数对所有对象都是通用的.代码编译得很好但是当我运行它时,它进入这个循环时会出现分段错误.我相信在这个循环中对第一个函数的调用是导致问题的原因.
这就是我在前一个循环中实例化对象的方法:
vptr[ i ] = new Vehicle( sn, pc );
Run Code Online (Sandbox Code Playgroud)
我还要提一下,对不起,我忘了从一开始就清楚,在这个数组中,每个对象都是不同的类.它们都共享一个基类,但它们是该类的派生对象.很抱歉忘记了可能很重要的信息.
谢谢nmr
c++ ×7
exception ×4
arrays ×1
c ×1
c# ×1
c++11 ×1
coding-style ×1
constructor ×1
history ×1
if-statement ×1
loops ×1
python ×1
unique-ptr ×1