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

why can I not instantiate a class by doing "myVector[i].data()", where myVector[i].data() is a string?

本文关键字:data 一个 myVector 字符串 其中 执行 为什么 不能 实例化      更新时间:2023-10-16

我使用的是别人为计算化学反应而编写的代码。用户必须为计算指定许多值,这可能会导致错误。我正在努力使这个过程自动化。

我可以通过以下操作实例化一个类(例如):

Algorithm<double>  chlorine;

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

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

我是不是错过了一些简单的东西?当我写:

Algorithm<double>  chlorine;

"氯"只是一根绳子,对吧?那么,为什么在字符串向量中的元素中添加"氯"不起作用呢?

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();

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

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

制作"算法"数组你把它编码成:

Algorithm<double> chemicalElements[Const_num];

要通过它的每一个项目,你可以调用数组的名称+它的索引,比如:

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

所以它就像

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

在此语句中

Algorithm<double>  chlorine;

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

该建筑

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

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