30/09/2018, 20:41

Hỏi về linked list?

Thân chào mọi người, hiện tại em đang học c++ theo các bài hướng dẫn của anh Lê Trần Đạt, tới bài về link list thì không chạy được nên muốn hỏi ạ.

Trước hết em đưa code của mình để mọi người xem sai chỗ nào giúp em sửa với. Máy thì báo là: “No matching function for call to 'sinhvien::sinhvien(int,const char[5], int” em chẳng hiểu gì luôn.

code của em

sinhvien.h:

#ifndef SINHVIEN_H
#define SINHVIEN_H
#include <string>

class sinhvien
{
    public:
        void sinhvien();
        void createnamesv();

    protected:

    private:
        int mssv_;
        std:: string name_;
        sinhvien*next_;

};

#endif //

sinhvien.cpp:

#include "sinhvien.h"
#include <string>


sinhvien::sinhvien(int mssv,const std::string &name,sinhvien*const next_=0)

{
    mssv_=mssv;
    name_=name;
    Sinhvien*next_=next;
}
string createnamesv(int n)
{
    return "sv"+"n";
}

main.cpp:

#include <iostream>
#include <string>
#include "sinhvien.h"
using namespace std;

int main()
{
    sinhvien*first=new sinhvien(1,"sv 1",0);
    Sinhvien*currentsv=first;
    for(int i=2;i<5;i++)
    {
      std::string namesv=createnamesv(i);
      Sinhvien*NewSV=(i,namesv,0);
      currentsv->setnext(NewSV);
      currentsv=NewSV;

    }
    return 0;
}

Nói chung bài này em cũng không hiểu lắm nên code sai chắc cũng nhiều. Có gì mọi người giúp em với ạ. Ngoài ra em thắc mắc xíu: tại sao phải khai báo là const std::string &name mà không khai báo thẳng là string name, cũng như tại sao là const next ạ?

Em xin cảm ơn.

Nguyễn Văn Nam viết 22:51 ngày 30/09/2018

Xem kỹ lại video đi. Vì code này của b sai quá nhiều =))~

  • void sinhvien(); constructor thì không phải để kiều void đâu. (ở file sinhvien.h)
  • Ở sinhvien.cpp thì đang implement constructor sinhvien::sinhvien(int mssv,const std::string &name,sinhvien*const next_=0) mà hàm này lại chưa khai báo ở sinhvien.h
  • Ở file sinhvien.h đang khai báo là void createnamesv(); trong khi ở sinhvien.cpp lại implement string createnamesv(int n)
  • Ở file main.cpp đang gọi std::string namesv=createnamesv(i); bạn không thể gọi trực tiếp hàm createnamesv(i) được mà phải thông qua object của nó ví dụ : std::string namesv= currentsv->createnamesv(i);
  • Ở main.cpp đang gọi hàm currentsv->setnext(NewSV); mà bạn chưa có hàm setnext(NewSV);
  • Lưu ý là sinhvien != Sinhvien ở main.cpp bạn đang dùng nhiều thằng Sinhvien sửa hết lại là sinhvien đi
Lê Trọng Nghĩa viết 22:45 ngày 30/09/2018

Dạ 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,sinhvienconst 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_;
}
sinhviennext() 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()
{
sinhvienfirst=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
0