Trong C++ có hỗ trợ chia một định nghĩa class đặt trong nhiều file .h không các anh em.
Giống partial trong C#.
Mình đang quản lý một Class cả trăm method (file h dài gần 300 line) cảm thấy ngu người @@.
Trong C++ có hỗ trợ chia một định nghĩa class đặt trong nhiều file .h không các anh em.
Giống partial trong C#.
Mình đang quản lý một Class cả trăm method (file h dài gần 300 line) cảm thấy ngu người @@.
ko có, xài đỡ kế thừa/đa kế thừa :V Đừng xài hàm ảo thì cũng lẹ lắm :V
Nếu về kế thừa thì nó cũng sẽ chạy được nhưng mà không đúng logic.
Cụ thể mình có 1 base class là một window.
Bây giờ muốn chia code thành từng khu vực như
Menu, Content, Status, ContextMenu.
Nếu kế thừa nó phải theo kiểu như thế này:
MyWindow < Menu < Content < Status < ContextMenu<…<BaseClass.
Có thể thấy là Menu và Content không liên quan gì nhau nhưng Menu lại phải kế thừa Content.
hay xài macro define đi, rồi trong file chính gọi
ABC_MENU()
ABC_CONTENT()
ABC_STATUS()
ABC_CONTEXTMENU()
v.v… nhưng làm vậy mấy file phụ chứa macro chắc ko có syntax highlighting :V
À tôi vừa lang thang trên internet thấy có cái tiểu xảo vui lắm. Cũng dựa vào kiểu giống macro nhưng là include.
Khai báo hàm trong file .h rồi include bên trong class
Nhưng không phải lúc nào cũng được.
Hi Văn Dương.
Menu, Content, Status, ContextMenu. Thế thì bạn dùng kết tập contron như trong C#. Một lớp cho menu, sau đó kết tập vào v.v.v…
Nó cũng vốn đã chia các lớp như vậy.
Nhưng vấn đề nằm ở chỗ số lượng widget (C# gọi là control) tương đối lớn và số lượng các hàm xử lý sự kiện cũng rất nhiều (khoảng 150 method).
Nếu không chia file hoặc có chức năng như #region bên C# sẽ tương đối nhức não khi quản lý.
Hiện tại chỉ để khai báo 1 class MainWindow đã 350 dòng.
thử
#pragma region
được ko? Chắc code trên Qt Creator hả :V
Kết quả là không được @@.
Nó không Fold/UnFold được thì không ý nghĩa gì cả @@.
#define FOLDINGSTART {
...
#define FOLDINGEND }
vậy chắc được :V Ko thì bọc quanh cái
#ifndef REGION_ABC
...
#endif
chắc cũng có thể được =]
Hi Văn DươngDuong_Act.
Bạn có thể dùng macro.
File: Foo_sub.hpp
int add(int);
File: Foo.hpp
#ifndef __FOO_HPP__
#define __FOO_HPP__
class Foo {
public:
Foo(int = 0);
int getValue();
void setValue(int = 0);
#include "Foo_sub.hpp" // Nội dung file Foo_sub.hpp sẽ được trèn vào đây
private:
int value;
};
#endif
File: Foo.cpp
#include "Foo.hpp"
Foo::Foo(int value) {
this->value = value;
}
int Foo::getValue() {
return this->value;
}
void Foo::setValue(int value) {
this->value = value;
}
int Foo::add(int value) {
return this->value + value;
}
File: main.cpp
#include <iostream>
#include "Foo.hpp"
using namespace std;
int main(int argc, char **argv) {
Foo foo(100);
cout << "Value " << foo.getValue() << endl;
foo.setValue();
cout << "Value " << foo.getValue() << endl;
foo.setValue(100);
cout << "Value " << foo.getValue() << endl;
cout << "Add " << foo.add(100) << endl;
return 0;
}
Chỉ thị #include
sẽ copy nội dung file vào vị trí đó.
P/S Tuy nhiên tốt nhất nên tìm cách kết tập code.
Các này mình đã test ở #5
Nó đơn giản nhưng chỉ chạy với private, public… tiêu chuẩn.
Còn đội private slots, public signals của cụ QT thì chào thua
Hi Văn DươngDuong_Act.
Bạn có thể xem thêm ở đây để vận dụng cho phù hợp.
https://woboq.com/blog/how-qt-signals-slots-work.html
P/S Bạn có thể cho ảnh chụp cai fonrt không ? Mình không tin là không chia nhỏ ra được.
Cả tiền xử lý cũng không được chắc bỏ cuộc thôi anh em ơi.
Tù quá đi.
Nếu nói đến signal / slots, mình chỉ cần kết nối signal của objectA vào slot của ObectB là sẽ giải quyết được vấn đề. Mà hiện tại nó báo không tìm thấy slot.