传递给构造函数时,无法从数组中获取字符串

时间:2012-11-02 21:53:41

标签: c++

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

我的主要文件:

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]);
}
}

方程类在输入字符串时效果很好,我无法弄清楚为什么不想这样做。

提前致谢。

2 个答案:

答案 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()。 它出现了;如果有一些教科书显示它,那么我们真的 必须采取某种方式使其脱离流通。)