01/10/2018, 15:37
Nạp chồng toán tử + với 2 objects khác kiểu dữ liệu của một class
Đề bài đây ạ:
- Xây dựng lớp vector (đặt tên là TVector) có các thành phần
- Các thuộc tính thành phần có kiểu BẤT KỲ (int, char, float, double): x, y, z
- Có tối thiểu hai hàm tạo
- Có các phương thức: Nhập dữ liệu từ bàn phím, xuất dữ liệu ra màn hình
- Có phương thích tính độ lớn vector theo công thức (||v||=sqrt(x 2 +y 2 +z 2 ))
- Nạp chồng hoặc viết hàm bạn các toán tử so sánh: >, >=, <, <=, ==, != để so sánh độ lớn các vector
^Em chỉ hỏi về toán tử + thôi, các toán tử kia sẽ tự làm. Vấn đề ở đây là vector v1 có kiểu dữ liệu int, còn v2 với v3 kiểu float. Nếu v1 là float thì code ở dưới của em tự code chạy ổn không vấn đề gì, nhưng mà v1 lại có kiểu int nên khi chạy bị lỗi:
Error C244: “cannot convert from ‘TVector int’ to 'TVector float”
Ai giúp em với ạ!
#include <conio.h>
#include <iostream>
using namespace std;
template <class T>
class TVector
{
T x, y, z;
public:
TVector() : x{}, y{}, z{} { }
TVector(T a, T b, T c)
{
x = a; y = b; z = c;
}
template <typename U>
TVector operator+(TVector<U> vec)
{
TVector vec1;
vec1.x = this->x + vec.x;
vec1.y = this->y + vec.y;
vec1.z = this->z + vec.z;
return vec1;
};
void intput();
void output()
{
cout << x << endl << y << endl << z;
}
};
template <class T>
void TVector<T>::intput ()
{
cout << "Nhap x: "; cin >> x;
cout << "Nhap y: "; cin >> y;
cout << "Nhap z: "; cin >> z;
}
int main()
{
TVector<int> v1(5, 1, 33);
TVector<float> v2(6.11, 6.1, 5.1);
TVector<float> v3 = v1 + v2;
v3.output();
system("pause");
return 0;
}
Bài liên quan
int và float khác kiểu tại sao lại cho phép cộng với nhau @_@
x, y, z là private, làm sao
TVector<T>
có thể truy cậpTVector<U>::x
hayTVector<U>::y
hayTVector<U>::z
đượcTVector<T> + TVector<U>
tại sao trả về kiểuTVector<T>
? Lỡ T là int, U là float thì 1 + 1.1 trả về 2 à?Vì đề bài yêu cầu vector v1 có kiểu int, vector v2 có kiểu float? Chồng toán tử để cộng 2 vector ý mà.
Các thuộc tính thành phần có kiểu BẤT KỲ (int, char, float, double): x, y, z
Ừ thì em đang vướng mắc chỗ này đó. A code giúp e với.
Cho nó là double hết cũng đâu có chết ai đâu.
Bạn có thể cho x, y, z là public, hoặc vẫn để x, y, z là private và xây dựng các phương thức get_x, set_x, get_y, set_y, get_z, set_z để lấy/gán giá trị cho các phương thức.
Đề bài nó bắt v1 là int . Chứ để cùng kiểu dữ liệu thì khỏi cần template luôn :).
Đã thế thì v3 làm quả chơi lầy, ép hết sang double =))
edit: thiếu
const
ởoperator+
vậy thôi là đủ rồi, bỏ cái
<U>
kia đi. Ở trongmain
thì kiểu int với float ko cộng được với nhau là đúng, v1 phải làTVector<float>
luôn.nếu em muốn
TVector<T> + TVector<U>
thì có nhiều cách, cách để cho người dùng tự quyết là tốt nhất, thêm 1 ctor nhậnTVector<U>
là được:rồi ở dưới main xài:
kiểu ko khuyến khích là kiểu đi lấy kiểu chung giữa T và U, hay là kiểu mà T, U có thể implicit cast:
viết v5 = v1 + v2 sạch đẹp hơn nhưng viết kiểu này làm vẫn có thể gây “lỗi”: kiểu float ko chứa hết tất cả giá trị của kiểu int được. Tốt hơn hết là để người dùng tự ép kiểu, họ phải tự hiểu rõ lỗi mất độ chính xác khi ép int về float.
Em có một thắc mắc nhỏ thôi: Bên trong {} của explicit không viết gì cả ạ?
các biến của class có thể được khởi tạo trước khi vào thân hàm khởi tạo bằng cách xài dấu
:
, khi vào thân hàm khởi tạo thì x, y, z đã được khởi tạo hết rồi khỏi cần viết gì nữanếu em gán a, b, c bên trong
{}
thì thật ra trước đó a, b, c đã được khởi tạo với giá trị mặc định rồi, có thể hiểu làbưng cái khởi tạo lên
:
luôn, khỏi mất công viếtthis->