0

我花了一整天的时间试图弄清楚为什么这不起作用,我从文本文件中提取信息并将值作为数组发送到构造函数(工作正常,我可以打印出值它们会显示出来。)但是如果不进入无限循环,我就无法在构造函数中创建另一个类的对象。

我的主要文件:

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(double *& arr, string * sArr, int size)      {
Equation ** e = new Equation*[size];
for(int i = 0; i < size; i++)   {
    e[i] = new Equation(sArr[i]);
}
}

当输入字符串时,方程类可以完美地工作,我只是不知道为什么它不想工作。

提前致谢。

4

2 回答 2

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。提供它们是为了让您的生活更轻松,并且代码看起来不那么神秘。

于 2012-11-02T22:04:26.517 回答
1

这并不是您问题的真正答案,但它会指出许多其他错误,并且一旦它们被清理干净,就有可能了解实际发生的事情。

第一个问题是没有功能分解。函数太大了,应该分成几个更小的函数。一般来说(也有一些值得注意的例外),如果一个函数超过八行或十行,它就需要重构。

关于更详细的问题:幻数太多,而且在大多数情况下,它们是错误的。您的用户不会输入正好 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() )永远不会真正正确。并且您使用lineread bygetline而不测试读取是否成功。做这样的事情的正确方法是:

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()。它出现了;如果有一些教科书显示它,那么我们真的必须采取某种方式让它停止循环。)

于 2012-11-02T23:00:29.860 回答