Hỏi/ Thắc mắc - Mọi người giúp em xem đoạn code này mắc lỗi gì với ạ. Em cảm ơn mọi người ạ. | VN-Zoom | Cộng đồng Chia Sẻ Kiến Thức Công Nghệ và Phần Mềm Máy Tính

Adblocker detected! Please consider reading this notice.

We've detected that you are using AdBlock Plus or some other adblocking software which is preventing the page from fully loading.

We need money to operate the site, and almost all of it comes from our online advertising.

Please add https://vn-z.vn to your ad blocking whitelist or disable your adblocking software.

×

Hỏi/ Thắc mắc Mọi người giúp em xem đoạn code này mắc lỗi gì với ạ. Em cảm ơn mọi người ạ.

tranvanduong

Gà con
#include <iostream>
using namespace std;
class SimpleCircle
{
private:
float *itsRadius;
public:
SimpleCircle();
SimpleCircle(float Radius);
SimpleCircle(const SimpleCircle&);
~SimpleCircle();
float GetItsRad() const { return *itsRadius; }
void SetItsRad(float x) { *itsRadius = x; }
const SimpleCircle& operator++ ();
const SimpleCircle operator++ (int);
const SimpleCircle& operator=(const SimpleCircle&);
};
SimpleCircle::SimpleCircle()
{
itsRadius = new float;
*itsRadius = 5;
}
SimpleCircle::SimpleCircle(const SimpleCircle& rhs)
{
itsRadius = new float;
*itsRadius = rhs.GetItsRad();
}
SimpleCircle::~SimpleCircle()
{
delete itsRadius;
itsRadius = 0;
}
SimpleCircle::SimpleCircle( float Radius )
{
itsRadius = new float;
*itsRadius = Radius;
}
const SimpleCircle& SimpleCircle :: operator++ ()
{
++itsRadius;
return *this;
}
const SimpleCircle SimpleCircle :: operator++ (int flag)
{
SimpleCircle temp(*this);
++itsRadius;
return temp;
}
const SimpleCircle& SimpleCircle :: operator= (const SimpleCircle& rhs)
{
if(this == &rhs)
return *this;
*itsRadius = rhs.GetItsRad();
return *this;
}
int main()
{
SimpleCircle Circle1;
cout << "Radius of Circle1: " << Circle1.GetItsRad() << endl;
SimpleCircle Circle2(9);
cout << "Radius of Circle2: " << Circle2.GetItsRad() << endl;
++Circle1;
cout << "Radius of Circle1: " << Circle1.GetItsRad() << endl;
Circle2++;
cout << "Radius of Circle2: " << Circle2.GetItsRad() << endl;
Circle2 = Circle1;
cout << "Radius of Circle2: " << Circle2.GetItsRad() << endl;
return 0;
}

OUTPUT:
Radius of Circle1: 5
Radius of Circle2: 9
Radius of Circle1: -1.21979e-12
Radius of Circle2: -1.21979e-12
Radius of Circle2: -1.21979e-12
 

VNZ-NEWS

Administrator
Thành viên BQT
Đây là kết quả sau khi tôi nhờ chatGPT kiểm tra và sửa lỗi


Đoạn code của bạn có một số vấn đề dẫn đến kết quả đầu ra không mong muốn:

Lỗi trong toán tử tiền tố (++):
Mã:
const SimpleCircle& SimpleCircle::operator++ ()
{
++itsRadius; // Sai: itsRadius là con trỏ, việc tăng `itsRadius` thực chất là thay đổi địa chỉ mà nó trỏ đến.
    return *this;
}

Vấn đề: itsRadius là con trỏ (float*), do đó, ++itsRadius sẽ tăng địa chỉ của con trỏ thay vì giá trị mà nó trỏ tới. Điều này dẫn đến việc con trỏ trỏ tới vùng nhớ không hợp lệ.

Giải pháp: Thay đổi ++itsRadius thành ++(*itsRadius) để tăng giá trị thực tế mà con trỏ trỏ đến.

Sửa lại:
Mã:
const SimpleCircle& SimpleCircle::operator++ ()
{
    ++(*itsRadius);
    return *this;
}


Lỗi trong toán tử hậu tố (++):
[code]
const SimpleCircle SimpleCircle::operator++ (int flag)
{
    SimpleCircle temp(*this); // Tạo một đối tượng tạm thời
    ++itsRadius; // Sai giống như trên
    return temp;
}

Vấn đề: Tương tự, ++itsRadius cần được sửa thành ++(*itsRadius)
Sửa lại:
Mã:
const SimpleCircle SimpleCircle::operator++ (int flag)
{
    SimpleCircle temp(*this);
    ++(*itsRadius);
    return temp;
}

Kiểm tra toán tử gán (=):
Mã:
const SimpleCircle& SimpleCircle::operator=(const SimpleCircle& rhs)
{
    if (this == &rhs) // Kiểm tra tự gán
        return *this;
    *itsRadius = rhs.GetItsRad(); // Gán giá trị từ đối tượng khác
    return *this;
}

Không có lỗi trong đoạn này, nhưng bạn nên cân nhắc việc thêm kiểm tra xem rhs.itsRadius có hợp lệ hay không (đề phòng trường hợp itsRadius trỏ tới vùng nhớ null).

Tổng hợp sửa lỗi:


1. Sửa lỗi trong cả hai toán tử ++:

Mã:
const SimpleCircle& SimpleCircle::operator++ ()
{
    ++(*itsRadius); // Thay đổi giá trị
    return *this;
}

const SimpleCircle SimpleCircle::operator++ (int flag)
{
    SimpleCircle temp(*this);
    ++(*itsRadius); // Thay đổi giá trị
    return temp;
}
2. Giữ nguyên toán tử gán và các hàm khác.
Kết quả đầu ra sau sửa lỗi:

Sau khi sửa, chương trình của bạn sẽ in ra kết quả đúng như mong đợi:
Mã:
Radius of Circle1: 5
Radius of Circle2: 9
Radius of Circle1: 6
Radius of Circle2: 10
Radius of Circle2: 6

Hãy thử sửa code theo các hướng dẫn trên và chạy lại chương trình!
 


Top