30/09/2018, 20:41
Thắc mắc về linked list (p2)
Em đã sửa lại code rồi mà vẫn bị lỗi tùm lum.
Em vẫn thắc mắc:
- Cách khai báo để lấy ra mssv, name, next của 1 object?
- Tạu sao phải có const ở con trỏ? Tại sao phải dùng reference cho name?
- Tại sao phải dùng currentsv-> createname(i)? Trong clip thì không cần viết như vậy. Mà lại không thấy được hàm createname :((
- Có cần phải declare lại các biến bên cpp ko? Tại sao cứ báo lỗi hoài T.T
Lỗi hiện tại: non-member function ‘int mssv()’ cannot have cv-qualifier.
Em cảm ơn.
Code mới đây ạ:
sinhvien.h:
ifndef SINHVIEN_H
define SINHVIEN_H
include
class sinhvien
{
public:
sinhvien(int mssv,const std::string &name,sinhvien*const next=0);
std::string createname(int n);
void setNext(sinhvien*const other);
int mssv();
std::string name();
sinhvien*next();
protected:
private:
int mssv_;
std::string name_;
sinhvien* next_;
};
endif // SINHVIEN_H
sinhvien.cpp
include "sinhvien.h"
include
sinhvien::sinhvien(int mssv,const std::string &name,sinhvien*const next)
{
mssv_=mssv;
name_=name;
next_=next;
}
int mssv()const
{
return mssv_;
}
string name() const
{
return name_;
}
sinhvien*next() const
{
return next_;
}
void setnext(sinhvien*const other)
{
next_=other;
}
string createname(int n)
{
return "sv"+"n";
}
sinhvien::~sinhvien()
{
next_=0;
}
main.cpp:
include
include
include "sinhvien.h"
int main()
{
sinhvien*first=new sinhvien(1,"sv 1",0);
sinhvien*currentsv=first;
for(int i=2;i<5;i++)
{
std::string name=currentsv->createname(i);
sinhvien*newSV=(i,name,0);
currentsv->setNext(newSV);
currentsv=newSV;
}
return 0;
}
Bài liên quan
Mình nghĩ là bạn thiếu
sinhvien::
trước mấy hàm trong sinhvien.cpp(cái :: là toán tử vùng miền gì đó mình không nhớ rõ)
Trong sinhvien.h bạn đã bỏ những biến trong private ra public bạn chỉ cần 1 trong 2 cái đó thôi.
em cũng nghĩ như vậy.
vì ở đây currentsv là 1 biến con trỏ. Và trong C/C++ thì khi muốn gọi thủ tục của object thông qua con trỏ, đầu tiên phải dereference con trỏ đó trước, tức là phải thực hiện như sau
(*currentsv).creatname(i);
nhưng viết như vậy sẽ khá xấu nên do đó có 1 cách viết khác là
currentsv->creatname(i);
cả 2 cách viết trên đều như nhau.
Khi dùng tham chiếu bạn có thể sửa đối tượng được tham chiếu, vì vậy phải dùng
const
. Với class phải có const method với prototype kết thúc bằngconst
.