#include <iostream>
class A {
public:
A() {}
};
class B : public A{
public:
B() {}
};
void foo(A* a) {
a = new B();
}
void ff() {
A a;
foo(&a);
}
#include <iostream>
class A {
public:
A() {}
};
class B : public A{
public:
B() {}
};
void foo(A** a) {
*a = new B();
}
void ff() {
A* a;
foo(&a);
}
当我看到 leveldb 时,我对此感到困惑。
具体代码如下。
https://github.com/google/leveldb/blob/master/db/db_impl.cc#L1537
我认为可以使用 FileLock lock
然后将 &lock
传递给 LockFile(const std::string& filename, FileLock* lock)
LockFile
函数是 this
答案 0 :(得分:1)
void foo(A* a) {
a = new B();
}
ff()
中。
这只是改变论点。void foo(A** a) {
*a = new B();
}
ff()
根据ff()
,我假设您有一个后续问题,需要在调用a
后操作foo()
。所以第二个可能是一个正确的方法。
对于FileLock
,我相信您指的是这个implementation。
它使用双指针是因为它想替换 FileLock
的全部内容。
因为引用是不可能被替换的,我的假设是它选择了替换整个内容,这比使重新初始化的实现复杂化要简单。