gpt4 book ai didi

c++ - 了解多态设计 (C++)

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:20:09 24 4
gpt4 key购买 nike

基于我的动态语言背景,我发现我在使用静态类型语言(例如 C++)表达我的意图时遇到了问题。

我正在为我的应用程序设计一个偏好系统。由于每个偏好都会有一些关联值(默认值、限制、观察者函数...),我决定将每个偏好封装在它自己的对象中。这是我的初稿:

class Preference    // purely abstract class
{
parseFromString(String s) = 0;
get() = 0;
void set(newVal) = 0;
private:
// internal data
};

现在我需要创建一些派生类,如 IntPreferenceFloatPreferenceStringPreference。他们的声明如下所示:

class IntPreference : Preference          class StringPreference : Preference
{ {
int parseFromString(String s); String parseFromString(String s);
void set(int newVal); void set(String newVal);
// etc. // etc.
} }

现在 set() 方法在 IntPreference 类中接受一个 int 参数和一个 String 参数在 StringPreference 中,无法在基类中声明此函数。 parseFromString() 的返回值也是如此。我知道这在 C++ 中是不可能做到的,因为在派生类中具有相同名称和不同参数类型的函数只会掩盖,而不是覆盖它们的祖先。同样,这就是我用动态语言表达自己的方式,C++ 中的正确模式是什么?

编辑:抱歉,我忘了说我需要一个基类来将它们全部存储在哈希表中:

Hash(const char *name, Preference pref);

最佳答案

你现在拥有的是一个糟糕的 boost::any 类,你也许应该只需使用它即可。

您的 parseFromString() 成员函数有问题。你使用动态类型来决定从字符串中解析出什么总是必须静态地知道。

class my_any {
public:
template<typename T>
explicit // don't rely on conversions too much
my_any(const T& t) : x_(t) {}

// might throw if the cast fails
template<typename T>
T& get() { return boost::any_cast<T&>(x_); }

// also maybe move semantics
template<typename T>
set(const T& t) { x_ = t; }
private:
boost::any x_;
};

// usage:
my_any m;
m.set(23);
try {
int& x = m.get<int>();
catch(boost::bad_any_cast& ex) {
// ...
}

// for setting things from string just do
// the right thing at the call site of set

如果您不喜欢模板,您可以简单地提供一些默认值:

my_any::getInt(); my_any::getString();

编辑:如果 boost::any 对你来说太普通了,你想限制您对一组特定值的构造使用boost::变体。虽然变体对编译的影响更大时间,对于初学者来说可能很难使用。

EDIT2:哈希表问题:

typedef boost::unordered_map<std::string, my_any> preference_table;
preference_table t;
// i added a template constructor to my_any
t.insert(std::make_pair("Foobar", my_any(23)));

关于c++ - 了解多态设计 (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11898411/

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