2012-01-07 42 views
0

/*感谢任何查看此人并尝试回答它的人。我真的不想在这里浪费任何人的时间,但我在这方面已经打了三天左右的头。我意识到这对于理解它的人来说可能非常简单。我已经尝试了几乎所有可能的组合,但我仍然可以想到编译器错误。尝试将指针作为参数传递给指向文件的fstream成员

C:\随机\ RNDNUMTEST.cpp(41):错误C2102:“&”需要-1-值

我想传递一个指针作为参数的函数makeRndmNumber()的成员函数fstream.open()。我想打开RNDNUMTEST.cpp中的文件,然后将它传递给makeRndmNumber(),以便可以以某种方式修改它。我在网上寻找帮助,包括这个网站,但我觉得我忽略了一些重要或简单的东西,或者我只是完全忽略了这个概念。

这不是作业,我不是大学生。虽然我确实上过学,但是我已经完成了10多年的编程工作,从来没有真正明白过这一点。任何建议,将不胜感激。

// These are only excerpts from the actual files. 

// RndmNum_Class.h file 

typedef void(fstream::*fStream_MPT)(const char*); // fStream_MPT (Member Pointer Type) 

class RandomNumber { 

public: 

    RandomNumber(); 
    ~RandomNumber() {}; 
    static void loadDigits(double, double, char array[]); 
    static int getLastNDigits(char array[], int); 
    static int makeRndmNumber(int, int, fStream_MPT); 
}; 

//*************************************************************8 

//RndmNum_Class.cpp file 

int RandomNumber::makeRndmNumber(int seed, int _fileSize, fStream_MPT FILE) { 

    ...... 

} 

//**************************************************************/ 

// RNDNUMTEST.cpp file 

#include "RndmNum_Class.h" 

int main() { 

    const char* RNDM_FILE = "c:\\RandomFile.txt"; 

    fstream FStream_Obj; 
    // FStream_Obj.open(RNDM_FILE); 

    fStream_MPT FileMembPtr = &FStream_Obj.open(RNDM_FILE); 
     //fStream_MPT FileMembPtr = &fstream::open; 

    int seed = 297814; 
    int size = 20000; 
    cout << RandomNumber::makeRndmNumber(seed, size, FileMembPtr); 

    return 0; 
} 

回答

1

此:&FStream_Obj.open(RNDM_FILE)不是借函数的地址,它试图把该函数的调用的返回值的地址。但是该函数返回void,因此会显示错误消息。

0

它没有任何意义:使用成员函数指针,因此您可以在某处不同地应用不同的成员函数,而无需知道调用了哪个确切的函数。这就像传递函数的名字一样(除了名称在编译时解析)。这似乎并不是你想要做的!

即使你会正确地获得该函数的地址(而不是试图让调用open()的结果的地址),这是行不通的,因为std::fstream::open()有两个参数:第二个参数是开放模式,它默认为std::ios_base::in | std::ios_base::out

我不太清楚你真的想要什么,但似乎你想传递文件流。执行此操作的正常方法是将对std::iostream的引用作为参数传递给函数。那么,实际上你可能最初想要使用std::ifstream,因此将参数传递为std::istream&

1

首先,将函数定义从typedef void(fstream::*fStream_MPT)(const char*);更改为typedef void(fstream::*fstream_MPT)(const char*,ios_base::openmode),这里有一个你忘记的默认参数。

根据您的评论将fStream_MPT FileMembPtr = &FStream_Obj.open(RNDM_FILE);更改为fStream_MPT FileMembPtr = &fstream::open;,并向makeRndNumber添加一个附加参数,该参数指向fstream进行操作。

int RandomNumber::makeRndmNumber(int seed, int _fileSize, fStream_MPT FILE, fstream *file)    
{ 

    ((*file).*FILE)("ExampleText",ios_base::in | ios_base::out); 

} 

FILE = fstream::open; 

编辑

这也可以做性病::函数对象干净了一点。

首先重新定义你的类型。

typedef std::function<void(const char*)> fStream_MPT; 

然后当你分配时,一定要绑定你的对象。

fStream_MPT FILE = std::bind(&fstream::open,&file,std::placeholders::_1, ios_base::in | ios_base::out); 

然后在你的功能,你只需调用该函数

int RandomNumber::makeRndmNumber(int seed, int _fileSize, fStream_MPT FILE)    
{ 

    FILE("Example text");  
} 
相关问题