Попытка передать указатель в качестве параметра члену fstream, который указывает на файл - PullRequest
0 голосов
/ 07 января 2012

/ * Спасибо всем, кто смотрит на это, кто может попытаться ответить на него. Я действительно не пытаюсь тратить здесь чье-то время, но я бился об этом около трех дней. Я понимаю, что это, наверное, очень просто для тех, кто понимает это. Я перепробовал почти все возможные комбинации, и все равно получаю ошибки компилятора.

C: \ random \ RNDNUMTEST.cpp (41): ошибка C2102: '&' требует l-значение

Я пытаюсь передать указатель в качестве параметра функции 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;
}

Ответы [ 3 ]

1 голос
/ 07 января 2012

Сначала измените определение функции с 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;

EDIT

Это также можно сделать немного чище с объектами std :: function.

Сначала переопределите ваш тип.

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");    
}
1 голос
/ 07 января 2012

Это: &FStream_Obj.open(RNDM_FILE) не принимает адрес функции, он пытается получить адрес возвращаемого значения вызова этой функции. Но эта функция возвращает void, отсюда и сообщение об ошибке.

0 голосов
/ 07 января 2012

Это не имеет никакого смысла: используются указатели на функции-члены, так что вы можете где-то применять различные функции-члены, не зная, какая именно функция вызывается.Это похоже на передачу имени функции (за исключением того, что имя разрешается во время компиляции).Не похоже, что это то, что вы хотите сделать!

Даже если бы вы правильно получили адрес функции (вместо того, чтобы пытаться получить адрес результата вызова open()), она бы неэто не работает, потому что std::fstream::open() принимает два аргумента: второй аргумент для открытого режима и по умолчанию он равен std::ios_base::in | std::ios_base::out.

Я не совсем уверен, что вы действительно хотите, но кажется, что выхочу передать поток файла вокруг.Обычный способ сделать это - передать ссылку на std::iostream в качестве аргумента функции.Ну, на самом деле вы, вероятно, хотите изначально использовать std::ifstream и, следовательно, передать аргумент как std::istream&.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...