2012-03-18 2 views
0

내가 작업이 기능을 얻기 위해 노력하고 있어요,하지만 난오류 C2059 : 구문 오류 : '.'

가 계속

오류 C2059 : 구문 오류 : '.'

is_declared를 호출하는 두 개의 declare() 함수 본문의 행에 나와 있는데 알아낼 수 없습니다. is_declared와 관련이 있다는 것을 알고 있지만 문제가 있습니다.


class Variable {  
public: 
    std::string name; 
    double value; 
    char type;  
    Variable(std::string n, double v) :name(n), value(v), type('v') { } 
    Variable(std::string n, double v, char a) :name(n), value(v), type('c') { } 
}; 

class Symbol_table { 
public: 
    Symbol_table(); 
    double get(std::string s); 
    void set(std::string s, double d); 
    bool is_declared(std::string s); 
    double declare(std::string var, double val); 
    double declare(std::string var, double val, char c); 
private: 
    std::vector<Variable> var_table; 
}; 
Symbol_table::Symbol_table() {} 
double Symbol_table::get(std::string s)  
{ 
for (int i = 0; i<var_table.size(); ++i) 
    if (var_table[i].name == s) return var_table[i].value; 
error("get: undefined name ",s); 
} 
void Symbol_table::set(std::string s, double d) 
{ 
for (int i = 0; i<=var_table.size(); ++i) 
    if (var_table[i].name == s) { 
     if (var_table[i].type == 'c') error("set_value: Cannot change a constant's value"); 
     var_table[i].value = d; 
     return; 
    } 
error("set: undefined name ",s); 
} 
double Symbol_table::declare(std::string var, double val) 
{//error here 
    if (Symbol_table.is_declared(var)) error(var," declared twice"); 
    var_table.push_back(Variable(var,val)); 
    return val; 
} 
double Symbol_table::declare(std::string vari, double valu, char c) 
{//error here 
    if (Symbol_table.is_declared(vari)) error(vari," declared twice"); 
    var_table.push_back(Variable(vari,valu,c)); 
    return valu; 
} 
bool Symbol_table::is_declared(std::string s) 
{ 
for (int i = 0; i<var_table.size(); ++i) 
    if (var_table[i].name == s) return true; 
    return false; 
} 
+0

'std :: find()'및' '의 다른 기능은 친구입니다. 그들은 많은 일반적인 종류의 루프를 더 간단하고 읽기 쉬운 방법으로 작성할 수있게 해줍니다. 또한'std :: map' 또는'std :: unordered_map'을 사용하면 많은 작업을 단순화하고 성능을 향상시킬 수 있습니다. –

답변

3

Symbol_table.is_declared 구문은 문맥에 유효한 C++ 아니다. 대부분의 경우 당신은 당신이 그 스타일의 문제 선호하는 경우도 this->를 생략 할 수 있습니다

if (this->is_declared(var)) error(var," declared twice"); 

작성하는 것을 의미했다.

+0

왜 이것을 필요로합니까? 확실히 (is_declared (var)) error (var, "twice twice") 직접 클래스의 멤버 함수를 호출하면됩니다. 또는 나는 무엇인가 놓치고 있냐? – EdChum

+0

@EdChum : * 필요하지 않습니다. 충분히 명확하다고 생각합니다. – Jon

+0

저는 C++에 더 익숙하고 책에서 운동을하고 있습니다. 그래서이게 무엇인지 모르겠지만, 이것없이 시도해 보았습니다. 따라서 다른 멤버 함수에서 멤버 함수를 사용할 때 멤버를 지정할 필요가 없습니까? 아니면 내가 잘못한 것을 이해하지 못했습니까? – Fuddlebutts