C++ FAQ说:
"尽可能使用引用,并在必要时使用引用."
我觉得它不像上面说的那么容易.已经很好地讨论了引用通常对指针更好的原因.所以我宁愿讨论特殊情况,其中引用有意义,但非常不寻常,只是感觉不对:
对我来说,最明显的情况是它们在一般数据结构(如树或链表)中的使用.他们的接口当然可以使用引用来实现并且感觉更安全,但是我还没有看到可以利用引用的单个实现,例如:
Node *parent = n.parent(); // parent might be unset -> pointer
Node &child = n.child(5); // child is always valid -> reference
Run Code Online (Sandbox Code Playgroud)
虽然它看起来很有吸引力,但它会导致代码如下:
if(parent == &child) ... // weird, unusual at least?
Run Code Online (Sandbox Code Playgroud)
我想知道,这是什么代表纯C++?
每当我试图在任何可能的地方盲目地使用引用时,我都会遇到各种类似的不一致,并最终以各种丑陋的方式混合指针和引用.
总而言之,为什么operator new不首先返回对新实例的引用而不是指针?(并在出现错误时抛出):
Node &n = new Node;
delete &n;
Run Code Online (Sandbox Code Playgroud)
这是一个荒谬的例子,但这不是"纯粹的C++"吗?
我有一个由自定义QAbstractItemModel表示的节点层次结构.是否有可能创建一个代理模型,将层次结构展平为一个列表,以允许我在QListView中显示所有节点/项目(没有代理只有树的第一级呈现)?
A A
+---1 1
2 2
+--3 3
4 => 4
B B
+---5 5
6 6
+--7 7
8 8
Run Code Online (Sandbox Code Playgroud)
谢谢,FipS
import ctypes as ct
class Point(ct.Structure):
_fields_ = [
('x', ct.c_int),
('y', ct.c_int),
]
p1 = Point(10, 10)
p2 = Point(10, 10)
print p1 == p2 # => False
Run Code Online (Sandbox Code Playgroud)
等式运算符 ' == '在上面的琐碎情况下给出False。有没有直接的方法?
编辑:
这是一个稍微改进的版本(基于接受的答案),它也可以处理嵌套数组:
import ctypes as ct
class CtStruct(ct.Structure):
def __eq__(self, other):
for field in self._fields_:
attr_name = field[0]
a, b = getattr(self, attr_name), getattr(other, attr_name)
is_array = isinstance(a, ct.Array)
if is_array and a[:] != b[:] or not is_array and a != b:
return False
return …Run Code Online (Sandbox Code Playgroud)