当元素来自不同的标记时,如何从向量访问元素?

时间:2019-04-13 12:47:32

标签: c++

class token
{
public:

    char kind;
    double value;
};
token get_token()
{
    token t;
    token t2;
    cin >> t.value >> t2.kind >> t.value >> t2.kind >> t.value;
    nums.push_back(t);
    nums.push_back(t2);
    return t;
}

我有一个课程令牌。

我正在尝试使用类和对象创建一个计算器。但是我不知道如何从向量访问某些元素。

我有一个由两个成员(char kinddouble value)组成的班级(令牌)。一个double和一个char(按住'+',“-”和1、2等)。其值由用户提供。

我创建了两个标记(tt2)来保存值。

我正在将输入发送到相同类型(vector <token> nums)的向量中。如何从向量中的两个标记(tt2)访问元素。

我可以成功地表示t中的元素,但是我不知道如何“访问” t1元素。

有关如何从特定令牌访问向量中的元素的任何帮助?

我想添加nums [i] .value,但我不知道如何从t和t2值中进行选择。

有没有一种方法可以从特定令牌访问向量中的元素?

我想添加nums[i]。value,但是我不知道如何从tt2值中进行选择。

2 个答案:

答案 0 :(得分:4)

假设您具有全局std::vector<token>(我假设它是全局的),实例化两个令牌对象,并使用stdin的输入设置它们的成员变量(尽管我怀疑您那里有错别字;您已经设置了) t.value 3次,t2.kind 2次,并且从未初始化t.kindt2.value)。然后,您将这些标记的副本推送到向量中,并返回第一个标记的副本。如果您一次运行该函数,则向量的元素0中将有一个t的副本,元素1中将有一个t2的副本,因此您可以访问其中的令牌像这样的向量:

double value1 = nums[0].value;
double value2 = nums[1].value;
  • kind成员也一样,ofc

答案 1 :(得分:0)

您似乎对它的工作方式有严重的误解。 cin >> t.value >> t2.kind >> t.value >> t2.kind >> t.value;将覆盖t.value三次,t2.kind两次,仅保留最后两个输入。然后,将两个未完全初始化的对象复制到向量中,然后,返回其中一个,同时丢弃向量和第二个标记。

也许您应该开始告诉我们目标是什么。如果您想获取一些输入并将其存储,请考虑以下事项:

class Token // note that usually, classes start with upper case
{
    public:
        Token(char kind, double value) : kind(kind), value(value) {}

        static Token prompt_user();

        char kind; // consider making them private, in most cases, they shouldn't be exposed
        double value;
};

#include <iostream>
using std::cout;
using std::endl;
using std::cin;

// idea here: make functionality of Token to be internal to Token
Token Token::prompt_user()
{
    cout << "Please enter kind and value of a token" << endl;
    char kind;
    double value;
    cin >> kind >> value;
    return Token(kind, value);
}

#include <vector>
using std::vector;

int main()
{
    vector<Token> tokens;
    tokens.push_back(Token::prompt_user());
    tokens.push_back(Token::prompt_user());

    for(const Token& token : tokens)
    {
        cout << "Token: " << token.kind << " " << token.value << endl;
    }
    return 0;
}

已实施:http://www.cpp.sh/7y62i

也就是说,不清楚要做什么,只是想提供一个可以开始的基础。如果需要修改并且不知道该怎么写,请写信。

此外,正如我的笔记所述,您的属性很有可能应该是私有的。他们不私有的条件是,从外部给他们任何其他值不会使对象无效。 char kind听起来只能有特定的值,例如在加法时存储“ a”。如果是这种情况,从长远来看,您应该将其替换为枚举类,例如

enum class TokenType { addition, subtraction };