为什么我不能通过执行“myVector [i] .data()”来实例化一个类,其中myVector [i] .data()是一个字符串?

时间:2014-03-03 22:24:29

标签: c++ string class instantiation

我正在使用其他人为计算化学反应而编写的代码。用户必须为计算指定许多值,这可能会导致错误。我试图自动化/简单地这个过程。

我可以通过执行(例如)实例化一个类:

Algorithm<double>  chlorine;

我想做多个实例 - 例如氯,氢和氧。当我把“氯”,“氢”和“氧气”作为元素放在一个名为“chemicalElements”的字符串向量中然后这样做时,我不明白为什么会出现分段错误:

for (i = 0; i < chemicalElements.size(); i++) 
{   
    Algorithm<double> chemicalElements[i].data();   
}

我在这里错过了一些简单的东西吗?我写的时候:

Algorithm<double>  chlorine;

“氯”只是一个字符串,对吗?那么为什么在字符串向量中的元素中添加“氯”是不行的?

3 个答案:

答案 0 :(得分:3)

chlorine 不是示例代码中的字符串,它是变量的标识符(类型为Algorithm<double>)。

必须为变量提供编译时标识符;这意味着必须在编译器遍历代码时指定标识符。在运行时之前,chemicalElements[i].data()的结果是未知的。

C ++没有任何在运行时创建变量名称的工具,因此您无法直接直接询问。然而,听起来你真正需要的是一组算法对象,每个元素对应一个。要创建算法对象的数组,您可以执行以下操作:

Algorithm<double> algorithms[15];

这会创建15个不同的算法对象,您可以根据需要将其映射到元素。当然,您可以选择不同于15的数字,只要该数字是编译时常量值即可。

您可能也有兴趣了解std::vector<T>,一种允许您创建动态调整大小数组的类型,或std::map<K,V>,它允许您在键值(字符串)之间创建关联映射,例如“氯”和一个值,例如相关的算法)。

要使用后者,你可以这样做:

std::map<std::string, Algorithm<double>> algorithms;
algorithms["chlorine"] = Algorithm<double>();
algorithms["argon"] = Algorithm<double>();

然后再说:

auto results = algorithms["chlorine"].data();

(您当然应该仔细阅读上述类型的链接文档,因为为了简洁起见,我省略了一些错误处理。)

答案 1 :(得分:1)

算法氯,意味着 您已经实例化了一个名为“氯”的“算法”对象

制作“算法”数组 你编码就像:

Algorithm<double> chemicalElements[Const_num];

并通过它的每个项目,你调用数组的名称+它的索引如:

chemicalElements[0 or 1 or 2 or ... etc].data();

所以它会像

for (i = 0; i < Const_num i++) 
{   
    chemicalElements[i].data();   
}

答案 2 :(得分:1)

在本声明中

Algorithm<double>  chlorine;

氯不是一个字符串。它是一个标识符,用于命名Algorithm<double>类型的对象。

这种结构

Algorithm<double> chemicalElements[i].data();

在C ++中没有语法意义,编译器应发出错误。