我花了一整天的时间试图弄清楚为什么这不想工作,我从文本文件中提取信息并将值作为数组发送到构造函数(工作正常,我可以打印输出值,它们将显示。)但是我不能在构造函数内部创建另一个类的对象,而不会进入无限循环。
我的主要文件:
int main(int argc, char** argv)
{
string line;
ifstream myfile ("test1.txt");
string rows [15];
int index = 0;
string tempForSize[5];
double * sizeArray = new double[5];
int firstIntOccur =0;
string * arrForEquations = new string[12];
int equationCount = 0;
if (myfile.is_open()) {
while ( myfile.good() ) {
getline (myfile,line);
rows[index] =line;
index++;
}
myfile.close();
}
else
cout << "Unable to open file" << endl;
for(int i=0; i <12;i++) {
if(rows[i].find("EQUATIONS: ")!=string::npos) {
i++;
i++;
while(i <index) {
arrForEquations[equationCount]=rows[i];
equationCount++;
i++;
}
break;
}
if(rows[i].find(':')!=string::npos) {
firstIntOccur =rows[i].find(':');
tempForSize[i].assign(rows[i],firstIntOccur+2,rows[i].size());
}
}
for(int i =0;i <5; i++) {
sizeArray[i] = atof(tempForSize[i].c_str());
}
try
{
string * equations = arrForEquations;
GeneticAlgorithm a(sizeArray, equations, equationCount);
}
catch(string s)
{
cout << s << endl;
}
return 0;
}
GeneticAlgorithm类的构造函数:
GeneticAlgorithm::GeneticAlgorithm(double *& arr, string * sArr, int size) {
Equation ** e = new Equation*[size];
for(int i = 0; i < size; i++) {
e[i] = new Equation(sArr[i]);
}
}
方程类在输入字符串时效果很好,我无法弄清楚为什么不想这样做。
提前致谢。
答案 0 :(得分:2)
快速记录不能回答你的问题,但我仍然被迫指出。 避免使用指针。
// Instead of using 'string * equations = new string[12]'
std::vector<std::string> equations;
// Instead of using 'double * sizeArray = new double[5]'
std::vector<double> sizeArray;
尽可能使用STL。它们是为了让您的生活更轻松而且代码看起来不那么神秘。
答案 1 :(得分:1)
这不是你问题的真正答案,但它会指出一个问题 很多其他的错误,一旦他们被清理干净,它可能会变成 可以理解实际发生的事情。
第一个问题是没有功能分解。该 功能太大了,应该切成几个较小的 功能。一般来说(并且有一些值得注意的例外),如果a 功能超过大约八或十行,需要重构。
关于更详细的问题:有太多的幻数,而且
大多数情况下,他们错了。您的用户不会完全输入15
线。他会输入5,或500或谁知道。 (当然,如果他
进入500,你有一个大问题。)最简单,最常见的
处理此问题的方法是使用std::vector
及其push_back
成员
功能。这并不完美(如果您的用户输入5,会发生什么
万亿行,或1行5万亿字符),但对大多数人而言
应用,这很好。
更一般地说,这几乎适用于所有阵列。只是
使用std::vector
,让它们根据需要增长,而不是使用
大小的魔法常数。为什么在地球上:
string tempForSize[5];
double * sizeArray = new double[5];
为什么动态分配在一个案例中,而不是在另一个案例中? (为了那个原因
无论如何,你不需要tempForSize
。一旦你有了
在本地临时的字符串值,您可以立即转换它
把它放进sizeArray
。)
循环while ( myfile.good() )
永远不会真正正确。你呢
使用line
读取getline
而不测试是否读取
成功与否。做这样的事情的正确方法是:
std::vector<std::string>
readRows( std::istream& source )
{
std::vector<std::string> results;
std::string line;
while ( std::getline( source, line ) ) {
result.push_back( line );
}
return results;
}
使用标准最佳实践重写代码,以便我们可以看到什么 实际上是在继续,我们不会被其他许多人分心 问题,如果你还有问题,那就再问一次。
(BYW:人们真正想到的是file.good()
。
它出现了;如果有一些教科书显示它,那么我们真的
必须采取某种方式使其脱离流通。)