正在分析字符串并将令牌作为参数传递

Parsing a string and passing tokens as parameters

本文关键字:令牌 参数传递 串并 字符串 字符      更新时间:2023-10-16

我有一个示例文件,其中一行如下:CAR;FORD;FIESTA;WHITE;20300;19900;23555

现在我需要解析这一行,其中前四个属性应该分别存储,最后三个(或更多)需要计算平均值(正在进行"选择正确的方法"…)

当我成功地将其标记化时,我需要将这些标记传递给一个类,该类为每个属性都有一个单独的(公共)变量

class ClassA{ //aggregate class 
public:
  string vehicle;
  string brand;
  string model;
  string color;
  double avgPrice; 
  //...  
};

最合适的方法是什么?

  1. 标记时,我应该将所有标记存储在一个数组中,然后传递将数组作为参数,然后将初始化列表添加到
    ClassA构造函数,其中我将每个对应的Arr[n]分配给属性?

  2. 或者我应该为每个属性创建一个临时变量然后做标准的初始化列表。但这会使糟糕的笨拙代码,我不得不重复同样的事情4每次将令牌存储在不同的变量中的次数。

请随意提供一个更好的解决方案,因为我只是C++的初学者,我对它的功能的了解是基本的。

对我来说有两种解决方案:

  1. 您的类解析字符串
  2. 您的类只接收令牌,解析在前面完成

通常,类的属性必须是私有的,甚至是受保护的。但是在类的外部直接访问这些属性可以避免类控制值的进出。

如果您的类专门用于解析,那么解决方案1对我来说是最好的。否则,更喜欢第二种解决方案:只需解析字符串,并在类的函数(甚至构造函数)中提供字符串向量作为arg。

与其将其作为一个整体任务来解决,不如考虑将其分为两部分:

  1. 给定一个字符串,获取该字符串表示的令牌集合
  2. 给定一组令牌,在构造ClassA之前验证每个位置

这种分离将ClassA与读取字符串表示的责任隔离开来。这是一件好事:它允许您稍后更改此字符串表示,而不必更改ClassA以匹配新的表示。

第一个任务(标记化)可以用一种通用的方式解决:您所需要做的就是从字符串中读取,并将部分存储到集合中。我建议使用std::vector<std::string>而不是数组,假设您可以使用C++集合来解决这个问题。

第二个任务从令牌列表开始。大多数令牌都作为字符串传递给ClassA,因此只需将它们传递给使用标准初始化器列表的构造函数即可。最后一个参数需要从stringdouble的额外转换。这应该在ClassA构造函数之外进行,以保持职责的干净分离。