Calvin Nix
Calvin Nix

Reputation: 11

Trying to pass a pointer as a parameter to a member of fstream that points to a file

/* Thanks to anyone looking at this who might attempt to answer it. I'm really not trying to waste anyone's time here, but I have beat my head on this for about three days. I realize it is probably very simple for someone who understands it. I have tried most every possible combination I can think of and still get compiler errors.

C:\random\RNDNUMTEST.cpp(41) : error C2102: '&' requires l-value

I am trying to pass a pointer as a parameter to a function makeRndmNumber() for the member function fstream.open(). I want to open the file in RNDNUMTEST.cpp and then pass it to makeRndmNumber() so that it can be modified in some way. I have looked online for help, including this website, but I feel like I am overlooking something important or simple or maybe I am just missing the concept altogether.

This isn't for homework, I'm not a college student. Although I did go to school for it, it has been over 10 years since I've done any programming and I never really understood this that well to begin with. Any suggestions would be appreciated.

// 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;
}

Upvotes: 0

Views: 277

Answers (3)

user406009
user406009

Reputation:

First, change the function definition from typedef void(fstream::*fStream_MPT)(const char*); to typedef void(fstream::*fstream_MPT)(const char*,ios_base::openmode), there is a default parameter you are forgetting.

Change the fStream_MPT FileMembPtr = &FStream_Obj.open(RNDM_FILE); to fStream_MPT FileMembPtr = &fstream::open; as per your comment, and add an additional parameter to makeRndNumber, a pointer to an fstream to operate on.

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

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

}

FILE = fstream::open;

EDIT

This could also be done a little cleaner with std::function objects.

First redefine your type.

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

Then when you assign, be sure to bind your objects.

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

Then in your function you simply call the function

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

    FILE("Example text");    
}

Upvotes: 1

Dietmar K&#252;hl
Dietmar K&#252;hl

Reputation: 153840

It doesn't make any sense: member function pointers is used so you can apply different member functions somewhere without knowing which exact function is called. It is like passing the function's name around (except that the name is resolved at compile-time). It doesn't seem that this is what you want to do!

Even if you would correctly obtain the function's address (rather than trying to get the address of the result of calling open()), it wouldn't work because std::fstream::open() takes two arguments: the second argument is for the open-mode and it is defaulted to std::ios_base::in | std::ios_base::out.

I'm not quite sure what you really want to d but it seems you want to pass the file stream around. The normal way to do this is to pass a reference to a std::iostream as argument to the function. Well, actually you probably want to use a std::ifstream initially and hence pass the argument as std::istream&.

Upvotes: 0

Oliver Charlesworth
Oliver Charlesworth

Reputation: 272527

This: &FStream_Obj.open(RNDM_FILE) is not taking the address of the function, it's trying to take the address of the return value of a call to that function. But that function returns void, hence the error message.

Upvotes: 1

Related Questions