小编aby*_*s.7的帖子

我何时可以将指针与c ++中的同一对象进行比较?

例如,我有一些类层次结构(可能具有各种继承 - 公共,私有,公共虚拟,多继承等):

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逻辑或其他技术?

当我无法比较指向同一复杂对象的指针时,有哪些可能的情况?它可以是什么样的物体?

我希望,所有指向同一对象的指针总是相等的.

c++

5
推荐指数
1
解决办法
722
查看次数

如何在cmake中的当前目录的所有子目录中生成__init__.py?

我在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。

python cmake protocol-buffers

5
推荐指数
2
解决办法
1510
查看次数

如何在 C++ 中对 exec() 进行析构函数友好的调用?

我尝试exec()在 C++ 代码中运行 c 样式函数(带有一些后缀),但提到没有为现有对象调用析构函数。

有没有办法保证在 之前调用所有必需的析构函数(例如程序终止时)exec()

也许,还有另一种方法可以实现exec()在 C++ 中不执行代码的替换?

c++ destructor exec

5
推荐指数
1
解决办法
704
查看次数

C++ 11 lambda不引用const变量,为什么?

试图编译这段代码:

const int a = 1;
auto lambda = [&]() {
  &a;
};
lambda();
Run Code Online (Sandbox Code Playgroud)

在clang ++上一切都很好,但是g ++给出了一个错误:

错误:左值作为一元'&'操作数

我没有找到解释这种行为的任何东西.这是g ++中的错误吗?或者clang ++会错过什么吗?

c++ lambda g++ c++11 clang++

5
推荐指数
1
解决办法
260
查看次数

为什么 list<unique_ptr> 中 unique_ptr 的 std::move() 没有真正移动它?

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()被称为?

c++ rvalue-reference unique-ptr move-semantics c++11

5
推荐指数
1
解决办法
2410
查看次数

如何通过稀疏结账进行 git-rebase?

我有一个启用了稀疏结帐的工作副本。我想做的git rebase -i。但是,如果我在变基时遇到冲突,所有从签出文件中排除的文件都标记为deletednot staged for commit

因此,当我确实解决实际冲突和所需文件时,由于未暂存的更改,git add我仍然无法完成。git rebase --continue我可以git checkout -f -- <excluded files>,但是很不方便。

git-rebase有没有更好的稀疏结账方法?

git git-rebase sparse-checkout

5
推荐指数
1
解决办法
376
查看次数

按值返回由互斥锁保护的shared_ptr是否安全?

这是一个代码示例:

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()吗?

c++ gcc shared-ptr

4
推荐指数
1
解决办法
648
查看次数

如何使用waf编译在运行时生成的c ++源文件?

我在源代码树中有protobuf原型文件.我想在每次更改和第一次运行时从proto文件生成源文件(例如,我创建新的原始文件).然后,我想从这些源文件中编译共享库并将它们保存在源代码树中.

实现目标的最佳方法是什么?

c++ waf

4
推荐指数
1
解决办法
808
查看次数

是否可以在C++中仅构造特定类型的const对象?

我想用以下属性实现该类:

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.


更新#1

由于我不知道答案,因此不需要严格遵循上面的代码 - 任何提供类似语义的C++模式都是受欢迎的.

c++ constructor const c++11

4
推荐指数
1
解决办法
196
查看次数

如何在Python中基类内创建派生类的对象?

我有这样的代码:

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的真实案例.

怎么做?

python inheritance

4
推荐指数
2
解决办法
891
查看次数