gpt4 book ai didi

c++ - 更改对象的类:可能使用 std::move?

转载 作者:搜寻专家 更新时间:2023-10-31 00:09:20 24 4
gpt4 key购买 nike

我知道一旦创建了一个对象,我就不能乱用 V 表(以一种有点理智的方式)。这意味着我必须复制一个对象来改变它的类型。这是否也适用于 c++11 的 std::move 和 friend ?

class Base {
public:
virtual int type() = 0;

// more data members I want to avoid to copy
};

class D1 : public Base {
public:
int type() {
return 1;
}
};

class D2 : public D1 {
public:
int type() {
return 2;
}
};


int main()
{
// creating the actual object, type is D1
D1* obj = new D1();

// this is what does not work, I want to "change" the object to D2
D2* obj2 = &std::move<D2>(*obj);

// cast it to obj2 base class
Base* baseObj = static_cast<D1*>(obj2);

// now I want a "2" here
int t = baseObj->type();
printf ("%d\n", t);
}

我不太了解移动语义...但是有什么东西可以让我在类型安全的情况下将 D1 对象更改为 D2(反之亦然)吗? (这两个类从内存布局上看几乎是一样的)

最佳答案

虽然您无法更改现有对象的类型,但您可以轻松地更改指针成员的动态 类型并实现所需的效果。这称为策略设计模式

例如:

#include <memory>
#include <iostream>

class Host
{
struct Strategy
{
virtual ~Strategy() = default;
virtual int type() const = 0;
};

struct StrategyA : Strategy { int type() const override { return 1; } };
struct StrategyB : Strategy { int type() const override { return 2; } };

std::unique_ptr<Strategy> strategy_;

public:
Host()
: strategy_(new StrategyA)
{}

int type() const { return strategy_->type(); }

void change_strategy(int type) {
switch(type) {
case 1: strategy_.reset(new StrategyA); break;
case 2: strategy_.reset(new StrategyB); break;
default: std::abort();
}
}
};


int main() {
Host host;
std::cout << host.type() << '\n';
host.change_strategy(2);
std::cout << host.type() << '\n';
}

关于c++ - 更改对象的类:可能使用 std::move?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43874843/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com