相关疑难解决方法(0)

1730
推荐指数
11
解决办法
54万
查看次数

仅使用基类指针复制派生实体(没有详尽的测试!) - C++

鉴于由派生类的继承过多基类,这需要您通过基类指针,每个实体管理这些程序结构.当只知道基类指针时,是否有一种简单的方法来复制整个派生对象?

环顾四周似乎可能(如果非常繁琐)使用dynamic_cast调用来检查基类指针是否可以作为适当的派生类进行转换,然后使用派生类的复制构造函数复制它.然而,这并不是一个真正的最佳解决方案,部分原因是由于过度使用了dynamic_cast,而且它会让人感到头疼,难以维持和扩展.

我遇到的另一个更优雅的解决方案如下:

class Base
{
public:
   Base(const Base& other);
   virtual Base* getCopy();
   ...
}

class Derived :public Base
{
   Derived(const Derived& other);
   virtual Base* getCopy();
   ...
}

Base* Base::getCopy()
{
   return new Base(*this));
}

Base* Derived::getCopy()
{
   return static_cast<Base*>(new Derived(*this));
}
Run Code Online (Sandbox Code Playgroud)

然后通过调用getCopy()指向任何派生对象的Base类指针,仍然可以返回一个基类指针,但也复制了整个派生对象.这种方法感觉更易于维护,因为它只需要getCopy()在所有派生类中使用类似的函数,并且不需要针对所有可能的派生对象进行测试.

从本质上讲,这是明智的吗?或者有更好,更简洁的方式吗?

c++ inheritance pointers copy-constructor

36
推荐指数
1
解决办法
1万
查看次数

为什么 std::move 不会在默认移动构造函数中将源变量更改为默认值?

我试图理解移动构造函数。

我在类的构造函数中分配内存并在析构函数中销毁它。

当我尝试移动类时,我仍然有一个双空闲。

#include <algorithm>

class TestClass
{
 public:
  TestClass() {a_ = new int[1];}
  TestClass(TestClass const& other) = delete;
  TestClass(TestClass && other) noexcept // = default;
  {
    this->a_ = std::move(other.a_);
  }
  ~TestClass() {delete[] a_;}
 private:
  int* a_ = nullptr;
};

int main( int argc, char** argv )
{
  TestClass t;
  TestClass t2 = std::move(t);
}
Run Code Online (Sandbox Code Playgroud)

为什么std::move不改为 nullptr other.a_

如果移动构造函数是默认的,我也有同样的问题。

我发现了以下问题,但我仍然不知道为什么移动运算符不将源变量更改为默认值。

std::move 如何使原始变量的值无效?

C++如何将对象移动到nullptr

C++ std::move 一个指针

c++ move-semantics c++11 stdmove

2
推荐指数
1
解决办法
140
查看次数