gpt4 book ai didi

c++ - 在 C++ 中动态更改类的属性

转载 作者:行者123 更新时间:2023-11-30 01:22:14 28 4
gpt4 key购买 nike

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

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

int main(){
string memberName,value
cin>>memberName>>value;
}

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

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

最佳答案

这是一种复杂的方法,但它完全符合您最初的尝试(可轻松应用于任何结构):

#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;
}

关于c++ - 在 C++ 中动态更改类的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16773399/

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