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;
}
Trần Ngọc Khải viết 22:45 ngày 30/09/2018

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.

Nam Võ viết 22:51 ngày 30/09/2018

em cũng nghĩ như vậy.

Đạt Shiro viết 22:57 ngày 30/09/2018

Tại sao phải dùng currentsv-> createname(i)?

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.

rogp10 viết 22:55 ngày 30/09/2018

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ằng const.

Bài liên quan
0