2015-05-07 4 views
0

Привет, я только начал изучать C++ на этой неделе, и мне нужна помощь. В основном то, что я пытаюсь сделать, читается из .txt-файла и «конвертирует» его в векторную строку, а затем отображает его. моя ошибка в этой строке: text.readFile («script.txt»), он говорит: «запрос для члена« readFile »в« text », который относится к классу типа« Конверсия() » , что делает это значит? , а также мой метод getLines() не может быть разрешен..txt к вектору <string>, ошибка типа некласса

main.cpp

#include <iostream> 
#include <string> 
#include <fstream> 
#include <sstream> 
#include <vector> 
#include "Conversion.h" 

using namespace std; 

int main() 
{ 
    vector<string> lines; 

    Conversion text(); 

    if(text.readFile("scenario.txt") == true) 
     lines = text.getLines(); 

    for(int i = 0; i < lines.size(); ++i) 
     cout << lines[i] << endl; 

    return 0; 
} 

Conversion.cpp

#include <string> 
#include <iostream> 
#include <fstream> 
#include <sstream> 
#include <vector> 
#include "Conversion.h" 

using namespace std; 
vector<string> lines; 

Conversion::Conversion(std::vector<std::string> lines) { 
    lines.clear(); 
} 
Conversion::Conversion() { 
} 

Conversion::~Conversion() { 
} 

bool Conversion::readFile(string filename) { 
    ifstream file; 
    string line; 

    file.open(filename.c_str()); 

    if(!file.is_open()) 
     return false; 

    while(getline(file, line)) 
     lines.push_back(line); 

    return true; 
} 

vector<string> Conversion::getLines(){ 
    return lines; 
} 

Conversion.h

#ifndef CONVERSION_H_ 
#define CONVERSION_H_ 

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

class Conversion { 
public: 
    Conversion(); 
    Conversion(std::vector <std::string>); 
    ~Conversion(); 
    std::vector<std::string> getLines(); 
    bool readFile(std::string); 

private: 
    std::vector<std::string> lines; 
    std::string line; 
    std::ifstream file; 
}; 

#endif 
+0

C++ - это пропускная способность. 'lines.clear();' ничего не сделает. Если вы хотели использовать глобальный (который действительно не должен быть объявлен глобальным вообще, учитывая, что у вас есть один член), вам придется изменить одно из имен или получить доступ к нему по-другому. Даже тогда, взяв параметр и не используя его, кажется бессмысленным, и член уже понятен, поэтому нет необходимости его снова очищать. – chris

+0

Да, я снял его. Спасибо – KH17

ответ

2

Еще раз Conversion text(); это объявление функции, а не класс конкретизации. Для вызова конструктора по умолчанию, измените его на Conversion text;

Вы, вероятно, хотели, чтобы скопировать пропущенные строки в конструкторе:

Conversion::Conversion(std::vector<std::string> const& lines) : lines(lines) { } 

Ваш код должен работать сейчас, но можно сделать некоторые улучшения. Для того, чтобы избежать копирования, getLines должен вернуться к референтной к-ПОСТОЯННЫЕ:

std::vector<std::string> const& getLines(); 

// you don't have to create lines in main, you can print like this: 

for(auto const& x : text.getLines()) 
    cout << x << endl; 

, и я хотел бы использовать его даже здесь:

bool readFile(std::string const&); 

Я надеюсь, что это последняя вещь - std::ifstream конструктор и open функция также принимают std::string:

file.open(filename); 
+0

Спасибо за быстрый ответ. yup, который исправил ошибку в 'text.readFile ("script.txt")' Теперь мне просто нужно исправить ошибку на 'lines = text.getLines();' который говорит мне «неопределенная ссылка на« Conversion :: getLines() »« – KH17

+0

@ KH17 Вы, вероятно, добавили спецификатор 'const &' только для объявления функции, а не для определения или наоборот. – LogicStuff

+0

ДА ЭТО РАБОТАЕТ. Большое спасибо! – KH17

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