thảo luận [C++] Thớt bàn luận, hỏi đáp thắc mắc về C++

:angry: Mọi người ơi, không biết cái linked list này bị lỗi chỗ nào mà biên dịch thành công, runtime thành công mà bảng console lại không hiện số là sao?
C++:
#include<iostream>
template<class X>
struct Node
{
    Node<X>* next;
    X value;
    Node()
    {
        next = nullptr;
        value = 0;
    }
    Node(X val)
    {
        next = nullptr;
        value = val;
    }
    Node(X val, Node *nextnode)
    {
        next = nextnode;
        value = val;
    }
};
/*****************************************************/
template<class Y>
class LinkedList
{
private:
    Node<Y> *head;
    unsigned int size;
public:
    LinkedList()
    {
        head = nullptr;
        size = 0;
    }
    void push(Y val)
    {
        if (size == 0)
        {
            head = new Node<Y>(val);
            size++;
            return;
        }
        Node<Y> *dummy = new Node<Y>();
        dummy->next = head;
        while (head != nullptr)
        {
            head = head->next;
        }
        head = new Node<Y>(val);
        head = dummy->next;
        size++;
    }
    unsigned int length()
    {
        return size;
    }
};
int main()
{
    int n = 10;
    std::cout << "[ ";
    LinkedList<int> ListNode;
    for (int i = 1; i <= n; i++)
    {
        ListNode.push(i);
        std::cout << ", ";
    }
    std::cout << "]" << endl;
    std::cout << "Size: " << ListNode.length() << std::endl;
    return 0;
}
/* Output:
*
*  [ , , , , , , , , , ]
*  Size: 10
*
*/
 
Mọi người cho mình hỏi cái này chút:
Trong rule of five thì cái copy-and-swap trong cái move assignment này hơi dư cái std::move nhỉ
rhs nó đã là r-value ref rồi thì cần gì phải std::move để convert nó rồi dùng trong move constructor ở line 3 nữa

C++:
T& operator=(T&& rhs)
{
  T tmp(std::move(rhs));
  swap(tmp);
  return *this;
}

Edit: Mình nhớ ra rồi, r-value ref bên trong local scope thì được compiler xem là l-value nên phải convert thêm lần nữa
 
Mọi người cho mình hỏi cái này chút:
Trong rule of five thì cái copy-and-swap trong cái move assignment này hơi dư cái std::move nhỉ
rhs nó đã là r-value ref rồi thì cần gì phải std::move để convert nó rồi dùng trong move constructor ở line 3 nữa

C++:
T& operator=(T&& rhs)
{
  T tmp(std::move(rhs));
  swap(tmp);
  return *this;
}

Edit: Mình nhớ ra rồi, r-value ref bên trong local scope thì được compiler xem là l-value nên phải convert thêm lần nữa
Nếu T là template thì cái T&& nó là universal reference nha, k phải right reference.
https://isocpp.org/blog/2012/11/universal-references-in-c11-scott-meyers
Chỗ gọi move t nghĩ là nên dùng forward.
 
:angry: Mọi người ơi, không biết cái linked list này bị lỗi chỗ nào mà biên dịch thành công, runtime thành công mà bảng console lại không hiện số là sao?
C++:
#include<iostream>
template<class X>
struct Node
{
    Node<X>* next;
    X value;
    Node()
    {
        next = nullptr;
        value = 0;
    }
    Node(X val)
    {
        next = nullptr;
        value = val;
    }
    Node(X val, Node *nextnode)
    {
        next = nextnode;
        value = val;
    }
};
/*****************************************************/
template<class Y>
class LinkedList
{
private:
    Node<Y> *head;
    unsigned int size;
public:
    LinkedList()
    {
        head = nullptr;
        size = 0;
    }
    void push(Y val)
    {
        if (size == 0)
        {
            head = new Node<Y>(val);
            size++;
            return;
        }
        Node<Y> *dummy = new Node<Y>();
        dummy->next = head;
        while (head != nullptr)
        {
            head = head->next;
        }
        head = new Node<Y>(val);
        head = dummy->next;
        size++;
    }
    unsigned int length()
    {
        return size;
    }
};
int main()
{
    int n = 10;
    std::cout << "[ ";
    LinkedList<int> ListNode;
    for (int i = 1; i <= n; i++)
    {
        ListNode.push(i);
        std::cout << ", ";
    }
    std::cout << "]" << endl;
    std::cout << "Size: " << ListNode.length() << std::endl;
    return 0;
}
/* Output:
*
*  [ , , , , , , , , , ]
*  Size: 10
*
*/
sao trong hàm push kia dummy = new rồi mà ko có delete dummy
Dcnffay.png
tôi là tôi cho ở lại lớp ngay
Dcnffay.png
đúng hơn là tại sao dummy lại phải cần new
Dcnffay.png
à mà head = nullptr rồi tạo node mới thì có link gì vào trong list đâu. Sao ko xài cái ctor Node(X val, Node *nextnode) kia cho viết 1 dòng là đủ
Dcnffay.png


còn gán X value = 0 trong default ctor nữa
Dcnffay.png
thế LinkedList<std::string> là chết ngắc à
Dcnffay.png
 
Last edited:
sao trong hàm push kia dummy = new rồi mà ko có delete dummy
Dcnffay.png
tôi là tôi cho ở lại lớp ngay
Dcnffay.png
đúng hơn là tại sao dummy lại phải cần new
Dcnffay.png
à mà head = nullptr rồi tạo node mới thì có link gì vào trong list đâu. Sao ko xài cái ctor Node(X val, Node *nextnode) kia cho viết 1 dòng là đủ
Dcnffay.png


còn gán X value = 0 trong default ctor nữa
Dcnffay.png
thế LinkedList<std::string> là chết ngắc à
Dcnffay.png
Khúc new quên delete thật . Còn tại sao không dùng constructor số 3 là vì lúc đầu xài constructor éo hiểu kiểu gì mà nó báo "no constructor", lúc sau lại được
Với cả value tính là số thôi, chủ yếu là float int chứ không có string đâu mà lo bác
 
Các thím cho em hỏi C++ có thư viện nào giúp làm giao diện và tương tác với chuột như vầy ạ. Em cảm ơn ạ. :)
Screenshot 2021-11-02 155224.png
Screenshot 2021-11-02 155208.png
 
Mấy bác cho em hỏi làm sao để chạy file chương trình độc lập trên Visual Studio vậy ạ.
Cụ thể là e đang học c++ nhưng em muốn chạy mỗi file độc lập nhau (em mới chuyển từ Dev-C qua nên k biết chỗ này)
 
Mấy bác cho em hỏi làm sao để chạy file chương trình độc lập trên Visual Studio vậy ạ.
Cụ thể là e đang học c++ nhưng em muốn chạy mỗi file độc lập nhau (em mới chuyển từ Dev-C qua nên k biết chỗ này)
Ý bạn là chạy riêng biệt từng file trên windows hay là riêng biệt từng file trên chính Visual Studio?
Nếu chạy trên windows thì mở nhiều cmd mà chạy. còn trên Visual Studio thì mở nhiều tab Terminal lên chạy
 
Ý bạn là chạy riêng biệt từng file trên windows hay là riêng biệt từng file trên chính Visual Studio?
Nếu chạy trên windows thì mở nhiều cmd mà chạy. còn trên Visual Studio thì mở nhiều tab Terminal lên chạy
ý em là trong VS nếu trong 1 project có 2 file chứa hàm main thì nó k chạy được ấy, có cách nào chạy độc lập từng cái k ạ
 
Em đang học C++ cơ bản là sao em thấy người ta gõ được hàm strlwr() còn em thì không.
Trong khi em khai báo include giống y chang họ rồi.
1636255888826.png
 
Back
Top