Lỗi khi dùng hàm static (ở class khác) là hàm bạn trong class template?

mình có 1 template class a
trong template mình cần khái báo 1 hàm bạn
là 1 hàm static ở class b
cú pháp khái báo như sau , nhưng bị lỗi do đâu nhỉ
xin cam on

file template

#ifndef _DOUBLE_LINKED_LIST_H_
#define _DOUBLE_LINKED_LIST_H_

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

template <typename T>
struct node{
	T data;
	node *next, *previous;
};

template <typename T>
struct linked{
	node <T> *head, *tail;
};

template <class T>
class dll{
private:
	linked <T> list;
public:
	friend static void read_write_data::create_report(const dll<T> &);  // ham ban
};

#include "double_linked_list.tpp"

#endif

file class khác chưa hàm bạn

#ifndef _READ_DATA_H_
#define _READ_DATA_H_

#include "classroom.h"
#include "course.h"
#include "student.h"
#include "score.h"
#include <fstream>
class read_write_data{
public:

	static void create_report(const dll<classroom> &);
};

#endif

help help :slight_smile: :slight_smile:

Hi Nấm Lùnhell6w9rld.
Mình thấy bạn hỏi khá nhiều về template. Và có vẻ như bạn chưa có một thiết kế lớp chuẩn xác.
Mình thấy dll là mộ loại kho chứa (mảng vector v.v.v.) thì bản thân nó có các hàm của một kh chưa.
thêm xóa tìm kiển xắp xếp. Đừng cố nhét thêm các hàm không phải bản chất của nó vào. Nó chỉ làm code phức tập và khó hiểu hơn thôi.
Bạn có thể nêu yêu cầu để và thiết kế lớp của mình để mọi người cùng trao dổi.
Chúc bạn thành công.

1 Like

các hàm kia có cả rồi mà , mình k đưa lên thì k phải chỗ mình cần hỏi,đưa lên nó rối
thật ra mình ( em) đang học c++, giờ đang làm bt lớn cuối kì c++
trong chương trình học k có học về template
nhưng bt lớn mà có thêm các kiến thức chưa học thì sẽ tốt hơn (thầy cố khuyến khích )

chương trình mình làm khá đơn giản
các lớp lưu trữ bằng double linked list
lúc đầu mình đã định làm mỗi class sẽ có 1 linked list riêng
nhưng sau đọc thấy template trong c++ (lúc đọc là chưa biết gì) + khuyến khích của các thầy cô là nếu có kiến thức ngoài chương trình học sẽ cao điêm hơn ~.~ nên mình mới làm
xem qua qua thì cũng thấy các lớp mình làm có chung vài hàm ( phần lớn)
thế là mình thử với template
nhưng khi đọc về template chưa thấy có gì hay, lý thuyết trong giáo trình, tài liệu chỉ viết các dùng, mấy cái cơ bản, đến khi thử làm, làm gần xong, thì mới nhận ra nhiều cái k tiện, đúng là chương trình của mình rắc rối hơn, nhưng giờ thì k kịp làm lại, vì chương trình mình khá dài, tâm 1500 dòng, mà còn bt lớn các môn khác, cũng như gần phải nạp, nên mình phóng lao thì phải theo lao thôi~
giờ nhìn lại mới thấy phần thiết kế k tính kĩ, nên giờ chương trình có những cái không hợp lý lắm, nói chung là rối, 1 phần cũng có thời gian gấp quá, nên k giành được nhiều thời gian tính toán cho môn này :stuck_out_tongue:
xin cam on da gop y

Hi Nấm Lùnhell6w9rld.
Anh Đạt có giới thiệu 1 bài về các lớp thư viện lưu trữ rồi. Bạn có thể tìm lại rồi thay toàn bộ phần dll của bạn bằng lớp cung cấp sãn.
Bạn chưa nói yêu cầu bài toán @_@!

1 Like

cứ viết đại 1 hàm là Node<T>* begin() { return head; } vậy là xong. Mấy cái hàm create_report hay gì gì thì có lẽ sẽ cần 1 vòng for, viết là

for (auto p = list.begin(); p; p = p->next)
{
    //xử lý p->data v.v...
} 

nếu muốn đi ngược thì trong linked list class viết 1 method trả về tail: Node<T>* rbegin() { return tail; } và vòng for ngược:

for (auto p = list.rbegin(); p; p = p->prev)
{
    //xử lý p->data v.v...
} 

nói chung đúng là phải thiết kế class cho hợp lý trước rồi mới lao vô code, chứ vừa code vừa thiết kế lại thì tiêu :joy:

1 Like

trong c++ có hết ,nhưng mình k dùng cái có sẵn, mà mình tự định nghĩ lại cả, vì bt lớn cuối môn , ng ta chấm kiến thức chứ k chấm sản phẩm mấy , dùng cái có sẵn sẽ thấp điểm :stuck_out_tongue:

chuẩn. đúng là mình vừa viết vừa thiết kế, do học xong, c++, trong chương trình học k có template, mà mình thấy rồi đọc tài liệu rồi làm luôn
mà tài liệu thì nó viết mấy cái cơ bản, cách dùng, mới đọc k thấm hết được, làm rồi mới biết có nhiều cái k tiện, chương trình rối hơn, cũng vì thời gian gấp, còn nhiều bt lớn môn khác , nên k đầu tư ngồi thiết kế chương trình lâu được, hôm nào báo cáo môn học xong mình uplên github , coi cùng, nhưng cấu trúc của chương trình thiết kế dở, vì mình cả làm cả thiết kế, giờ làm lại k kịp, nên phóng lao phải theo lao :stuck_out_tongue:

bật trang web nào có sẽ interface của <list> lên mà xem nó có những gì, rồi bắt chước theo. Chứ bỏ thêm mấy hàm lạ vô, ví dụ hàm bạn của từng kiểu thì nó rối tung hết lên, vì template Dll có thể dùng cho hàng trăm hàng triệu / bất kì kiểu nào, đừng bỏ cái hàm nào liên quan tới SinhVien hay MonHoc vào trong Dll.

1 Like

biết là vậy, nhưng giờ lỡ làm rồi,còn môn khác nên mình k sửa nữa
với lại những gì mình viết trong template chỉ để giải quyết bài toán cụ thể của bt lớn
:stuck_out_tongue:

Hi Nấm Lùnhell6w9rld.
Quan điểm dùng cái có sẵn của bạn mình không tán thành. Không phải tự nhiên bạn biết có các lớp hỗ trợ sẵn, Và không phải tự nhiên mà bạn biết cách lự chon lớp thư viên phù hợp với yêu cầu.
Còn nếu bạn code kiểu hàm thêm vào như vậy thì bỏ luôn template đi. Code tối ưu theo một mục tiêu thôi cần hàm gì thi thêm hàm đó đúng kiểu dữ liệu.
Lợi ích code nhỏ gọn, tập trung vào mục tiêu chính chánh xa đà vào việc code thư viện v.v.v… chạy nhanh hiệu quả.
Nhược điểm là gần như bạn không thể tận dụng lại code. Nhưng có vấn đề gì đâu khi bạn khồn dùng lại nó.
Mình từng gặp code kiểu này rồi. Khi đọc dữ liệu từ flash của vi điều khiển thì dựng 1 cái linklist đơn giản chỉ có mỗi


typedef struct Node {
char *data;
Node *next;
} Node;

1 Like

vì mình cũng k muốn sử dụng những thư viện có sẵn lắm, mình mới học cở bản, nên mình học xây dựng chương trình từ cái nhỏ nhất, không hướng đến việc tạo ra sản phẩm, và quan trọng nhất là giờ đã lỡ rồi, các cụ có câu phóng lao thì phải theo lao :smile: giờ còn các môn khác nữa :sunny: mình đang bị lỗi chỗ đọc ghi file nhị phân với cái class trong template , class bt k sao, class trong template lại bị lỗi,
help me if you are free

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?