30/09/2018, 16:46

Bị warning khi dùng con trỏ trong class

#include<iostream>
#include<vector>
using namespace std;
class Test{
    private:
        char* ten;
    public:
        Test();
        ~Test();
        void Nhap();
        void In();
};

Test::Test(){
    ten=new char[25];
    ten[0]='';
}

Test::~Test(){
    delete []ten;
}

void Test::Nhap(){
    cout<<"Nhap ten: ";
    cin.getline(ten,25);
}

void Test::In(){
    cout<<ten;
}

main(){
    vector<Test> ds;
    int i=0;
    char k;
    do{
        Test t;
        cout<<"Nhap du lieu thu "<<++i<<"

";
        cin.sync();
        t.Nhap();
        ds.push_back(t);
        cout<<"

Ban muon nhap tiep khong? (c/k): ";
        cin>>k;
    }while (k=='c');
    for(int i=0;i<ds.size();i++){
        ds[i].In();
    }
    system("pause");
}

Bài này tôi ví dụ cho lỗi xuất sai khi dùng char* trong class và sử dụng stl vector?? Không biết hướng giải quyết thế nào,…Nếu thay đổi char* ten thành char ten[25] thì xuất vẫn bình thường, mong mọi người xem và góp ý

Nguyễn Minh Dũng viết 18:59 ngày 30/09/2018

Đây là warning mà Đạt chạy thử thấy:

||=== Build: Debug in cppproject (compiler: GNU GCC Compiler) ===|
E:\workspace\codeblocks\cppproject\main.cpp|4|warning: ‘class Test’ has pointer data members [-Weffc++]|
E:\workspace\codeblocks\cppproject\main.cpp|4|warning: but does not override ‘Test(const Test&)’ [-Weffc++]|
E:\workspace\codeblocks\cppproject\main.cpp|4|warning: or ‘operator=(const Test&)’ [-Weffc++]|
E:\workspace\codeblocks\cppproject\main.cpp||In constructor ‘Test::Test()’
E:\workspace\codeblocks\cppproject\main.cpp|14|warning: ‘Test::ten’ should be initialized in the member initialization list [-Weffc++]|
E:\workspace\codeblocks\cppproject\main.cpp|45|warning: comparison between signed and unsigned integer expressions [-Wsign-compare]|
||=== Build finished: 0 error(s), 4 warning(s) (0 minute(s), 2 second(s)) ===|

Warning này cảnh báo mình về cách sử dụng con trỏ trong class. Nếu có biến con trỏ thì mình nên tạo copy operator và assign operator. Hàm dựng của bạn là hàm dựng không tham số.

Test::Test(){
    ten=new char[25];
    ten[0]='\0';
}

Nên làm thêm copy operator

Test(const Test&)

Và assigned operator

operator=(const Test&)
Phong Pham viết 19:00 ngày 30/09/2018

Cám ơn a Đạt, e cứ nghĩ là cần dùng thì mới tạo. Nhưng mới biết nguyên tắc là con trỏ thì phải tạo hàm sao chép với định nghĩa lại toán tử =

Bài liên quan
0