คำตอบที่ได้รับเลือกจากเจ้าของกระทู้
ความคิดเห็นที่ 3
- c++ คีย์เวิร์ด struct กับ class เหมือนกันเว้นแต่ default access ของ struct เป็น public ต่างกับ class เป็น private
https://en.cppreference.com/w/cpp/language/class
class-key - one of class or struct. The keywords are identical except for the default member access and the default base class access.
- c++ fancy pointer type : node* next
ถังชื่อ next ขนาด sizeof(size_t) สำหรับเก็บ represented address (ซึ่งจริง ๆ จะเป็นค่าจำนวนเต็มบวกอะไรก็ได้) ทว่าทุก ๆ ครั้งที่จะ access ค่าผ่าน *next ขณะนั้นโปรแกรมเมอร์จะ "ต้อง" รับประกันว่ามี object ของ node ที่ valid อยู่ตรง represented address นั้นทุกครั้งไป
- c++ reference type : T& item (หรือยกตัวอย่าง int& item)
โดยพฤตินัยคือ pointer type ซึ่งโดย syntax มันจะได้รับการ dereference อัตโนมัติเมื่อเอ่ยถึง item (โดยไม่ต้อง *item อีกที) และหา address ได้ด้วยวิธีเดิมคือ &item
- c++ parameter passing convention : Node(const int& item
เราสามารถเลือกจะผ่านค่าโดย value หรือ address ก็ได้
และถ้าผ่านค่าเป็น address ก็เลือกได้อีกว่าจะเป็น pointer type หรือ reference type
(และหลังจาก modern c++ หรือ c++11 เราจะมี move semantics สำหรับใช้กับ rvalue ในรูปของ T&& หรือ universal forwarding reference อีก เฉพาะเรื่องนี้ว่ากันยาวบานตะไท และใช้เวลาครับ)
- preprocessor : #ifndef NODE_H
"if not defined" ใช้สำหรับกำหนดลอจิกตอน compile เพื่อทำ compile time branching, compiler visibility
ปัจจุบันถ้าจะทำแค่ compile time branching เราใช้ c++17 "if constexpr" แทน #if ได้
- c++ class template : template<class T> class Node, Node<T>
ถ้าเอาง่าย ๆ มันก็เหมือน template ใน visio แหละครับ เป็นโครงที่ใส่อะไรลงไปได้
แทนที่จะเขียน
struct node
{
int data;
node* next;
};
....
node my_node{};
ก็เขียนว่า
template<typename T>
class node
{
public:
T data;
node<T>* next;
};
....
node<int> my_node{};
แล้ว compiler จะสร้าง concrete type ที่เป็น template instantiation เอง
ยังไงลองเทียบ concrete type กับ template ใน godbolt.org ดูว่าสุดท้ายแล้วเหมือนหรือต่างกันแค่ไหน
"STL" คนที่ implement standard library ของค่าย microsoft อธิบายเรื่อง template specialization
https://channel9.msdn.com/Series/C9-Lectures-Stephan-T-Lavavej-Core-C-/Stephan-T-Lavavej-Core-C-5-of-n
ภาษาที่นั่งใกล้ฮาร์ดแวร์อย่าง C++ มี learning curve สูงมาก ต่างกับภาษาอื่น
เหมือนลูกเจ้าพ่อเอาแต่ใจ คุณต้องให้เวลามาก ๆ เลยครับ
https://en.cppreference.com/w/cpp/language/class
class-key - one of class or struct. The keywords are identical except for the default member access and the default base class access.
- c++ fancy pointer type : node* next
ถังชื่อ next ขนาด sizeof(size_t) สำหรับเก็บ represented address (ซึ่งจริง ๆ จะเป็นค่าจำนวนเต็มบวกอะไรก็ได้) ทว่าทุก ๆ ครั้งที่จะ access ค่าผ่าน *next ขณะนั้นโปรแกรมเมอร์จะ "ต้อง" รับประกันว่ามี object ของ node ที่ valid อยู่ตรง represented address นั้นทุกครั้งไป
- c++ reference type : T& item (หรือยกตัวอย่าง int& item)
โดยพฤตินัยคือ pointer type ซึ่งโดย syntax มันจะได้รับการ dereference อัตโนมัติเมื่อเอ่ยถึง item (โดยไม่ต้อง *item อีกที) และหา address ได้ด้วยวิธีเดิมคือ &item
- c++ parameter passing convention : Node(const int& item
เราสามารถเลือกจะผ่านค่าโดย value หรือ address ก็ได้
และถ้าผ่านค่าเป็น address ก็เลือกได้อีกว่าจะเป็น pointer type หรือ reference type
(และหลังจาก modern c++ หรือ c++11 เราจะมี move semantics สำหรับใช้กับ rvalue ในรูปของ T&& หรือ
- preprocessor : #ifndef NODE_H
"if not defined" ใช้สำหรับกำหนดลอจิกตอน compile เพื่อทำ compile time branching, compiler visibility
ปัจจุบันถ้าจะทำแค่ compile time branching เราใช้ c++17 "if constexpr" แทน #if ได้
- c++ class template : template<class T> class Node, Node<T>
ถ้าเอาง่าย ๆ มันก็เหมือน template ใน visio แหละครับ เป็นโครงที่ใส่อะไรลงไปได้
แทนที่จะเขียน
struct node
{
int data;
node* next;
};
....
node my_node{};
ก็เขียนว่า
template<typename T>
class node
{
public:
T data;
node<T>* next;
};
....
node<int> my_node{};
แล้ว compiler จะสร้าง concrete type ที่เป็น template instantiation เอง
ยังไงลองเทียบ concrete type กับ template ใน godbolt.org ดูว่าสุดท้ายแล้วเหมือนหรือต่างกันแค่ไหน
"STL" คนที่ implement standard library ของค่าย microsoft อธิบายเรื่อง template specialization
https://channel9.msdn.com/Series/C9-Lectures-Stephan-T-Lavavej-Core-C-/Stephan-T-Lavavej-Core-C-5-of-n
ภาษาที่นั่งใกล้ฮาร์ดแวร์อย่าง C++ มี learning curve สูงมาก ต่างกับภาษาอื่น
เหมือนลูกเจ้าพ่อเอาแต่ใจ คุณต้องให้เวลามาก ๆ เลยครับ
แสดงความคิดเห็น
ใครสร้าง linked list c++ เป็นบ้างครับช่วยด้วยย
// Node.h
// Author: Ali Selcuk AKYUZ
// Mail: selcuk@retinarobotics.com || e174043@metu.edu.tr
// Electrical and Electronics Engineering Department
// Middle East Technical University - ANKARA
// If any questions please send me an email
#ifndef NODE_H
#define NODE_H
#include <iostream>
using namespace std;
template<class T>
class Node
{
public:
Node();
Node(const T& item, Node<T>* ptrnext = NULL);
T data;
// access to the next node
Node<T>* NextNode();
// list modification methods
void InsertAfter(Node<T>* p);
Node<T>* DeleteAfter();
Node<T> * GetNode(const T& item, Node<T>* nextptr = NULL);
private:
Node<T> * next;
};
#endif // NODE_H
• ที่ผมไม่เข้าใจเลยคือตรงส่วนของ construct ที่มี argument Node(const T& item, Node<T>* ptrnext = NULL);
• const ที่ผมไปหาในเน็ตคือค่าคงที่ แต่ T& item คือไรหรอครับ ที่ผมไปหามาในเน็ตคือ
int number =10;
int *ptrNumber = &number ;
* คือที่เก็บ address & คือที่แสดงค่า address
แต่ที่ผมสงสัยคือ T& คืออะไร ปกติ &มันต้องอยู่ข้างหน้า T ไม่ใช่หรอ Node<T>* ptrnext คืออะไร เพราะปกติ * มันต้อง *ptrNumber แบบนี้ไม่ใช่ หรอ ทำไมมันเป็น Node<T>*
• T data; คืออะไร T มันไม่ใช่ variable ไม่ใช้หรอ
• #ifndef NODE_H
#define NODE_H คืออะไร
• template<class T> คืออะไร ผมจึงมืด 8 ด้าน
• ในเมื่อผมไม่เข้าใจ ผมจึงไปหาข้อมูลวิธีสร้าง linked list ในเน็ตมา ส่วนใหญ่เป็นแบบนี้
struct node
{
int data;
node* next;
};
แล้วได้ พบกับ struct ซึ่งครูยังไม่ได้สอน ที่ผมไปหา struct เหมือน class ใน c++ ใช่ไหมครับ ไปอ่านในเน็ตมาก็ยังไม่ค่อยเข้าใจอยู่ดี แล้วผม งง คำสั่ง ของมันอีกแล้วตรง node* คืออะไร นี้คือที่ผม สงสัยมาคราวๆครับ ผู้รู้ช่วยบอกทีเพราะผมหาข้อมูลมา 2 วันแล้วรู้สึกสงสัยมาก ขอบคุณครับ
ปล.สอนเป็นภาษา Eng และนี้เรียนครั้งที่ 2 ครั้งแรกครูเค้าติดประชุม (หัวหน้าภาค) ครั้งที่ 2 lab มาสอนอย่างงี้เลย