1

私は次のような構造を持っているとしましょう

struct stock{
    string ticker;
    double price;
    double volume;
    double eps;
};

要求されたときに価格などの変数の1つを出力したい場合は、ユーザー入力をメンバーと一致させるために大きなif / elseまたはswitchステートメントを実行する必要があります。または、よりエレガントな方法があります。stock.userInput動作しないことを知っています。

4

4 に答える 4

0
struct stock s1;
cout<<" price is:"<< s1.price;
于 2012-10-22T03:08:40.910 に答える
0

switch大きな/ifステートメントを取り除きたい場合は、mapwithstringとメンバーへのポインターを使用できます。構造体を想定するとstock、次を使用できます。

マップを定義し (ここでは double 用)、初期化します。

std::map<std::string,double stock::*> double_members;
double_members["price"]=&stock::price;
double_members["volume"]=&stock::volume;
double_members["eps"]=&stock::eps;

そして、それを使用していくつかの値を検索します。

stock stock1;
std::string input;
std::cin >> input;
if (double_members.find(input)!=double_members.end()) 
    std::cerr << "Value for " << input << " is: " << stock1.*double_members[input] << std::endl;
else
    std::cerr << "There's no field called " << input << std::endl;

std::cerr << A;単一のタイプに制限されていますが、実行時に のようなステートメントやAのタイプを解決することはできません。string値の (またはその他の、しかし常に同じ) 表現のみを気にする場合は、それらすべてを検索し、 (または何か)mapに変換された値を出力するクラスで異なる型の s をラップできます。string

しかし、それが本当に大きなものifでない限り、ステートメントを持つ方がおそらく簡単です。struct

于 2012-10-22T03:55:27.427 に答える
0

g++ 4.7.1 以前では動作しない (ただし、Visual C++ 11.0 以降では動作する) ことで問題ない場合は、次のように...

#include <sstream>      // std::ostringstream
#include <string>       // std::string
using namespace std;

struct Stock
{
    string ticker;
    double price;
    double volume;
    double eps;

    string toString() const
    {
        ostringstream stream;
        stream
            << "Stock("
            << "ticker='" << ticker << "', "
            << "price=" << price << ", "
            << "volume=" << volume << ", "
            << "eps=" << eps
            << ")";
        return stream.str();
    }

    Stock(): ticker(), price(), volume(), eps() {}
};

#include <iostream>
#include <regex>
#include <stdexcept>
#include <stdlib.h>

bool err( string const& s )
{
    cerr << "!" << s << endl;
    exit( EXIT_FAILURE );
}

string lineFromUser( string const& prompt )
{
    string line;
    cout << prompt;
    getline( cin, line )
        || err( "oh my, failed to read line of input" );
    return line;
}

void cppMain()
{
    Stock stock;
    stock.price = 1.23;

    string const s = stock.toString();
    cout << s << endl;
    string const fieldname = lineFromUser( "Which field u want? " );
    regex const valuespec( fieldname + "\\s*\\=\\s*([^,\\)]*)" );  // 
    smatch what;
    if( regex_search( s, what, valuespec ) )
    {
        cout << "As we all know already, " << what.str() << "." << endl;
    }
    else
    {
        cout
            << "!Sorry, there's no field named '"
            << fieldname << "'"
            << endl;
    }
}

int main()
{
    try
    {
        cppMain();
        return EXIT_SUCCESS;
    }
    catch( exception const& x )
    {
        cerr << "!" << x.what() << endl;
    }
    return EXIT_FAILURE;
}

使用例:

[d:\開発\テスト]
> ふー
株式(ティッカー=''、価格=1.23、出来高=0、eps=0)
どのフィールドが欲しいですか?eps
ご存知のように、eps=0 です。

[d:\開発\テスト]
> _
于 2012-10-22T05:09:45.687 に答える
0

変数を見つけるための特別なキーワードはありません(バブルを破裂させて申し訳ありません)。論理ステートメントを使用する必要があります。それはうまくいきます:

cout << "What would you like to see? (1)Price (2)etc...etc...";
cin >> input;
switch(input)
{
    case 1:
        cout << Obj.Price;
    break;
    case 2:
        cout << //....
    break;
}

私は個人的にキーと switch ステートメントを使用するのが好きです。プログラムの後半で戻って変更するのがずっとクリーンで簡単になる傾向があります。

于 2012-10-22T03:27:52.873 に答える