Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在大型C++;自动编码?_C++_Inheritance_Code Analysis_Static Code Analysis_Diamond Problem - Fatal编程技术网

C++ 如何在大型C++;自动编码?

C++ 如何在大型C++;自动编码?,c++,inheritance,code-analysis,static-code-analysis,diamond-problem,C++,Inheritance,Code Analysis,Static Code Analysis,Diamond Problem,() 考虑到有一个非常大的类层次结构,由数十个甚至数百个类组成。继承关系图也非常复杂(如果没有半页大小的箭头:-),doxygen无法呈现它)。还有,可怕的钻石问题来了 考虑一点类似java的编程:任何基类都不可能在任何继承结构中存在多次 还有一个目标,就是最小化虚拟继承的数量 我认为,在这种情况下,情况非常简单:无论我们可以拥有多少或多么复杂的钻石,第二级钻石总是需要从顶部继承,而不是其他 问:这真的足够了吗,或者还有其他原因,因为可能需要一个虚拟继承的基类 因此: 这里红色铅笔的继承箭头需

()

考虑到有一个非常大的类层次结构,由数十个甚至数百个类组成。继承关系图也非常复杂(如果没有半页大小的箭头:-),doxygen无法呈现它)。还有,可怕的钻石问题来了

考虑一点类似java的编程:任何基类都不可能在任何继承结构中存在多次

还有一个目标,就是最小化虚拟继承的数量

我认为,在这种情况下,情况非常简单:无论我们可以拥有多少或多么复杂的钻石,第二级钻石总是需要从顶部继承,而不是其他

问:这真的足够了吗,或者还有其他原因,因为可能需要一个虚拟继承的基类

因此:

这里红色铅笔的继承箭头需要是虚拟的。在这样一个简单的结构中,很容易找到所有这些元素,但在一个大得多的结构中却找不到

找到所有的钻石似乎是一个容易自动化的图形漫游问题。如果任务的解决方案已经不存在,我会感到惊讶


问题是这是否足够?

请看Bjarne Stroustrup的论文,该论文介绍了如何通过为每个类指定素数和复合数来实现快速动态强制转换:


如果你实现了它,也许是通过一些代码处理工具自动实现的,并且发现第二个数字可以被一个平方数整除(或者,一般来说,被p^n整除,其中p是素数),那么你就得到了一个菱形,这个整除器的素数整除器告诉你哪个类是问题的根源。然后你只需要跟踪到你的类(同样,通过
%
操作)。

我认为这太宽泛了,或者是一个软件请求。@NathanOliver,我认为这不会太宽泛。问题很清楚,问题是1)从钻石顶部虚拟继承直接碱基是否足够,2)如何轻松找到它们。从软件请求的角度来看,我认为这是一个边界问题。主要的问题是,理论观点与softwarerecs SE的主题无关(因为这个原因,它不会在这里关闭,但这方面可能会被忽略)。对于这个问题,您到底希望得到什么样的答案?如果您想让工具来做这件事,那么这是一个工具请求和离题。如果你想让人们写一篇文章,沿着你代码的继承路径走,并找到钻石,那么这篇文章就太广泛了,因为有很多不同的方法来实现它。好主意!但是,我认为它限制了类的数量,因为在N个类的情况下(在一个单独的层次结构中),前N个素数的乘法必须用一个(相对)短的整数表示。对于64位整数,它是14;对于128位整数,它是23。在静态代码分析中,即使有65536位整数也不成问题,但在运行时也会很慢。@peterh:您可以随时添加第二个“维”s.t。素数不再是唯一的,但素数对是唯一的。这比BigInt算法快得多。此外,依赖关系树深度超过23级的情况非常罕见,但您可能会遇到一个。在这种情况下,只需将尺寸增加到2、3等。现在我还需要知道,这是否足够,或者在其他情况下需要虚拟继承。也许,如果还有虚拟方法需要被控制覆盖,那么就覆盖虚拟方法而言,你不需要VI,事实上,VI在这方面帮不了你多少忙(如果没有钻石的话)。当您希望最顶层的类指定如何构造对象时,VI也可以使用。事实上,Stroustrup方法的一个可能实现依赖于VI,因此大多数子类都可以调用构造函数。