1

コンソール アプリケーションで作業しており、ユーザーが値と共にオブジェクト プロパティを入力できるようにする方法を見つけようとしています。例えば

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

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

ユーザーが高さを入力した場合、 memberName と value を使用して、高さの値をユーザーが入力したものに変更するにはどうすればよいですか。別のクラスを追加して同じ機能を取得できるように、これを機能させたいと思います。

マップの使用を検討していますが、どうやってそれを行うのか完全にはわかりません。

4

3 に答える 3

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;
}
于 2013-05-27T13:04:25.480 に答える
0

地図を使用することは確かにそれを行う方法です。コード例ですぐに編集します

#include "stdafx.h"
#include <iostream>
#include <map>
#include <string>





int _tmain(int argc, _TCHAR* argv[])
{
    std::map<std::string,std::string> mapData;


    std::string name,value;
    std::cout << "Enter Name:\n";
    std::cin >> name;
    std::cout << "\n\nEnter Data\n";
    std::cin >> value;

    mapData[name] = value;

    return 0;
}

または、マップ上またはその間に他のさまざまな操作を実行する必要がある場合は、マップをラップするクラスを作成できます (入力を検証したり、入力をマップに保存する前に入力に対して他の操作を実行したりするなど)。

// example of class wrapping a map
class MapContainer {
private: 
   map<string,string> _map;

public:
   void addValue(const string& name, const string& value) {
       _map[name] = value;
   }

   string getValue(const string& name) {
       return _map[name];
   }


}
于 2013-05-27T12:41:30.960 に答える