为什么C ++容器不允许使用抽象类类型不完全类型

个回答天前请注意,数组语义和语法在Xcode beta 3版本()中已更改,所以此问题不再适用。 以下答案适用于beta 2:这是出于性能原因。 基本上,他们尽可能避免复制数组(并声称“类似C的性能”)。 引用语言:对于数组,只有在执行可能修改数组长度的操作时才会进行复制。 这包括追加,插入或删除项目,或使用范围下标替换数组中的一系列项目。我同意这有点令人困惑,但至少对它的工作方式有一个清晰而简单的描述。该部分还包括如何确保数组被唯一引用的信息,如何强制复制数组以及如何检查两个数组是否共享存储。天前
var a = [1, 2, 3]
var b = a.copy()
a[1] = 42 天前许多Swift早期使用者抱怨这种容易出错的数组语义,Chris Lattner写到数组语义已经修改为提供完整价值的语义()。 我们将不得不至少等待下一个测试版,才能看到这意味着什么。天前Delphi的字符串和数组具有完全相同的“功能”。当你看到实现时,它是有道理的。每个变量都是一个指向动态内存的指针。该内存包含引用计数,后跟数组中的数据。因此,可以轻松更改数组中的值,而无需复制整个数组或更改任何指针。如果你想调整数组的大小,你必须分配更多的内存。在这种情况下,当前变量将指向新分配的内存。但是你不能轻易地追踪指向原始数组的所有其他变量,所以你不要管它们。当然,要实现更一致的实施并不困难。如果希望所有变量都能看到调整大小,请执行以下操作:每个变量都是指向存储在动态内存中的容器的指针。该容器包含两件事情,一个引用计数和指向实际数组数据的指针。阵列数据存储在一个单独的动态存储器块中。现在只有一个指向数组数据的指针,因此可以轻松调整它的大小,并且所有变量都会看到更改。天前我发现的是:当且仅当操作有可能改变数组的长度时,数组才是被引用数组的可变副本。 在你的最后一个例子中,f [0..2]用很多索引,操作有可能改变它的长度(可能是不允许重复),所以它被复制。var e = [1, 2, 3]
e[0..2] = [4, 5]
e // 4,5,3
f // 1,2,3
var e1 = [1, 2, 3]
var f1 = e1
f1 // - 4,5,3天前对我来说,如果首先用变量替换常量,这就更有意义了:a[i] = 42
e[i..j] = [4, 5]
// (2)第一行永远不需要改变a的大小。特别是,它永远不需要做任何内存分配。不管我的价值如何,这是一个轻量级的操作。如果你认为引擎盖下是一个指针,它可以是一个常量指针。第二行可能要复杂得多。根据i和j的值,可能需要执行内存管理。如果你想象e是一个指向数组内容的指针,你不能再假定它是一个常量指针;您可能需要分配一个新的内存块,将数据从旧的内存块复制到新的内存块,然后更改指针。看起来,语言设计者试图保持(1)尽可能的轻量级。由于(2)无论如何都可能涉及复制,他们已经采取了一种解决方案,即它总是像您复制一样。这很复杂,但我很高兴他们没有让它变得更复杂,例如,特殊情况下,如“如果在(2)我和j是编译时常量,并且编译器可以推断e的大小不会改变,那么我们不会复制”。天前该行为与Array.Resize.NET中的方法非常相似。为了理解发生了什么,查看.C,C ++,Java,C#和Swift中令牌的历史记录可能会有帮助。在C中,结构不过是变量的集合。应用.到结构类型的变量将访问存储在结构中的变量。对象指针不持有的变量聚合,但识别它们。如果有一个标识结构的指针,那么-&操作符可以用来访问存储在由指针标识的结构中的变量。在C ++中,结构和类不仅可以聚合变量,还可以将代码附加到它们。使用.调用一个方法会让一个变量请求该方法对变量本身的内容进行操作 ; -&在标识对象的变量上使用将要求该方法作用于由变量标识的对象。在Java中,所有自定义变量类型都只是标识对象,并且在变量上调用方法会告诉方法变量标识了哪个对象。变量不能直接持有任何类型的复合数据类型,也没有任何方法可以访问被调用的变量。这些限制虽然在语义上受到限制,但极大地简化了运行时,并且便于字节码验证; 在市场对此类问题敏感的时候,这样的简化降低了Java的资源开销,从而帮助它在市场中获得了推动力。它们也意味着不需要.与C或C ++中使用的令牌相同的令牌。尽管Java可以-&像C和C ++一样使用,但创建者选择使用单字符. 因为它不需要用于任何其他目的。在C#和其他.NET语言中,变量可以标识对象或直接保存复合数据类型。在复合数据类型的变量上使用时,会影响变量.的内容 ; 当在一个参考类型的变量上使用时,会对.所识别的对象起作用通过它。对于某些类型的操作,语义上的区别并不特别重要,但对于其他类型的操作来说则是如此。最有问题的情况是在只读变量上调用复合数据类型的方法,该方法将修改调用它的变量。如果尝试在只读值或变量上调用方法,编译器通常会复制该变量,让该方法作用于该变量,然后放弃该变量。对于只读取变量的方法而言,这通常是安全的,但使用写入方法的方法不安全。不幸的是,.does还没有任何方法可以指出哪些方法可以安全地用于这种替换,哪些方法不能。在Swift中,聚合方法可以明确指出它们是否会修改它们被调用的变量,编译器将禁止在只读变量上使用变异方法(而不是让它们变异变量的临时副本被丢弃)。由于这个区别,使用.标记来调用修改它们被调用的变量的方法在Swift中比在.NET中更安全。不幸的是,同样的.道理被用于这个目的,以便作用于由变量标识的外部对象意味着混淆的可能性仍然存在。如果有时间机器并回到C#和/或Swift的创建阶段,人们可以通过使语言使用.和-&令牌的方式更接近于C ++的使用方式来追溯地避免围绕这些问题带来的困惑。聚集体和参考类型的方法可以用来.对它们被调用的变量进行操作,并且-&对一个值(对于复合体)或对其进行识别的事物(对于参考类型)进行操作。但是,这两种语言都不是这样设计的。在C#中,修改调用该变量的方法的正常做法是将变量作为ref参数传递给方法。因此,Array.Resize(ref someArray, 23);在someArray标识包含20个元素的数组时,如果调用将会导致someArray识别23个元素的新数组,而不会影响原始数组。使用ref明确表明该方法应该被期望修改它被调用的变量。在很多情况下,无需使用静态方法即可修改变量,这是有利的。Swift地址意味着使用.语法。缺点是它失去了澄清哪些方法对变量起作用,以及哪些方法对价值起作用。天前该行为已随Xcode 6 beta 3而改变。阵列不再是引用类型,并具有写入时复制机制,这意味着只要从一个或另一个变量中更改数组的内容,数组就会被复制,而只有 一个副本将被更改。如果可能的话,Swift会尽量避免复制数组,包括。如果你想确保一个数组变量是唯一的,即不与另一个变量共享,你可以调用unshare方法。 这会复制数组,除非它只有一个引用。 当然,你也可以调用复制方法,它总是复制一份,但取消共享是首选,以确保没有其他变量持有相同的数组。var a = [1, 2, 3]
b.unshare()
// [1, 42, 3]
// [1, 2, 3]天前:请注意,当使用下标语法设置新值时,数组不会被复制,因为使用下标语法设置单个值不具有更改数组长度的潜力。 但是,如果将新项目追加到数组中,则可以修改数组的长度。 这会提示Swift在添加新值的时候创建数组的新副本。 此后,a是阵列的独立副本......根据的相对分子质量小于,碳原子数目小于,且含有苯环和一个侧链,并且分子中的所有碳原子在同一平面内,可以推知其碳原子数目在个或个,若为个碳原子,即为苯乙烯或苯乙炔,由于,含有相同的官能团,这时与的结构完全相同,而可以反应银镜反应,故的碳原子数目只能为个,故为,由于碳骨架完全相同,故为.的其二溴代物只一种的同分异构体,考虑不同取代基处于对位,其结构简式为.经一步反应可转化为,既能发生银镜反应,又能发生酯反应,不可能既含有又含有,只能含有,,再结合信息可得的结构简式为.和互为同分异构体,都能发出酯化反应,并且含有一种相同的官能团,由于羟醛与羧酸为官能团异构,可得的结构简式为或,经一步反应可以转化为,为醇的消去反应,故为,据此解答.
解:根据的相对分子质量小于,碳原子数目小于,且含有苯环和一个侧链,并且分子中的所有碳原子在同一平面内,可以推知其碳原子数目在个或个,若为个碳原子,即为苯乙烯或苯乙炔,由于,含有相同的官能团,这时与的结构完全相同,而可以反应银镜反应,故的碳原子数目只能为个,故为,由于碳骨架完全相同,故为.的苯环一溴代物有两种同分异构体,考虑不同取代基处于对位,其结构简式为.经一步反应可转化为,既能发生银镜反应,又能发生酯反应,不可能既含有又含有,只能含有,,再结合信息可得的结构简式为.和互为同分异构体,都能发出酯化反应,并且含有一种相同的官能团,由于羟醛与羧酸为官能团异构,可得的结构简式为或,经一步反应可以转化为,为醇的消去反应,故为,由上述分析可知,的结构简式为,其苯环一溴代物有两种的同分异构体,考虑不同取代基处于对位,其结构简式为,故答案为:,;转化为是或在浓硫酸,加热的条件下发生消去反应生成,故答案为:浓硫酸,加热,消去反应;发生的银镜反应为:,与足量的反应为:,在一定条件下生成高聚物的反应为:或,故答案为:,,或.
本题考查有机物的推断与合成,难度中等,推断的结构是解题的关键,注意根据官能团的性质与题目信息进行推断,对学生的逻辑推理由较高的要求.
1542@@3@@@@有机物的推断@@@@@@131@@Chemistry@@Senior@@$131@@2@@@@有机化合物的组成与结构@@@@@@23@@Chemistry@@Senior@@$23@@1@@@@常见有机物及其应用@@@@@@3@@Chemistry@@Senior@@$3@@0@@@@高中化学@@@@@@-1@@Chemistry@@Senior@@
第二大题,第4小题
求解答 学习搜索引擎 | 第28届夏季奥运会在北京成功举办,向世界人民展示了中国人的风采和北京的魅力.奥运五环象征着五大洲的团结以及全世界运动员以公正,坦率的比赛和友好的精神."北京欢迎您"不仅是北京奥运会的主题歌也是吉祥物的"名字"也正好是五个环相一致(如图所示).若奥运五环中的每一个环代表一种有机物,分别为A,B,C,D,E.已知:a,它们都是芳香族化合物,均含有一个苯环且碳骨架完全相同,苯环上仅有一个侧链.b,五个圆环之间相互套接处\textcircled{1}和\textcircled{2},\textcircled{3}和\textcircled{4},\textcircled{5}和\textcircled{6},\textcircled{7}和\textcircled{8}分别表示两种有机物含有一种相同的官能团.c,A分子中仅含有碳,氢两种元素,相对分子质量小于120,分子中的所有碳原子在同一平面内.d,B和C能发生银镜反应,C,D,E能发生酯反应,C和D互为同分异构体,C经一步反应可转化为B,D经一步反应可以转化为E.e,多个羟基连在同一个碳原子,则该有机物不能稳定存在,碳碳双键,叁键碳原子上一般不再连有羟基.(1)A的结构简式为___.其一溴代物有两种的同分异构体为___.(2)D转化为E的条件为___,该反应类型为___.(3)写出下列转化的化学方程式:B发生的银镜反应___;C与足量的E反应___;D在一定条件下生成高聚物的反应___.扫二维码下载作业帮
拍照搜题,秒出答案,一键查看所有搜题记录
下载作业帮安装包
扫二维码下载作业帮
拍照搜题,秒出答案,一键查看所有搜题记录
下列说法正确的是(  )A.过氧化钠与氮化镁所含化学键类型不完全相同B.△H>0,△S<0的反应一定不能发生C.工业上用电解法粗铜精炼时,电路中转移1mol电子,阳极上溶解铜的质量等于32gD.海水淡化能解决淡水供应危机,向海水中加入明矾净水剂能使海水淡化
作业帮用户
扫二维码下载作业帮
拍照搜题,秒出答案,一键查看所有搜题记录
A.过氧化钠中含有离子键与共价键,氮化镁中只含有离子键,所含化学键类型不完全相同,故A正确;B.△H>0,△S<0,△G=△H-To△S>0,所有温度都不能自发进行,但不是说反应一定不能发生,故B错误;C.电解过程中...
为您推荐:
A.过氧化钠中含有离子键与共价键;氮化镁中只含有离子键;B.反应能自发,应满足△G=△H-To△S<0,结合反应的△H和△S进行判断;C.电解精炼铜,阳极失电子的是铜、铁、锌、镍;D.明矾不能使海水淡化;
本题考点:
钠的重要化合物;反应热和焓变;盐类水解的应用;电解原理.
考点点评:
本题主要考查了化学键、反应的自发性、电解原理、明矾净水原理等知识,难度中等,注意知识的运用.
扫描下载二维码编译Linux时出现:“错误:数组元素的类型不完全”_Linux编程_Linux公社-Linux系统门户网站
你好,游客
编译Linux时出现:“错误:数组元素的类型不完全”
来源:Linux公社&
作者:Linux编辑
系统: Core4
内核:2.6.11.1
出现错误:
1、CC drivers/i2c/i2c-core.oIn file included from drivers/i2c/i2c-core.c:29:include/Linux/i2c.h:58: error: array type has incomplete element typeinclude/Linux/i2c.h:197: error: array type has incomplete element typedrivers/i2c/i2c-core.c: In function ‘i2c_transfer’:drivers/i2c/i2c-core.c:594: error: type of formal parameter 2 is incompletedrivers/i2c/i2c-core.c: In function ‘i2c_master_send’:drivers/i2c/i2c-core.c:620: error: type of formal parameter 2 is incompletedrivers/i2c/i2c-core.c: In function ‘i2c_master_recv’:drivers/i2c/i2c-core.c:649: error: type of formal parameter 2 is incompletemake[2]: *** [drivers/i2c/i2c-core.o] 错误 1make[1]: *** [drivers/i2c] 错误 2make: *** [drivers] 错误 2
解决方法:
将include/Linux/i2c.h中第58,197行内struct i2c_msg msg[]改为struct i2c_msg *msg
2、In file included from drivers/media/video/bttv-driver.c:42:
drivers/media/video/bttvp.h:233: 错误:数组元素的类型不完全
不允许类型在声明前使用,因此调换次序就可以顺利通过。
相关资讯 & & &
& (09/30/:22)
& (02/26/:31)
& (06月23日)
& (05/24/:25)
& (12/09/:01)
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款

我要回帖

更多关于 c 不允许使用类型名 的文章

 

随机推荐