1

说我有一个结构如下

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

如果我想在被要求时输出其中一个变量,例如价格,我是否必须做一个大的 if/else 或 switch 语句来匹配用户输入与成员,或者是否有更优雅的方式来做到这一点,因为我知道stock.userInput不行。

4

4 回答 4

0
struct stock s1;
cout<<" price is:"<< s1.price;
于 2012-10-22T03:08:40.910 回答
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 回答
0

如果你想摆脱大的switch/if语句,你可以使用mapwithstring和一个指向成员的指针。假设您的stock结构,您可以使用:

定义地图(这里是双打)并初始化它:

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;andA类型的语句来解析。如果您只关心string(或任何其他,但始终相同)值的表示,那么您可以将maps 包装在一个类中以搜索所有类型并将转换为 a 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,每股收益=0)
你想要哪个领域?每股收益
众所周知,eps=0。

[d:\开发\测试]
> _
于 2012-10-22T05:09:45.687 回答