为啥我不能通过执行“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&lt;double&gt;)。 @user616199:您正在寻找的方向是“声明变量”。说真的,任何编程教程都会涵盖这一点。 @KerrekSB,我知道你比我聪明得多。恭喜。我仔细阅读了我能拿到的每一本 C++ 书籍,但没有设法在这个特定问题上建立联系,这就是我在这里寻求建议的原因。我已阅读有关声明的内容。编码不是我工作的重点,为了取得任何进展,我有时需要帮助。如果你不想参与这个问题,我可以。 【参考方案1】:

chlorine 在您的示例代码中不是字符串,它是变量的标识符(Algorithm&lt;double&gt; 类型)。

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

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

Algorithm<double> algorithms[15];

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

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

要使用后者,您可以执行以下操作:

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&lt;double&gt; 类型的对象。

这个结构

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

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

【讨论】:

以上是关于为啥我不能通过执行“myVector[i].data()”来实例化一个类,其中 myVector[i].data() 是一个字符串? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能同时从 Java 执行不同的 Matlab 函数?

为啥这个 ISQL 命令不能通过 Perl 的 DBI 运行?

为啥我设置中国银行电子功能的时候出现用户安全工具不能执行此服务?

为啥shell脚本中不能执行cd 命令

为啥我不能使用 SPN 执行 kinit?

为啥我不能像使用列表一样过滤 IQueryable?