0

/* これを見て、答えようとする人に感謝します。ここで誰かの時間を無駄にするつもりはありませんが、この件で約 3 日間頭を悩ませてきました。それを理解している人にとっては、おそらく非常に簡単だと思います。考えられるほとんどすべての組み合わせを試しましたが、コンパイルエラーが発生します。

C:\random\RNDNUMTEST.cpp(41): エラー C2102: '&' には左辺値が必要です

メンバー関数 fstream.open() の関数 makeRndmNumber() にパラメーターとしてポインターを渡そうとしています。RNDNUMTEST.cpp でファイルを開き、それを makeRndmNumber() に渡して、何らかの方法で変更できるようにしたいと考えています。この Web サイトを含め、オンラインでヘルプを探しましたが、何か重要なことや単純なことを見落としているように感じたり、単に概念を完全に見逃しているだけかもしれません.

これは宿題ではありません。私は大学生ではありません。そのために学校には通っていましたが、プログラミングを始めてから 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;
}
4

3 に答える 3

1

これ&FStream_Obj.open(RNDM_FILE)は、関数のアドレスを取得しているのではなく、その関数への呼び出しの戻り値のアドレスを取得しようとしています。しかし、その関数は を返すvoidため、エラー メッセージが表示されます。

于 2012-01-07T02:34:01.063 に答える
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;する fstream へのポインターである makeRndNumber にパラメーターを追加します。

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;

次に、割り当てるときは、必ずオブジェクトをバインドしてください。

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");    
}
于 2012-01-07T02:42:53.510 に答える
0

意味がありません。メンバー関数ポインターが使用されるため、どの関数が正確に呼び出されるかを知らなくても、別のメンバー関数をどこかに適用できます。これは、関数の名前を渡すのと似ています (ただし、名前はコンパイル時に解決されます)。これはあなたがやりたいことではないようです!

( を呼び出した結果のアドレスを取得しようとするのではなく) 関数のアドレスを正しく取得したとしても、は 2 つの引数を取るopen()ため機能しません。std::fstream::open()std::ios_base::in | std::ios_base::out

本当に何をしたいのかよくわかりませんが、ファイルストリームを渡したいようです。これを行う通常の方法はstd::iostream、関数への引数として a への参照を渡すことです。実際には、おそらくstd::ifstream最初に a を使用したいので、引数を として渡しますstd::istream&

于 2012-01-07T02:41:08.410 に答える