函数编译正确,但它不编译为类的成员函数

时间:2013-10-07 18:41:03

标签: c++ function class linker-errors

我是c ++的新手,我还不知道。我有这个奇怪的问题。我有一个正常工作的函数,但是当我尝试将它作为类的成员函数运行而没有任何更改时,它不起作用 它说: 未定义的引用gsiread :: get_rows(char *)

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

using namespace std;
//vector<string> get_rows ( char filepath[] );  ... it works

class gsiread  {

        public:
        vector<string> get_rows ( char filepath[] ); ... it doesnt work

        private:
        };

vector<string> get_rows ( char filepath[] ) {

   vector<string> data;
   string str;

   ifstream file;
   file.open(filepath);

    if( file.is_open() ) {
        while( getline(file,str) ) {

        if ( str.empty() ) continue;
        data.push_back(str);

        }
    }
    return data;
}

// This part is "like" main i am using Qt creator and i have copied parts of code
   from separate files

gsiread obj;

vector<string> vypis;
vypis = obj.get_rows("ninja.txt"); ....... //This doesnt work

vypis = get_rows("ninja.txt");  .......... //This works if I put declaration of
                                           //function get_rows outside the class and
                                           //and use // on declaration inside the class

for( int i = 0; i < vypis.size(); i++ ) {

    QString n = QString::fromStdString(vypis[i]);

    QString t = "%1 \n";

    ui->plainTextEdit->insertPlainText(t.arg(n));


    // QString is like string but zou have to use it if wanna use widgets
    // of qt (I think )
}

3 个答案:

答案 0 :(得分:2)

如果您希望get_rows成为gsiread的成员,则其实施需要显示此内容

vector<string> gsiread::get_rows( char filepath[] ) {
//             ^^^^^^^^^

答案 1 :(得分:2)

请注意,您已将该功能定义为

vector<string> get_rows ( char filepath[] ) {
   ...
}

C ++将此视为自由函数,而不是成员函数,因为您没有提到它属于该类。它将您的函数get_rows视为与gsiread::get_rows完全不同的实体,并且由于编译器找不到gsi::get_rows而出现链接器错误。

尝试将其更改为阅读

vector<string> gsiread::get_rows ( char filepath[] ) {
    ...
}

更一般地说,即使函数在同一个源文件中定义为类,C ++也不会认为它是类的一部分。你需要

  • 在类体内定义它,或
  • 使用类名
  • 明确地加上前缀

为了使该函数成为一个成员函数。

希望这有帮助!

答案 2 :(得分:1)

当您定义成员函数时,您需要将它放在类的范围内:

vector<string> gsiread::get_rows ( char filepath[] ) { .... }
//             ^^^^^^^^^

否则,它被视为非成员函数,并且您的成员函数已声明但未定义,从而导致错误。