C++ OOP-这应该怎么做?

C++ OOP-这应该怎么做?,c++,oop,function,C++,Oop,Function,我有一个具有以下变量/成员的类: 名字 姓 年龄 地址 等等 我想为每个返回值的方法创建getter方法。这可能会变得相当大,具体取决于班级 有没有一种更快或更面向对象的方法可以让我只用一种方法就可以做到这一点?我能想到的唯一方法是使用一个方法,该方法接受要返回的变量名的参数;但是,该方法的类型将根据其是否返回字符串、int等而改变 有人有解决方案吗?考虑使用模板成员函数进行参数查找,该函数接受给定类型中的默认值 template<typename ValueType> const

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

名字

年龄

地址 等等

我想为每个返回值的方法创建getter方法。这可能会变得相当大,具体取决于班级

有没有一种更快或更面向对象的方法可以让我只用一种方法就可以做到这一点?我能想到的唯一方法是使用一个方法,该方法接受要返回的变量名的参数;但是,该方法的类型将根据其是否返回字符串、int等而改变


有人有解决方案吗?

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

template<typename ValueType>
const ValueType& get(const KeyType& key, const ValueType& default value) {
   ...
};
模板
常量值类型和获取(常量键类型和键、常量值类型和默认值){
...
};
您仍然需要枚举(或列出)所有值的
KeyType
(或使用
std::string
,在较大的情况下可能会更好),并在
ValueType
上来回处理存储

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


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

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

如果使用的库中的所有内容都是某个对象类(例如QObject)的子类,则可以使用(字符串,对象)的映射来保存所有数据,然后使用以下工具访问它:

Object get(string name) { return memebers[name]; }

members is std::map<std::string, Object>
objectget(字符串名){returnmemebers[name];}
成员是std::map
当然,您需要使用类型转换

Button* my_var = static_cast<Button*>(my_class.get("my_button")); 
// get returns Object
Button*my_var=static_cast(my_class.get(“my_Button”);
//获取返回对象

如果使用,也可以使用。这不是标准C++,但QPube和MOC在许多操作系统上工作。

为什么你需要在类之外的值?如果有不在

Person
中的代码调用4或5
Person getwhather()
方法并将字符串粘在一起,在字符串之间填充逗号等,请将该代码移到
Person
中。这样做足够多,就不会有任何代码超出
的范围,而
的人需要调用你的getter


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

好吧,因为你知道你想要什么

void get(int flag, void *return_value)
获取
return\u值
typd casting到您想要的值

void get(int flag, void *return_value)

如果您想轻松定义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;
};

如果需要一些约束(如范围检查),请定义一些RangeCheckingMember模板。如果您需要成员相互依赖,则通过指针/引用建立它们之间的关系

将C++变成脚本语言。一个很差的对象,因为现在你需要手动下载对象并使用<代码>对象。获取(“成员”)而不是<代码>对象。成员< /代码>。如果可能的话,考虑避免使用吸气剂和设置器。我同意,这样可以节省你很多打字时间。你不应该为每个成员都需要一个吸气剂/设定器,如果你需要的话,可以考虑使用一个数据结构来代替。Hmm.。它可能与您作为示例给出的相反—协议解析器类。尽管如此,您仍然认为还有另一个方法,可能将某个缓冲区类作为参数,为“Person”中的解析代码提供输入。例如,我偶尔会想要一些自动生成setter-getter方法的代码完成。