OOP - 应该怎么做?

时间:2012-09-18 15:55:53

标签: c++ oop function

我有一个具有以下变量/成员的类:

  

名字

     

姓氏

     

年龄

     

地址   等。

我想为每个返回值的getter方法创建。根据班级的不同,这可能会变得非常大。

是否有更快或更多面向对象的方式允许我只使用一种方法?我能想到的唯一方法是使用一个方法来获取要返回的变量名称的参数;但是,该方法的类型将根据它是否返回字符串,int等而改变。

有没有人有解决方案?

6 个答案:

答案 0 :(得分:3)

为什么你需要课外的那些价值观?如果您的代码不在Person中,可以调用4或5个Person GetWhatever()方法并将字符串粘合在一起,则会在它们之间填充逗号,依此类推,将该代码移到Person中。这样就够了,Person之外的代码不需要打电话给你的吸气剂。

有些类是无逻辑的,它们只保存值,并且期望外部对象完成所有工作。在C ++中,使用结构可以明确您的意图。如果你坚持Person之外的代码需要任意访问Person的元素,它可能是一个结构,而不是一个类。如果你坚持认为它是一个类,那就通过添加一些实际的业务逻辑来证明它。

答案 1 :(得分:1)

不,没有“更好”的方式仍然是面向对象的。您应该为每个需要在类外部访问的私有成员变量定义一个公共“getter”方法。如果要从类外部设置变量,还应该定义一个setter方法。

答案 2 :(得分:1)

如果您想轻松定义setter / getter,请将其设置为单个成员级别。使用setter / getter创建成员模板,并将define定义为您的类的公共元素:

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模板。如果您需要成员依赖彼此 - 然后通过指针/引用建立它们之间的关系。

答案 3 :(得分:0)

考虑使用模板成员函数进行参数查找,该函数采用给定类型的默认值。

template<typename ValueType>
const ValueType& get(const KeyType& key, const ValueType& default value) {
   ...
};

您仍然必须枚举(或以其他方式列出)所有值的KeyType(或使用std::string,在较大的情况下可能没问题)并在{ {1}}。

因此,在您决定需要任意大或完全动态的值之前,这对您没有多大帮助。此时,您需要实现一个映射,该映射可以包含任何需要隐藏联合的类型或来自映射中使用的公共基类的模板包装派生类。

这样做的好处是ValueType方法可以显示类中可用的所有键 - 这对于动态GUI和消息处理非常有用。

答案 4 :(得分:0)

如果您使用的库中的所有内容都是某些Object类(例如QObject)的子类,则可以使用map 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's property system,也可以使用Qt。这不是标准的c ++,但qmake和moc适用于许多操作系统。

答案 5 :(得分:0)

好吧。因为你知道自己想要什么。

void get(int flag, void *return_value)

获得return_value typd cast到你想要的东西。

感谢