30/09/2018, 20:43

Thắc mắc lỗi no matching function?

Chào mọi người, em đang tạo 1 class theo c++ để khai báo mssv, name và con trỏ của một linked list.
Khi chạy thì bị báo lỗi là constructor no matching và hàm sinhvien bị nhận lầm là (int, char[4], int). Làm sao để khắc phục ạ?

Toàn bộ code của em:

sinhvien.h

#ifndef SINHVIEN_H
#define SINHVIEN_H
#include <string>



class sinhvien
{
    public:
        sinhvien(int mssv,std::string &name,sinhvien*const next_=0);
        void setNext(sinhvien*const next);
        sinhvien*addNext(sinhvien*const next);
        int getMssv()const;
        std::string getName()const;
        sinhvien*getNext()const;
        bool hasNext()const;
        virtual ~sinhvien();

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

#endif // SINHVIEN_H

sinhvien.cpp:

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

sinhvien::sinhvien(int mssv,const std::string &name,sinhvien*const next_=0)
{
   mssv_=mssv;
   name_=name;
   next_=next;
}

   void sinhvien::setNext(sinhvien*const next)
    {
       std::cout<<mssv_<<""<<name_<<" -> "<<next->mssv_<<""<<next->name_<<std::endl;
       this->next_=next;
    }
    sinhvien*sinhvien::addNext(int mssv,std::string ==&name,sinhvien*const next)
    {
       sinhvien*newsv = new sinhvien(mssv,name,next);
       this->next_=newsv;
       std::cout<<mssv_<<""<<name_<<" -> "<<next->mssv_<<""<<next->name_<<std::endl;
       return newsv;
    }
    int sinhvien::getMssv()const
    {
        return this->mssv_;
    }
    std::string sinhvien::getName()const
    {
        return this->name_;
    }
    sinhvien*sinhvien::getNext()const
    {
        if(hasNext())
        {
            return this->next_;
        }
        else
            return 0;
    }
    bool sinhvien::hasNext()const
    {
        return this->next_==0;
    }
sinhvien::~sinhvien()
{
    //dtor
}

main.cpp:

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

std::string createname(int n)
{
    return "sv"+n;
}

int main()
{
    sinhvien*first=new sinhvien(1,"sv1",0);
    sinhvien*currentsv=first;
    for(int i=2;i<5;i++)
    {
        std::string name=createname(i);
        sinhvien*newsv=new sinhvien(i,name,0);
        currentsv->setNext(newsv);
        currentsv=newsv;
    }

    return 0;
}

em cảm ơn ạ.

Đông viết 22:49 ngày 30/09/2018

Nếu bạn khai báo constructor có tham số thì phải khai báo constructor mặc định nữa !! Trong CT , nếu k khai báo constructor thì khi chạy nó tự tạo constructor mặc định . Một khi đã khai báo constructor có tham số thì phải khai báo constructor mặc định ! Theo mình là vậy

thêmsinhvien() vào xem !

Lê Trọng Nghĩa viết 22:52 ngày 30/09/2018

Em đã thêm và vẫn không được ạ. Anh có thể chạy thử code em được không?

Lê Trọng Nghĩa viết 22:55 ngày 30/09/2018

Hiện tại em đã sửa lại code ở hàm main.cpp thành
std::string x=“sv1”;
sinhvien*first=new sinhvien(1,x,0);
Thì chỗ đó không báo lỗi nữa nhưng lại nhảy qua hàm sinhvien.cpp báo lỗi là prototype sinhvien doesnt match any in class

Bài liên quan
0