gpt4 book ai didi

c++ - 将类转换为派生类,而不修改它

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

我正在处理一组类AB,...这些类是独立的,除了它们有一个方法常见的。现在我想将这些类组合在一个 vector 中,以便在一个循环中调用 method。似乎最好的解决方案是使类从某些 Parent 派生类(见下文)。

现在问题如下。我想为每个类(a.hb.h、...)创建一个仅包含 header 的库。在那里我希望类(class)完全独立。只有在主模块中,我想将类“附加”到 Parent 以便能够将它们组合到一个 vector 中。我该怎么做呢?还是我必须求助于 void* 指针的 vector ?还是有另一种方法可以将这些类组合到一个 vector 中?


列表中的类:使用父/子范式

这是我在 vector 中组合类的方法。注意我特别想避免类定义中的父/子范例。但我仍然想将它们组合成一个 vector 。

#include <iostream>
#include <vector>
#include <memory>

class Parent
{
public:
virtual ~Parent(){};
virtual void method(){};
};

class A : public Parent
{
public:
A(){};
~A(){};
void method(){};
};

class B : public Parent
{
public:
B(){};
~B(){};
void method(){};
};

int main()
{
std::vector<std::unique_ptr<Parent>> vec;

vec.push_back(std::unique_ptr<Parent>(new A));
vec.push_back(std::unique_ptr<Parent>(new A));
vec.push_back(std::unique_ptr<Parent>(new B));

for ( auto &i: vec )
i->method();

return 0;
}

使用例如编译

clang++ -std=c++14 main.cpp

最佳答案

基于类型删除、静态成员函数和指向 void 的指针的可能解决方案根本不使用 virtual(示例代码,远非生产-准备就绪):

#include <iostream>
#include <vector>

struct Erased
{
using fn_type = void(*)(void *);

template<typename T>
static void proto(void *ptr) {
static_cast<T*>(ptr)->method();
}

fn_type method;
void *ptr;
};

struct A
{
void method(){ std::cout << "A" << std::endl; };
};

struct B
{
void method(){ std::cout << "B" << std::endl; };
};

int main()
{
std::vector<Erased> vec;

vec.push_back(Erased{ &Erased::proto<A>, new A });
vec.push_back(Erased{ &Erased::proto<B>, new B });

for ( auto &erased: vec ) {
erased.method(erased.ptr);
}

return 0;
}

这有助于避免使用公共(public)基类。在 wandbox 上查看.


如评论中所述,here是一个略微修改的版本,添加了 createinvoke 方法以减少用户的样板文件。

关于c++ - 将类转换为派生类,而不修改它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44700469/

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