例如,我有一些类层次结构(可能具有各种继承 - 公共,私有,公共虚拟,多继承等):
class A {
int a;
public:
virtual ~A() {}
};
class B: public A { int b; };
class C: public virtual B { int c; };
class E: public virtual B { int e; };
class F: public C, public E { int f; };
Run Code Online (Sandbox Code Playgroud)
使用强制转换我得到指向主"大"对象的每个子对象的指针:
F * f = new F;
E * e = f;
C * c = f;
B * b = f;
A * a = f;
Run Code Online (Sandbox Code Playgroud)
我可以比较这些指针的哪些对等(运算符==)和为什么?比较是否会使用delta逻辑或其他技术?
当我无法比较指向同一复杂对象的指针时,有哪些可能的情况?它可以是什么样的物体?
我希望,所有指向同一对象的指针总是相等的.
我在CMake中使用树外构建。我有一个CMake自定义命令,可以从原始文件生成* _pb2.py文件。由于原型文件可能位于未知数量的子目录(包命名空间)中,$SRC/package1/package2/file.proto因此构建目录将包含$BLD/package1/package2/file_pb2.py。
我想暗中使自动产生的* _pb2.py文件包,因此,我想,自动将生成的所有子文件夹(__init__.py文件$BLD/package1,$BLD/package1/package2等等),然后安装它们。
我怎样才能做到这一点?
PS我已经尝试从CMake宏:如何获取目录的所有子目录的名称?(将GLOB更改为GLOB_RECURSE),但它仅返回包含文件的子目录。我无法package1从上面的示例获取subdir。
我尝试exec()在 C++ 代码中运行 c 样式函数(带有一些后缀),但提到没有为现有对象调用析构函数。
有没有办法保证在 之前调用所有必需的析构函数(例如程序终止时)exec()?
也许,还有另一种方法可以实现exec()在 C++ 中不执行代码的替换?
试图编译这段代码:
const int a = 1;
auto lambda = [&]() {
&a;
};
lambda();
Run Code Online (Sandbox Code Playgroud)
在clang ++上一切都很好,但是g ++给出了一个错误:
错误:左值作为一元'&'操作数
我没有找到解释这种行为的任何东西.这是g ++中的错误吗?或者clang ++会错过什么吗?
using Ptr = std::unique_ptr<int>;
Ptr f(bool arg) {
std::list<Ptr> list;
Ptr ptr(new int(1));
list.push_back(std::move(ptr));
if (arg) {
Ptr&& obj1 = std::move(list.front());
// Here |obj1| and |list.front()| still point to the same location!
list.pop_front();
return std::move(obj1);
}
else {
Ptr obj2 = std::move(list.front());
list.pop_front();
return obj2;
}
};
Ptr&& ptr1 = f(true); // |ptr1| is empty.
Ptr&& ptr2 = f(false); // |ptr2| is fine.
Run Code Online (Sandbox Code Playgroud)
完整来源在这里。
我不明白-为什么obj1,并list.front()仍然指向相同的位置后,std::move()被称为?
我有一个启用了稀疏结帐的工作副本。我想做的git rebase -i。但是,如果我在变基时遇到冲突,所有从签出文件中排除的文件都标记为deleted和not staged for commit。
因此,当我确实解决实际冲突和所需文件时,由于未暂存的更改,git add我仍然无法完成。git rebase --continue我可以git checkout -f -- <excluded files>,但是很不方便。
git-rebase有没有更好的稀疏结账方法?
这是一个代码示例:
class A {
boost::mutex a_mutex;
boost::shared_ptr<int> a;
boost::shared_ptr<int> clone_a(void) {
boost::lock_guard<boost::mutex> lock(a_mutex);
return a;
}
};
Run Code Online (Sandbox Code Playgroud)
建议尽管编译器优化,但boost::shared_ptr复制构造函数调用A::a将在boost::lock_guard析构函数调用之前.所以,打电话安全A::clone_a()吗?
我在源代码树中有protobuf原型文件.我想在每次更改和第一次运行时从proto文件生成源文件(例如,我创建新的原始文件).然后,我想从这些源文件中编译共享库并将它们保存在源代码树中.
实现目标的最佳方法是什么?
我想用以下属性实现该类:
class A { ... };
const A a; // ok - should work.
A b; // compilation error - shouldn't work!
Run Code Online (Sandbox Code Playgroud)
此外,如果const对象的ness取决于构造函数签名,那会更好:
const A c(1); // ok - should work.
A d("a"); // ok - should work.
A e(2); // compilation error - shouldn't work!
Run Code Online (Sandbox Code Playgroud)
如果需要,允许使用C++ 11.
由于我不知道答案,因此不需要严格遵循上面的代码 - 任何提供类似语义的C++模式都是受欢迎的.
我有这样的代码:
class Base:
def __init__(self):
pass
def new_obj(self):
return Base() # ? return Derived()
class Derived(Base):
def __init__(self):
pass
Run Code Online (Sandbox Code Playgroud)
在带注释的行中,我实际上并不想要完全是Derived对象,而是self实际上是类的任何对象.
以下是Mercurial的真实案例.
怎么做?
c++ ×7
c++11 ×3
python ×2
clang++ ×1
cmake ×1
const ×1
constructor ×1
destructor ×1
exec ×1
g++ ×1
gcc ×1
git ×1
git-rebase ×1
inheritance ×1
lambda ×1
shared-ptr ×1
unique-ptr ×1
waf ×1