2014-03-18 126 views
0

我試圖通過構造函數傳遞帶有字符串的文件名,我的代碼是這樣的。爲了簡單起見,我刪除了一些不必要的東西。通過構造函數將值傳遞給std :: ifstream

// header file 

Interpreter(const std::string location); 
std::ifstream *file; 

// end header file 

// class file 

Interpreter::Interpreter(const std::string location) { 
    file = new std::ifstream(location.c_str()); 
} 

// end class file 

但是,結果是「Debug Assertion Failed!」(調試斷言失敗!)。

image

編輯: 作爲一個相當新手C++程序員(從Java來了),我已經採取了一個初始化列表的建議,這是我現在的代碼(在頭):

std::ifstream file; 

Interpreter(const std::string location) { 
    file.open(location.c_str()); 
} 

但是我仍然得到相同的錯誤,有什麼幫助嗎?謝謝!

編輯2:

int main(int argc, char** argv) { 
    Interpreter *interpreter = nullptr; 

    // check if arguments are provided 
    if (argc > 0) { 
     interpreter = new Interpreter(argv[1]); 
    } else { 
     // for now just use the debug script 
     error("No input files, using default script (debug)"); 
     interpreter = new Interpreter("test.m"); 
    } 

    interpreter->read(); 
    delete interpreter; 

    return 0; 
} 

編輯3

你的意思是這個初始化列表?

Interpreter::Interpreter(const std::string location): file(location) {  
} 

編輯4

最後的編輯,謝謝你們:) 原來,問題是用論據

而且ARGC> 0並不意味着ARGV [1]是安全的訪問。

這是在CPP文件中,仍然給出相同的結果。 d:

+0

不需要指針。使用初始化程序列表。瞧,不再需要三條規則。 – chris

+0

你可以顯示執行呼叫的代碼嗎? – Angew

+0

已添加編輯2 :) – chapman

回答

1
if (argc > 0) { 
    interpreter = new Interpreter(argv[1]); 

這是不正確的,如果argc == 1然後argv[1]是出界,它應該是

if (argc > 1) { 
    interpreter = new Interpreter(argv[1]); 

至於問題的其餘部分,我會寫這樣的構造:

Interpreter(const std::string location) : file(location) { } 

(在C++ 11可以從std::string構建fstream,如果不與你的編譯工作,然後用location.c_str(),你以前有:

Interpreter(const std::string location) : file(location.c_str()) { } 

我會寫你的main功能是這樣的:

int main(int argc, char** argv) 
{ 
    std::string file; 
    // check if arguments are provided 
    if (argc > 1) { 
     file = argv[1]; 
    } else { 
     // for now just use the debug script 
     error("No input files, using default script (debug)"); 
     file = "test.m"; 
    } 

    Interpreter interpreter(file); 
    interpreter.read(); 
} 

這有沒有newdelete,是簡單和清晰。

相關問題