gpt4 book ai didi

c++ - 需要动态转换派生类 : looking for an alternative approach

转载 作者:太空狗 更新时间:2023-10-29 23:38:39 27 4
gpt4 key购买 nike

我以这种简单的形式提出我的问题:

class animal {
public:
animal() {
_name="animal";
}

virtual void makenoise(){
cout<<_name<<endl;
}

string get_name(){
return _name;
}

protected:
string _name;
};

class cat : public animal {
public:
cat() {
this->_name="cat";
}
};

class dog : public animal {
public:
dog() {
this->_name = "dog";
}
};

我想将所有动物类型一起存储在一个容器中,例如:

vector<animal*> container;
barnyard.push_back(new animal());
barnyard.push_back(new dog());
barnyard.push_back(new cat());

在我的代码中的某个时刻,我需要将狗对象转换为猫对象。我需要从这个转换中设置一个新的狗对象并将其替换为与猫对应物所在的索引号相同的索引号。据我了解,dynamic_cast 在这种情况下并基于 C++ cast to derived class 不起作用。 ,有人提到这样的转换不是一个好的做法。由于我的模型中的猫和狗具有截然不同的行为属性,因此我不想将它们的定义放入动物模型中。另一方面,将它们分别存储在不同的 vector 中将很难处理。有什么建议吗?

最佳答案

你说:

I need to convert a dog object into a cat object.

然后:

And all I need from this converting is to set up a fresh dog object and replace it at the same index number as a cat counterpart was located.

你需要转换它还是替换它??这是一个完全不同的操作。

要进行转换,您需要设置一个接受狗并返回猫的函数:

auto convertDogToCat(Dog const& dog) -> Cat {
auto cat = Cat{};

// fill cat's member using dog's values...

return cat;
}

但是要用一个新的替换简单地重新分配:

//      v--- a cat is currently there
barnyard[ii] = new Dog{};
// ^--- we replace the old pointer
// with one that points to a dog.

但这会造成内存泄漏,要消除泄漏,只需使用 std::unique_ptr:

#include <memory> // for std::unique_ptr

// The base class need a virtual destructor
class animal {
public:
virtual ~animal() = default;

// other members...
};

std::vector<std::unique_ptr<animal>> barnyard;
barnyard.emplace_back(std::make_unique<animal>());
barnyard.emplace_back(std::make_unique<dog>());
barnyard.emplace_back(std::make_unique<cat>());

barnyard[ii] = std::make_unique<Dog>();

关于c++ - 需要动态转换派生类 : looking for an alternative approach,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57042518/

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