2012-01-07 45 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");  
} 
相關問題