2013-11-07 2 views
0

Я практикую C++ и создал класс, в котором хранятся последовательности, считанные из быстрого формата, а также их имена. Код ниже:Ошибка сегментации с помощью функции доступа.

#include<fstream> 
#include<iostream> 
#include<string> 
#include<vector> 

using namespace std; 

class Sequence { 
    vector<string> fullSequence, sequenceNames; 

public: 
    void fastaRead(string fileName); 
    string getSequence(int index); 

}; 

string Sequence::getSequence(int index) 
{ 
    return fullSequence[index]; 
} 


void Sequence::fastaRead(string fileName) 
{ 
    vector<string> fullSequence, sequenceNames; 
    ifstream inputFile; 
    inputFile.open(fileName); 
    if (inputFile.is_open()) { 
     string currentSeq; 
     string line; 
     bool newseq = false; 
     while (getline(inputFile, line)) 
     { 
      if (line[0] == '>') { 
       sequenceNames.push_back(line.substr(1,line.size())); 
       newseq = true; 
      } else { 
       if (newseq == true) { 
        fullSequence.push_back(currentSeq); 
        currentSeq = line; 
        newseq = false; 
       } else { 
        currentSeq.append(line); 
       } 
      } 
     } 
    } 
    inputFile.close(); 
} 


int main() 
{ 
    Sequence inseq; 
    cout << "Fasta Sequence Filepath" << endl; 
    string input; 
    getline(cin, input); 
    inseq.fastaRead(input); 
    inseq.getSequence(0); 
    return 0; 
} 

Однако, когда я запускаю программу со следующим фиктивным входным файлом:

>FirstSeq 
AAAAAAAAAAAAAA 
BBBBBBBBBBBBBB 
>SecondSeq 
TTTTTTTTTTTTTT 
>ThirdSequence 
CCCCCCCCCCCCCC 
>FourthSequence 
GGGGGGGGGGGGGG 

я получаю ошибку сегментации, когда линия inset.getSequence(0) называется. Что я сделал, это вызывает ошибку seg и как я могу убедиться, что этого не произойдет? Я знаю, что это может иметь какое-то отношение к ошибкам в указателях, но я не думаю, что использовал указатели, которые, если я правильно помню, нуждаются в символе *.

Thanks, Ben.

ответ

2

Вам необходимо удалить vector<string> fullSequence, sequenceNames; в void Sequence::fastaRead. Когда вы определяете эти переменные внутри этой функции и используете их, вы не получаете доступа к тем из них, которые имеют одинаковое имя, вы получаете доступ к локальным переменным, определенным вами в этой функции, если вы не добавили их с this-> во время доступа.

Переменные в классе фактически пусты, и вы получаете ошибку сегментации.

Смежные вопросы