Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 试图将指针作为参数传递给指向文件的fstream成员_C++_Pointers_Reference_Members - Fatal编程技术网

C++ 试图将指针作为参数传递给指向文件的fstream成员

C++ 试图将指针作为参数传递给指向文件的fstream成员,c++,pointers,reference,members,C++,Pointers,Reference,Members,/*感谢所有看到这个的人,他们可能会试图回答这个问题。我真的不想在这里浪费任何人的时间,但我已经为此绞尽脑汁三天了。我意识到这对理解它的人来说可能非常简单。我已经尝试了我能想到的所有可能的组合,但仍然会出现编译器错误 C:\random\RNDNUMTEST.cpp(41):错误C2102:“&”需要l值 我试图将指针作为参数传递给成员函数fstream.open()的函数makeRndmNumber()。我想在RNDNUMTEST.cpp中打开该文件,然后将其传递给makeRndmNumber

/*感谢所有看到这个的人,他们可能会试图回答这个问题。我真的不想在这里浪费任何人的时间,但我已经为此绞尽脑汁三天了。我意识到这对理解它的人来说可能非常简单。我已经尝试了我能想到的所有可能的组合,但仍然会出现编译器错误

C:\random\RNDNUMTEST.cpp(41):错误C2102:“&”需要l值

我试图将指针作为参数传递给成员函数fstream.open()的函数makeRndmNumber()。我想在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;
}
//这些只是实际文件的摘录。
//RndmNum_Class.h文件
typedef void(fstream::*fstream\u MPT)(const char*);//fStream\u MPT(成员指针类型)
类随机数{
公众:
随机数();
~RandomNumber(){};
静态void loadDigits(双精度、双精度、字符数组[]);
静态int getLastNDigits(字符数组[],int);
静态int makeRndmNumber(int,int,fStream\u MPT);
};
//*************************************************************8
//RndmNum_Class.cpp文件
int RandomNumber::makeRndmNumber(int种子、int文件大小、fStream文件){
......
}
//**************************************************************/
//RNDNUMTEST.cpp文件
#包括“RndmNum_Class.h”
int main(){
const char*RNDM_FILE=“c:\\RandomFile.txt”;
fstream fstream_Obj;
//FStream_对象打开(RNDM_文件);
fStream\u MPT FileMembPtr=&fStream\u Obj.open(RNDM\u文件);
//fStream\u MPT FileMembPtr=&fStream::open;
int seed=297814;
int size=20000;

cout这个:
&FStream\u对象打开(RNDM\u文件)
不是获取函数的地址,而是尝试获取调用该函数的返回值的地址。但是该函数返回
void
,因此会显示错误消息。

没有任何意义:使用了成员函数指针,因此您可以在某个位置应用不同的成员函数,而不知道具体是哪个函数被调用。这就像传递函数名一样(除了在编译时解析名称)。这似乎不是您想要做的

即使您能够正确地获取函数的地址(而不是试图获取调用
open()
)的结果的地址),它也不会工作,因为
std::fstream::open()
接受两个参数:第二个参数用于打开模式,默认为
std::ios_base::in | std::ios_base::out


我不太确定您真正想要的是什么,但似乎您想要传递文件流。通常的方法是将对
std::iostream
的引用作为参数传递给函数。实际上,您可能希望最初使用
std::ifstream
,然后将参数作为
std::istream&
传递。

首先,将函数定义从
typedef void(fstream::*fstream\u MPT)(const char*);
更改为
typedef void(fstream::*fstream\u MPT)(const char*,ios\u base::openmode)
,有一个默认参数您忘记了

根据您的注释将
fStream\u MPT FileMembPtr=&fStream\u Obj.open(RNDM\u FILE)
更改为
fStream\u MPT FileMembPtr=&fStream::open;
,并为makerdnumber添加一个附加参数,makerdnumber是指向要操作的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;
编辑

这也可以通过std::function对象来完成

首先重新定义你的类型

typedef std::function<void(const char*)> fStream_MPT;
然后在函数中,只需调用函数

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

    FILE("Example text");    
}
int RandomNumber::makeRndmNumber(int seed, int _fileSize, fStream_MPT FILE)               
{

    FILE("Example text");    
}