2013-02-26 186 views
0

我正在爲編譯器編寫解析器。所以對於構造我的代碼:C++構造函數錯誤

//constructor 
Parser::Parser(char* file) 
{ 
    MyLex(file) ; 
} 

在使用編譯G ++ parsy.cpp parsydriver.cpp,不過,我得到這個錯誤說:

parsy.cpp: In constructor ‘Parser::Parser(char*)’: 
parsy.cpp:13: error: no matching function for call to ‘Lex::Lex()’ 
lexy2.h:34: note: candidates are: Lex::Lex(char*) 
lexy2.h:31: note:     Lex::Lex(const Lex&) 
parsy.cpp:15: error: no match for call to ‘(Lex) (char*&)’ 

我要去哪裏錯了? Lex myLex在Parser頭文件中聲明爲private。我不知道該怎麼做 。我嘗試使用這樣的:

//constructor 
Parser::Parser(char* file):myLex(file) 
{ 
} 

我的詞法分析器構造是:

Lex::Lex(char* filename): ch(0) 
{ 
    //Set up the list of reserved words 
    reswords[begint] = "BEGIN"; 
    reswords[programt] = "PROGRAM"; 
    reswords[constt] = "CONST"; 
    reswords[vart] = "VAR"; 
    reswords[proceduret] = "PROCEDURE"; 
    reswords[ift] = "IF"; 
    reswords[whilet] = "WHILE"; 
    reswords[thent] = "THEN"; 
    reswords[elset] = "ELSE"; 
    reswords[realt] = "REAL"; 
    reswords[integert] = "INTEGER"; 
    reswords[chart] = "CHAR"; 
    reswords[arrayt] = "ARRAY"; 
    reswords[endt] = "END"; 

    //Open the file for reading 
    file.open(filename); 
} 

但是,這產生了以詞法分析器文件和功能一堆不確定的參考! 我已經正確地包含了這些文件。但到目前爲止,我不明白如何解決這個問題。

UPDATE 頭文件夾雜物:

parsy.h文件:

#ifndef PARSER_H 
#define PARSER_H 

// other library file includes 

#include "lexy2.h" 
class Parser 
{ 
}... 

parsy.cpp文件:

// usual ilbraries 

#include "parsy.h" 

using namespace std ; 

Parser::Parser(char* file) .... 

parsydriver.cpp:

// usual libraries 
#include "parsy.h" 
using namespace std ; 

int main() 
.. 

lexy2.cpp文件:

我已經包含了lexy2.h文件。我應該在詞法分析器中包含解析器頭文件嗎?看起來不太可能。但是我應該如何解決它們呢?

+3

第二種方法是正確的方法。第一次工作時問題依然存在。他們是從你身上發芽的鏈接器錯誤,沒有以某種形式正確鏈接。 – chris 2013-02-26 04:34:26

+0

如何克服鏈接器錯誤?我將編輯並更新我將頭文件包含在內的問題。 – thestralFeather7 2013-02-26 04:35:35

+0

請選擇:http://stackoverflow.com/questions/12573816/what-is-an-undefined-reference-unresolved-external-symbol-error-and-how-do-i-fix – chris 2013-02-26 04:37:18

回答

2

構造函數中的代碼在構造對象時運行。你的班級MyLex沒有默認構造函數。所以,你必須定義默認構造函數,或者它應該是:

//constructor 
Parser::Parser(char* file): MyLex(file) 
{ 
} 

如果你有「未定義的符號」鏈接錯誤,那麼你忘了一些.cpp文件(也許lexy2.cpp)添加到項目中或編譯器命令行。假設位於lexy2.cpp中的所有未定義的符號,然後嘗試g++ parsy.cpp parsydriver.cpp lexy2.cpp

+0

好吧,我有4個文件+ 1驅動程序文件。我應該如何在shell中編譯它? 文件是:lexy2。h lexy2.cpp parsy.h parsy.cpp和parsydriver.cpp – thestralFeather7 2013-02-26 04:59:47

+0

@ novice7編輯答案以添加命令行示例。 – Sergey 2013-02-26 05:04:14