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

时间:2014-10-20 13:14:46

标签: c++ string parameters split token

我有一个示例文件,其中一行如下所示: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 每次将令牌存储在不同变量中的次数。

  3. 随意提供更好的解决方案,因为我只是初学C ++而且我对它的能力知识是基本的。

2 个答案:

答案 0 :(得分:2)

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

  1. 您的班解析字符串
  2. 您的班级只会收到令牌,并且解析会提前完成。
  3. 通常,类的属性必须是私有的,甚至是受保护的。但是可以直接访问这些属性OUTSIDE类可以避免你的类控制进出的值。

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

答案 1 :(得分:1)

不要将此解决为单一任务,而应考虑将其分为两部分:

  1. 给定一个字符串,获取字符串代表的标记集合
  2. 给定一组令牌,在构建ClassA
  3. 之前验证每个位置

    这种分离使ClassA免于阅读字符串表示的责任。这是一件好事:它允许您稍后更改此字符串表示,而无需更改ClassA以匹配新表示。

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

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