为啥我不能通过执行“myVector[i].data()”来实例化一个类,其中 myVector[i].data() 是一个字符串? [关闭]
Posted
技术标签:
【中文标题】为啥我不能通过执行“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? [closed]为什么我不能通过执行“myVector[i].data()”来实例化一个类,其中 myVector[i].data() 是一个字符串? [关闭] 【发布时间】:2014-03-03 22:24:28 【问题描述】:我正在使用别人编写的代码来计算化学反应。用户必须为计算指定许多值,这可能会导致错误。我正在尝试自动化/简化这个过程。
我可以通过以下方式实例化一个类(例如):
Algorithm<double> chlorine;
我想做多个实例化——例如,氯、氢和氧。我不明白为什么当我将“氯”、“氢”和“氧”作为元素放入名为“chemicalElements”的字符串向量中然后执行以下操作时会出现分段错误:
for (i = 0; i < chemicalElements.size(); i++)
Algorithm<double> chemicalElements[i].data();
我在这里遗漏了一些简单的东西吗?当我写的时候:
Algorithm<double> chlorine;
“chlorine”只是一个字符串,对吧?那么为什么从字符串向量中的元素中添加“氯”不起作用呢?
【问题讨论】:
请找一本关于 C++ 的教科书,从更简单的开始。当有更好、更合适的资源可供学习时,在 Stack Overflow 上询问语言的基础知识是没有效率的。 过去两周我一直在试图解决这个问题。我不经常使用 C++,因为我是一名化学家。如果它这么简单,那么指出正确的方向会很棒。 如果chemicalElements[i].data();
是一个字符串,那么您就不能将该字符串的内容用作变量的名称(您的示例中的chlorine
不是字符串,而是对象的名称输入Algorithm<double>
)。
@user616199:您正在寻找的方向是“声明变量”。说真的,任何编程教程都会涵盖这一点。
@KerrekSB,我知道你比我聪明得多。恭喜。我仔细阅读了我能拿到的每一本 C++ 书籍,但没有设法在这个特定问题上建立联系,这就是我在这里寻求建议的原因。我已阅读有关声明的内容。编码不是我工作的重点,为了取得任何进展,我有时需要帮助。如果你不想参与这个问题,我可以。
【参考方案1】:
chlorine
在您的示例代码中不是字符串,它是变量的标识符(Algorithm<double>
类型)。
必须给变量编译时标识符;这意味着必须在编译器遍历您的代码时指定标识符。 chemicalElements[i].data()
的结果在 runtime 之前是未知的。
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();
(您当然应该仔细阅读上述类型的链接文档,因为为简洁起见,我省略了一些错误处理。)
【讨论】:
非常感谢您的耐心等待。您对编译和运行时的解释确实有助于我理解发生了什么。【参考方案2】:算法氯,表示 你已经实例化了一个名为“chlorine”的“算法”对象
制作“算法”数组 你可以这样编码:
Algorithm<double> chemicalElements[Const_num];
并通过它的每一项你调用数组的名称+它的索引,如:
chemicalElements[0 or 1 or 2 or ... etc].data();
应该是这样的
for (i = 0; i < Const_num i++)
chemicalElements[i].data();
【讨论】:
【参考方案3】:在此声明中
Algorithm<double> chlorine;
氯不是字符串。它是一个标识符,用于命名Algorithm<double>
类型的对象。
这个结构
Algorithm<double> chemicalElements[i].data();
在 C++ 中没有语法意义,编译器会发出错误。
【讨论】:
以上是关于为啥我不能通过执行“myVector[i].data()”来实例化一个类,其中 myVector[i].data() 是一个字符串? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
为啥我不能同时从 Java 执行不同的 Matlab 函数?
为啥这个 ISQL 命令不能通过 Perl 的 DBI 运行?