Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Kết quả 1 đến 7 của 7
  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    Lỗi con trỏ p trong Class Vector, giúp em với ạ.

    Em viết code như sau:

    //Vector.h
    Mã:
    class CVector
    {
    private:
    	int n;
    	double *p;
    public:
    	CVector();
    	CVector(int);
    	CVector(const CVector &);
    	~CVector();
    	void Nhap();
    	void Xuat();
    	int LayN();
    	CVector Cong(const CVector &);
    	CVector Tru(const CVector &);
    	CVector Nhan(double); //Nhân với một số thực
    	double Nhan(const CVector &); //Nhân hai vector
    };
    //Vector.cpp
    Mã:
    #include "stdafx.h"
    #include "Vector.h"
    #include <iostream>
    #include <conio.h>
    #include <math.h>
    
    using namespace std;
    
    CVector::CVector()
    {
    	n = 0;
    	p = new double[n];
    	for (int i = 0; i <= n; i++)
    		p[i] = 0;
    }
    CVector::CVector(int nn)
    {
    	n = nn;
    	p = new double[n];
    	for (int i = 0; i <= n; i++)
    		p[i] = 0;
    }
    CVector::CVector(const CVector &u)
    {
    	n = u.n;
    	p = new double[n];
    	for (int i = 0; i < n; i++)
    	{
    		this->p[i] = u.p[i];
    	}
    }
    
    int CVector::LayN()
    {
    	return n;
    }
    
    void CVector::Nhap()
    {
    	for (int i = 0; i < n; i++)
    	{
    		cout << "Nhap toa do thu [" << i << "]: ";
    		cin >> this->p[i];
    	}
    		
    }
    
    void CVector::Xuat()
    {
    	cout << "Vector: (";
    	for (int i = 0;i < n - 1; i++)
    	{
    		cout << this->p[i] << ",";
    	}
    	cout << this->p[n - 1] << ")";
    }
    
    CVector CVector::Cong(const CVector &u)
    {
    	CVector temp;
    	temp.n = u.n;
    	temp.p = new double[temp.n];
    	for (int i = 0; i < n; i++)
    	{
    		temp.p[i] = this->p[i] + u.p[i];
    	}
    	return temp;
    }
    CVector CVector::Tru(const CVector &u)
    {
    	CVector kq;
    	kq.n = n;
    	kq.p = new double[kq.n];
    	for (int i = 0; i < n; i++)
    	{
    		kq.p[i] = this->p[i] - u.p[i];
    	}
    	return kq;
    }
    CVector CVector::Nhan(double x)
    {
    	CVector kq;
    	kq.n = n;
    	kq.p = new double[kq.n];
    	for (int i = 0; i < n; i++)
    	{
    		kq.p[i] = this->p[i] * x;
    	}
    	return kq;
    }
    double CVector::Nhan(const CVector &u)
    {
    	double kq1=0;
    	for (int i = 0; i < n; i++)
    	{
    		kq1 = kq1 + (this->p[i] * u.p[i]);
    	}
    	return kq1;
    }
    
    CVector::~CVector()
    {
    	delete []p;
    }
    Lỗi chạy chương trình của em ở đây chính là ở chỗ định nghĩa hàm phá huỷ ~CVector(). Nếu bỏ hàm này đi thì chương trình chạy tốt. Em debug nhiều lần rồi và thấy sau khi gọi hàm cộng vector, khi return temp (CVector) thì nó gọi lên hàm khởi tạo sao chép (trong đó địa chỉ của u trong sao chép và temp trong cộng là như nhau (tham chiếu truyền vào), lúc này con trỏ this trỏ đến một vùng nhớ mới, và sao chép giá trị u qua. Ngay sau khi gọi khởi tạo xong nó gọi ngay phá huỷ và con trỏ p lại trỏ đến temp, vì vậy kết quả bị xoá ngay lập tức.
    Bác nào giỏi giúp em vụ này với ạ.

  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    về hàm cộng thì có lẽ thế này
    Mã:
    CVector CVector::Cong(const CVector &u)
    {
    	CVector *temp=new CVector;
    	temp->n = u.n;
    	temp->p = new double[temp->n];
    	for (int i = 0; i < n; i++)
    	{
    		temp->p[i] = this->p[i] + u.p[i];
    	}
    	return *temp;
    }
    nhưng có lẽ bạn nên xem lại cái hàm khởi tạo ko đối số có j đó ko ổn

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Mình thử rồi, kết quả vẫn vậy

  4. #4
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi jungsunghyo
    Mình thử rồi, kết quả vẫn vậy
    Bạn đã sửa ntn?
    Mình viết như #2 thì thấy ổn muh. Thậm chí return thẳng 1 object trên Ideone còn được.

    Mình nghĩ là thớt nên (chính xác là buộc phải) cài đặt cái operator= vì thế nào thớt cũng viết:

    Mã:
    CVector a,b;/* doing something */CVector c = a.Cong(b);

  5. #5
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Hàm tạo mặc định, cho n == 0, cấp phát bộ nhớ và for, viết thừa ?

    Mã:
    CVector::CVector(){    n = 0;    p = new double[n];    for (int i = 0; i <= n; i++)        p[i] = 0;}
    Các hàm cộng, trừ và nhân vector nếu this và u không cùng số chiều (tức có giá trị n khác nhau) thì sao ?

    Mã:
    CVector CVector::Cong(const CVector &u){    CVector temp;    temp.n = u.n;    temp.p = new double[temp.n];    for (int i = 0; i < n; i++)    {        temp.p[i] = this->p[i] + u.p[i];    }    return temp;} CVector CVector::Tru(const CVector &u){    CVector kq;    kq.n = n;    kq.p = new double[kq.n];    for (int i = 0; i < n; i++)    {        kq.p[i] = this->p[i] - u.p[i];    }    return kq;} double CVector::Nhan(const CVector &u){    double kq1=0;    for (int i = 0; i < n; i++)    {        kq1 = kq1 + (this->p[i] * u.p[i]);    }    return kq1;}

  6. #6
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    đã ra chưa bạn. [IMG]images/smilies/dont_know.gif[/IMG]

  7. #7
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    @^^ Quăng exception chứ còn sao nữa, chủ yếu là thớt ko hề nghĩ đến chuyện này, nhưng mà như vậy là không thể chấp nhận được.
    @^ Xong rồi bạn [IMG]images/smilies/biggrin.png[/IMG]

 

 

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •