我有一个具有以下变量/成员的类:
名
姓
年龄
地址等。。
我想为每个返回值的方法创建 getter 方法。根据班级的不同,这可能会变得很大。
有没有一种更快或更面向对象的方法可以让我只使用一种方法来做到这一点?我能想到的唯一方法是有一个方法,该方法接受要返回的变量名称的参数;但是,该方法的类型会根据它是否返回字符串、int 等而改变。
有没有人有办法解决吗?
为什么你需要课外的那些价值观?如果您有不在Person
其中的代码调用 4 或 5 个Person GetWhatever()
方法并将字符串粘合在一起,在它们之间填充逗号等等,将该代码移动到Person
. 做到这一点就足够了,外面的代码Person
不需要调用你的吸气剂。
有些类是无逻辑的,它们只保存值,并且它们期望外部对象完成所有工作。在 C++ 中,为此使用结构可以使您的意图清晰。如果你坚持外部代码Person
需要任意访问 Person 的元素,它可能是一个结构,而不是一个类。如果您坚持它是一个类,请通过添加一些实际的业务逻辑来证明它。
不,没有“更好”的方式仍然是面向对象的。您应该为每个需要在类外部访问的私有成员变量定义一个公共“getter”方法。如果要从类外部设置变量,您还应该定义一个 setter 方法。
如果您想轻松定义 setter/getter - 在单个成员级别进行。使用 setter/getter 制作成员模板并将其定义为类的公共元素:
template <class Type>
class Member {
public:
Member(const T& value = T()) : value(value) {}
void setValue(const Type& t) { value = t; }
T getValue() const { return value; }
private:
T value;
};
在你的课堂上使用它:
class Person {
public:
Member<std::string> firstName;
Member<std::string> lastName;
Member<std::string> address;
Member<unsigned> age;
};
和用法:
int main() {
Person one;
one.firstName.setValue("Joe");
one.age.setValue(33);
}
如果您需要一些约束(如范围检查),请定义一些 RangeCheckingMember 模板。如果您需要成员相互依赖 - 然后通过指针/引用在它们之间建立关系。
好吧。因为你知道你想要什么。
void get(int flag, void *return_value)
将return_value
类型转换为您想要的。
谢谢
考虑使用在给定类型中采用默认值的模板成员函数进行参数查找。
template<typename ValueType>
const ValueType& get(const KeyType& key, const ValueType& default value) {
...
};
您仍然必须枚举(或以其他方式列出)KeyType
所有值(或std::string
在较大情况下使用可能没问题的值)并在ValueType
.
因此,在您决定需要任意大或完全动态的值之前,这并不能真正帮助您。此时,您需要实现一个映射,它可以包含任何需要可怕的联合或来自映射中使用的公共基类的模板包装器派生类的类型。
这样做的好处是一个getKeys()
方法可以显示类中所有可用的键——这对于动态 GUI 和消息处理非常有用。
如果您使用的库中的所有内容都是某个 Object 类(例如 QObject)的子类,则可以使用 amap of (string, object)
来保存所有数据,然后通过以下方式访问它:
Object get(string name) { return memebers[name]; }
members is std::map<std::string, Object>
当然,您将需要使用类型转换。
Button* my_var = static_cast<Button*>(my_class.get("my_button"));
// get returns Object
如果你使用Qt ,你也可以使用Qt 的属性系统。这不是标准的 c++,但 qmake 和 moc 可以在许多操作系统上工作。