我使用C++的个人风格总是把类声明放在一个包含文件中,并在.cpp文件中定义,非常类似于Loki对C++头文件,代码分离的回答.不可否认,我喜欢这种风格的部分原因可能与我花费编码Modula-2和Ada的所有年份有关,两者都有与规范文件和正文文件类似的方案.
我有一个同事,比我更了解C++,他坚持认为所有的C++声明应尽可能在头文件中包含定义.他并不是说这是一种有效的替代风格,甚至是一种稍微好一点的风格,而是这是每个人现在都用于C++的新普遍接受的风格.
我不像以前那样柔软,所以我并不急于拼抢他的这个潮流,直到我看到更多的人和他在一起.那个成语真的有多常见?
只是给出答案的一些结构:它现在是The Way,非常常见,有点普遍,不常见,还是出错?
我尝试使用Google搜索并在线阅读一些代码段.为什么Ada是一种"安全关键"语言?我注意到的一些事情是
其余的语法我要么不理解,要么没有看到它如何帮助它成为'安全关键'.这些是一些观点,但我看不出大局.它是否具有我没有看到的合同设计?它是否有规则使代码编译更难(如果有的话,那么它们是什么?)为什么它是一种"安全关键"语言?
我的同事是0 2上的问题,他一直激励着(1,2),所以我想我应该给他一个机会,迎头赶上.
我们最近的分歧是关于将"const"放在声明上的样式问题.
他认为它应该在类型前面,或者在指针之后.原因在于,这是其他人通常所做的事情,其他风格可能会让人感到困惑.因此,指向常量int的指针和指向int的常量指针将分别为:
const int *i;
int * const i;
Run Code Online (Sandbox Code Playgroud)
但是,无论如何我很困惑.我需要的是一致的,易于理解的规则,我可以做的"常量"意义上的唯一方法是,它去后,它被修改的事情.有一个例外允许它在最终类型前面,但这是一个例外,所以如果我不使用它,它会更容易.
因此,指向常量int的指针和指向int的常量指针将分别为:
int const * i;
int * const i;
Run Code Online (Sandbox Code Playgroud)
作为一个额外的好处,以这种方式做事使得更深层次的间接更容易理解.例如,指向int的常量指针的指针显然是:
int * const * i;
Run Code Online (Sandbox Code Playgroud)
我的论点是,如果有人只是按照自己的方式学习,他们就可以轻松搞清楚上面的内容.
这里的最终问题是他认为将int放在int之后是如此难以言喻的丑陋,对可读性有害,以至于它应该在样式指南中被禁止.当然,我认为如果指南应该建议按照我的方式做,但无论哪种方式,我们都不应该禁止一种方法.
编辑: 我已经得到了很多好的答案,但没有一个真正直接解决我的最后一段("最终问题").很多人都争论一致性,但在这种情况下是如此理想,禁止其他方式这样做是一个好主意,而不是仅仅劝阻它?
当我在线时似乎每个人都同意在源代码管理中使用独占锁定工作流程是一件坏事.我看到的所有新版本控制系统似乎都是为编辑和合并工作流而构建的,许多甚至根本不支持独占锁.
然而,我与之合作的每个人都认为,对于任何源控制系统来说,排他锁都是"必备",而以任何其他方式工作将是一场噩梦.即使是最近从其他公司招聘的员工也似乎也有这个想法.
我的问题不是谁是对的.我很确定我会得到什么答案.我的问题是,这个问题真的还有争论吗?是否有一个诚实的"亲锁"营地,这是一个严重的案件?是否正在进行任何工作以推进基于锁定模型的版本控制技术?还是锁定风扇鞭打死马?
编辑:迄今为止的答案已经很好地解释了为什么独占锁是一个偶尔使用的好功能.不过,我说的是促进地方独占锁用于工作流的一切.
规则引擎和专家系统有什么区别?
例1:假设我有一个程序来确定新驾驶执照的到期日期.它需要签证有效期,护照号码,生日等输入.它根据此输入确定驾驶执照的到期日期.如果输入没有足够的有效标识来允许新的驾驶执照,它甚至会出错.
例2:假设我正在制作游戏Monopoly的在线版本.我希望能够改变比赛的规则(比如传球去400美元,或者没有人可以购买房产,直到他们两次落在同一个房产上等).我在代码中有一个模块来处理这些规则.
这些都是规则引擎还是专家系统?它们看起来都很相似.它只是一个同义词吗?
下面是ada中的一些代码
with TYPE_VECT_B; use TYPE_VECT_B;
Package TEST01 is
procedure TEST01
( In_State : IN VECT_B ;
Out_State : IN OUT VECT_B );
function TEST02
( In_State : IN VECT_B ) return Boolean ;
end TEST01;
Run Code Online (Sandbox Code Playgroud)
TYPE_VECT_B包规范和主体也在下面定义
Package TYPE_VECT_B is
type VECT_B is array (INTEGER range <>) OF BOOLEAN ;
rounded_data : float ;
count : integer ;
trace : integer ;
end TYPE_VECT_B;
Package BODY TYPE_VECT_B is
begin
null;
end TYPE_VECT_B;
Run Code Online (Sandbox Code Playgroud)
变量In_State和Out_State实际上意味着什么?我认为In_State表示输入变量.我只是对Out_State的含义感到困惑?
我是一名计算机科学专业的学生,所以我不知道那么多.
我最近和一位刚接受(java)软件开发人员工作的朋友谈话.他告诉我,在他的工作中,有一个人在C++方面很有经验,但不幸的是,每当他用java编写代码时,他都会使用try-catch来控制程序的流程.据我的朋友说,这是一种错误的Java风格.这是真的?在C++和Java之间使用try-catch(最终在java中)有什么不同(如果有的话)?
这个问题是由于一些混合语言编程而产生的.我有一个我想用C++代码调用的Fortran例程.Fortran通过引用传递其所有参数(除非您另有说明).
所以我认为在我的C++代码中我会聪明(糟糕的开始)并定义类似这样的Fortran例程:
extern "C" void FORTRAN_ROUTINE (unsigned & flag);
Run Code Online (Sandbox Code Playgroud)
这段代码工作了一段时间,但(当然,当我需要离开时)突然开始吹回电话.清除指示一个munged调用堆栈.
一位工程师来到我身后,解决了这一问题,宣布该程序必须在C定义++作为
extern "C" void FORTRAN_ROUTINE (unsigned * flag);
Run Code Online (Sandbox Code Playgroud)
除了两件事,我接受了.一个是编译器不通过引用传递引用参数似乎相当直观,而且我无法在任何地方找到这样的文档.另一个是他同时在那里改变了大量其他代码,所以理论上它可能是另一个修改问题的修改.
所以问题是,C++如何实际传递参考参数?是否可以免费为小值或其他东西进行复制,复制?换句话说,参考参数在混合语言编程中是完全无用的吗?我想知道所以我再也没有犯同样的代码杀戮错误.
C++ std::mutex
没有移动构造函数.这是有充分理由的.基本上,移动构造函数本身通常不是线程安全的,并且互斥体的全部意义在于多个线程将尝试同时访问它.
不幸的是,互斥不能直接放入容器中.容器需要能够安全地移动其内容,而您不能使用互斥锁.
简单的方法是用一个单独的互斥锁保护整个容器.但是假设我想要比那更精细的控制?如果我通过容器(例如:)实现数据库std::map
,那么想要锁定单个记录的能力似乎是合理的,而不仅仅是整个数据库.
我想到的下一件事就是通过使用来破解问题std::unique_ptr
.那会编译,但它并没有真正改变基本问题,是吗?移动存在问题的情况是,在使用该容器条目时,容器thread1
更改会导致条目移动thread2
.在这种情况下,thread2
可能很容易最终持有一个被破坏的条目或智能指针.似乎无论如何,你最终都必须在做任何事情之前用互斥锁锁定整个容器.
似乎应该有一个已知的习惯用于做这些事情.