Operator Overloading
Suppose we have two objects that belong to a custom Vector class, how would we allow the addition of those two objects? Using normal class functions would be good, but it would take a longer time to write, and would be harder to understand.
To solve this issue in Class++, just like in C++, we can change the way operators work for our classes. This is known as operator overloading.
local class = ClassPP.class
local Vector = class "Vector3" {
constructor = function(self, x: number, y: number, z: number)
if typeof(x) ~= "number" or typeof(y) ~= "number" or typeof(z) ~= "number" then self.coordinates = {0, 0, 0} return end
self.coordinates = {x, y, z}
end,
Public = {
coordinates = {0, 0, 0},
},
}
function Vector.Public:operator_add(otherVector)
assert(#self.coordinates == #otherVector.coordinates)
local coordinates = {}
for i = 1, #self.coordinates do
coordinates[i] = self.coordinates[i] + otherVector.coordinates[i]
end
return Vector.new(coordinates[1], coordinates[2], coordinates[3])
end
function Vector.Public:__tostring()
return "(" .. table.concat(self.coordinates, ", ") .. ")"
end
local vector1 = Vector.new(4, 5, 2)
local vector2 = Vector.new(1, 2, 3)
print(vector1 + vector2) -- Prints "(5, 7, 5)"
In this example, we have created a custom Vector3 class that has a special function called operator_add
, this special function is one of the special functions in Class++ that allows you to overload a specific operator. Here, we overloaded the operator +
with our custom function that allows us to add two Vectors together.
Overloadable Operators
Method | Description |
---|---|
operator_add(self, obj) |
Function for overloading the + operator. |
operator_sub(self, obj) |
Function for overloading the - operator. |
operator_mul(self, obj) |
Function for overloading the * operator. |
operator_div(self, obj) |
Function for overloading the / operator. |
operator_idiv(self, obj) |
Function for overloading the // operator. |
operator_mod(self, obj) |
Function for overloading the % operator. |
operator_pow(self, obj) |
Function for overloading the ^ operator. |
operator_unm(self) |
Function for overloading the unary – operator. |
operator_eq(self, obj) |
Function for overloading the == operator.¹ |
__tostring() |
Fired when tostring is called on the object. |
Info
¹: This function will only run when == operator is used with the same base type (table, userdata, etc.). It will not work with different types, such as an object with a table, or another type.
Warning
Trying to directly call the operator functions will result in an error. They must be called with their operators.