为什么我不能通过执行 "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?
我使用的是别人为计算化学反应而编写的代码。用户必须为计算指定许多值,这可能会导致错误。我正在努力使这个过程自动化。
我可以通过以下操作实例化一个类(例如):
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++中没有语法意义,编译器将发出错误。
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 运行同一解决方案的另一个项目的项目
- 挂起和取消挂起一个文件DLL
- 用C++中的一个变量定义一个常量
- 函数向量_指针有不同的原型,我可以构建一个吗
- 在c++中用vector填充一个简单的动态数组
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 预处理器:插入结构名称中的前一个行号
- 我在c++代码中生成了一个运行时#3异常
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 从链接列表c++中删除一个项目
- 告诉一个 const char 数组,除了编译时 C 样式的字符串外,它不以 '