动态更改C ++中类的属性

1 c++ object

在控制台应用程序上工作时,我正在尝试找出一种允许用户输入对象属性和值的方法。例如

class Box{
    public:
    int height;
    int width;
    int length;
};

int main(){
    string memberName,value
    cin>>memberName>>value;
}
Run Code Online (Sandbox Code Playgroud)

如果用户输入了身高,那么通过使用memberName和value,如何将身高的值更改为用户输入的任何值。我想做这项工作,以便可以添加另一类并获得相同的功能。

我正在考虑使用地图,但不能完全确定我将如何继续这样做。

riv*_*riv 5

这是一种复杂的处理方法,但是它确实可以完成您最初尝试做的事情(轻松地将其应用于任何结构):

#include <iostream>
#include <string>
#include <map>

/////////////////////////////////////////
// HELPERS
template<class T>
class MemberPtrBase
{
public:
    virtual std::istream& Read(std::istream& is, T& object) = 0;
    virtual ~MemberPtrBase() {}
};
template<class T, class V>
class MemberPtr : public MemberPtrBase<T>
{
    V T::*member;
public:
    MemberPtr(V T::*ptr)
        : member(ptr)
    {}
    std::istream& Read(std::istream& is, T& object)
    {
        return is >> (object.*member);
    }
};
template<class T>
class MemberMap
{
    typedef std::map<std::string, MemberPtrBase<T>*> MapType;
    MapType members;
public:
    MemberMap() {}
    ~MemberMap()
    {
        for (MapType::iterator it = members.begin(); it != members.end(); ++it)
            delete it->second;
    }

    template<class V>
    void Register(std::string const& name, V T::*ptr)
    {
        members[name] = new MemberPtr<T, V>(ptr);
    }

    std::istream& ReadValue(std::istream& is, T& object)
    {
        std::string name;
        is >> name;
        if (members.find(name) == members.end())
        {
            std::cerr << "Unknown member: " << name << std::endl;
            return is;
        }
        return members[name]->Read(is, object);
    }
};
///////////////////////////////////////////

class Box
{
public:
    int width;
    int height;
    int length;

    static MemberMap<Box> members;
};
MemberMap<Box> Box::members;

class Circle
{
public:
    int x;
    int y;
    int radius;

    static MemberMap<Circle> members;
};
MemberMap<Circle> Circle::members;

int main()
{
    Box::members.Register("width", &Box::width);
    Box::members.Register("height", &Box::height);
    Box::members.Register("length", &Box::length);
    Circle::members.Register("x", &Circle::x);
    Circle::members.Register("y", &Circle::y);
    Circle::members.Register("radius", &Circle::radius);

    Box box;
    Box::members.ReadValue(std::cin, box);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)