我有一个示例文件,其中一行如下所示: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 ++而且我对它的能力知识是基本的。
答案 0 :(得分:2)
对我来说有两种解决方案:
通常,类的属性必须是私有的,甚至是受保护的。但是可以直接访问这些属性OUTSIDE类可以避免你的类控制进出的值。
如果您的课程专门用于解析,那么解决方案1对我来说是最好的。 否则,更喜欢第二种解决方案:只需解析字符串并在类的函数(甚至构造函数)中将字符串向量作为arg给出。
答案 1 :(得分:1)
不要将此解决为单一任务,而应考虑将其分为两部分:
ClassA
这种分离使ClassA
免于阅读字符串表示的责任。这是一件好事:它允许您稍后更改此字符串表示,而无需更改ClassA
以匹配新表示。
第一个任务(标记化)可以通用的方式解决:您需要做的就是从字符串中读取,并将部件存储到集合中。我建议使用std::vector<std::string>
而不是数组,假设你可以使用C ++集合来解决这个问题。
第二个任务以令牌列表开头。您的大多数令牌都作为字符串传递给ClassA
,因此您只需将它们传递给使用标准初始值列表的构造函数。最后一个参数需要从string
到double
的额外转换。这应该在ClassA
构造函数之外完成,以保持责任的清晰分离。