Tôi muốn triển khai cấu trúc dữ liệu cây biểu thức số học đơn giản trong C++, sao cho đối tượng cây biểu thức được khởi tạo bởi: ExprTree(operator, expression1, expression2)
. Dưới đây là một ví dụ về cách nó nên làm việc:Cấu trúc dữ liệu cây biểu thức
double x = 1, y = 2, z = 0.5;
expr1 = ExprTree('*', x, y); // expr1 = 1 * 2 = 2
expr2 = ExprTree('-', expr1, z); // expr2 = (1 * 2) - 0.5 = 1.5
cout << expr2.str() << endl; // ((1 * 2) - 0.5)
cout << expr2.eval() << endl; // 1.5
Sau đây là cách mã của tôi trông cho đến nay:
template<class operand_type>
class ExprTree
{
public:
ExprTree(const char op_, operand_type& operand1_, operand_type& operand2_)
{
op = op_;
operand1 = operand1_;
operand2 = operand2_;
}
double eval() const;
std::string str() const;
private:
char op;
typename operand_type operand1, operand2;
};
template<class operand_type>
std::string ExprTree<operand_type>::str() const
{
std::ostringstream os;
std::string op1, op2;
if (typeid(*operand1) == typeid(ExprTree))
op1 = operand1->str();
else
op1 = std::string(*operand1);
if (typeid(*operand2) == typeid(ExprTree))
op2 = operand1->str();
else
op2 = std::string(*operand2);
os << "(" << op1 << " " << op << " " << op2 << ")";
return os.str();
}
Tuy nhiên, tôi nhận được lỗi này khi tôi biên dịch mã:
left of '->write' must point to class/struct/union/generic type
Tôi sẽ đánh giá cao nếu ai đó giúp tôi với lỗi này và có thể cung cấp một số mẹo về cách tôi nên triển khai cấu trúc dữ liệu này. Btw, tôi rất mới với C++.
Tôi không thấy đoạn mã có liên quan (lệnh gọi tới 'write' hoặc định nghĩa của nó). – Unimportant
Tôi đã chỉnh sửa mã. Nó sẽ đọc 'str' thay vì' write'. – Randolph
Bạn cần thêm kiểu mẫu khi bạn khởi tạo đối tượng: 'ExprTree expr1 ('*', x, y);' Dòng tiếp theo 'ExprTree (' - ', expr1, z) 'yêu cầu một hàm tạo có thể thực hiện 2 loại toán hạng khác nhau. –
Unimportant