Expr & e1과 Expr e1의 차이가 뭐죠?
글쓴이: ole2000 / 작성시간: 목, 2006/03/02 - 12:33오전
아래와 같은 코드가 있는데..
메인에서 Expr e1 = .. 으로 해주면 잘 됩니다.
근데 Expr & e1으로 하면 error: invalid initialization of non-const reference of type 에러가 나네요.
왜 에러가 나는거죠?
#ifndef _EXPR_H_ #define _EXPR_H_ #include <string> class Expr { public: Expr(string s, bool b) : str(s),value(b) { } virtual bool evaluate() const { return value; } virtual string description() const { return str; } virtual void print(ostream & o) const { o << str; } private: bool value; string str; }; class TRUE : public Expr { public: TRUE() : Expr("T", true) { } }; class FALSE : public Expr { public: FALSE() : Expr("F", false) { } }; class AND : virtual public Expr { public: AND(Expr e1, Expr e2) : Expr( ("( "+e1.description()+" ) AND ( "+e2.description()+" )") , e1.evaluate() && e2.evaluate() ) { } };
#include "Expr.h" int main() { TRUE T; FALSE F; cout << T << " is " << T.evaluate() << endl; cout << F << " is " << F.evaluate() << endl; Expr & e1 = AND (T, F); // 에러 cout << e1 << " is " << e1.evaluate() << endl; }
Forums:
non-const 참조형의 초기값은 lvalue이어야 하는데 지금은 그렇
non-const 참조형의 초기값은 lvalue이어야 하는데 지금은 그렇지 않으니까요.
int& ri = 0 이 허용되지 않는 것과 마찬가지입니다. 이런 식으로 하면 됩니다.
아, 그리고 Expr 생성자의 인자는 const string& 으로 하는 것이 좋겠습니다.
필요없는 복사를 방지할 수 있으니까요.
댓글 달기