gpt4 book ai didi

c++ - 一种成员数据类型不同的对象的工厂模式?

转载 作者:行者123 更新时间:2023-11-30 04:18:13 25 4
gpt4 key购买 nike

当我尝试为这样的事情实现工厂模式时,我一遍又一遍地遇到同样的难题:

class Base {
template <typename T>
void doSomethingWithMember(T){
}
void doing(){
doSomethingWithMember(this->a);
}
private:
int a;
};
class A: public Base {
double a;
};
class B: public Base{
float a;
};

struct Dictionary {
typedef Base* (*FunctionPointer)(void);
std::map <int, FunctionPointer> fmap;

template <typename Target>
static Base* construct() {
return new Target();
}

Dictionary() {
fmap.insert(std::make_pair(0, &Dictionary::construct<A>));
fmap.insert(std::make_pair(1, &Dictionary::construct<B>));
}

Base* Call( int i ) const {
std::map<int, FunctionPointer>::const_iterator entry = fmap.find( i );
return entry == fmap.end() ? new Base() : (*entry->second)();
}
};

问题是,我无法定义 aBase因为在最好的情况下它会被隐藏起来。但是没有 a 的定义我无法为继承人实现一个功能来应对他们的 a .我还尝试过实现 Base作为一个模板,这导致了在通过字典创建对象时我总是必须知道返回数据类型(int、double、float)的问题——说我没有 Base<int> 的基本对象类型。 , Base<float> , Base<double> .我确实需要字典根据 i 给我一个对象除了i,我什么都不知道.

最佳答案

你制作 Base 的问题模板是您失去了共同基础。但是,您可以通过使派生类成为模板来取回它。例如:

struct Base {
virtual ~Base() { }
};
template<typename T>
struct Derived : Base {
private:
T a;
};

通过以上,你可以返回一个Base *同时让你的工厂 build Derived<X> .你的 construct() 函数看起来像这样:

template<typename T>
static Base *construct() {
return new Derived<T>();
}

任何需要操作a的函数将被放入 Derived<T> ,因为 Derived是一个模板,您只需实现一次。

关于c++ - 一种成员数据类型不同的对象的工厂模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16570386/

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