解析字符串并将标记作为参数传递

Posted

技术标签:

【中文标题】解析字符串并将标记作为参数传递【英文标题】:Parsing a string and passing tokens as parameters 【发布时间】:2014-10-20 13:14:46 【问题描述】:

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

现在我需要解析这一行,其中前四个属性应单独存储,后三个(或更多)需要计算平均值 (“选择正确的方法”正在进行中...)

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

class ClassA //aggregate class 

public:
  string vehicle;
  string brand;
  string model;
  string color;
  double avgPrice; 

  //...  
;

什么是最合适的方法?

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

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

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

【问题讨论】:

你有一个字符串,可能来自一个流,里面有分号?将字符串拆分到其他地方(某种工厂)以创建 Class A? scanf ...... @doctorlove 你说的“工厂”是什么意思 一种模式——只是一种在这里制作东西的方法。请参阅en.wikipedia.org/wiki/Factory_method_pattern,但您似乎总是在这里制作一种类型的课程,所以它可能不相关 【参考方案1】:

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

    你的类解析字符串 您的班级刚刚收到令牌,并且解析已提前完成。

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

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

【讨论】:

这是一个聚合类,所以成员都是公开的【参考方案2】:

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

    给定一个字符串,获取该字符串所代表的标记集合 给定一组标记,在构造 ClassA 之前验证每个位置

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

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

第二个任务从令牌列表开始。您的大部分标记都作为字符串传递给ClassA,因此您只需将它们传递给使用标准初始值列表的构造函数。最后一个参数需要从string 额外转换为double。这应该在 ClassA 构造函数之外完成,以保持职责的清晰分离。

【讨论】:

我认为我缺少一个更明显和更优雅的解决方案,因为我不知道所有函数向量和字符串 c++(11) 支持。感谢您澄清这一点

以上是关于解析字符串并将标记作为参数传递的主要内容,如果未能解决你的问题,请参考以下文章

如何将运行时参数作为依赖解析的一部分传递?

传递方法作为参数[重复]

当我将一个标记作为角度5中的参数传递时,无法匹配任何路径

如何将临时表作为参数传递到单独的存储过程中

如何读取将作为 MultipartFile 参数传递的 SQLite 文件? (在 java/kotlin 中)

将元组作为命令行参数传递