Lỗi gán 1 obj fstream bằng 1 obj fstream khác (C++11)
Hello
Mình đang nạp chồng toán tử với hàm khởi tạo sao chép cho lớp có chứa pointer thì gặp lỗi như sau (biến fileIoStream có kiểu fstream mình dùng để đọc và ghi cùng 1 cái)
Mình xem reference thì thây chỉ hỗ trợ trong c++11
http://www.cplusplus.com/reference/fstream/fstream/operator=/
Trước giờ mình chỉ học ngôn ngữ xem là như là công cụ để giải quyết công việc cần làm. Không đi sâu vào ngôn ngữ lắm, chỉ khi nào cần như trường hợp này thì mình tìm tòi thêm
Làm thế nào để biết mình đang sử dụng trình biên dịch có hỗ trợ c++11 không nhỉ
Mình dùng mingw qua msys2, compiler bằng g++ *.cpp
Thây có cái đường dẫn như sau ở terminal
C:msys64mingw64includec++7.3.0...
Thank you
fstream ko gán f1 = f2 được, nó ghi rành rành ra kìa: operator= … = delete; Tại sao 2 file png lại nhất thiết phải đọc cùng 1 file stream?? Mở file stream khác ko được à?
mà tại sao object Png lại có chứa file stream ở trỏng???
tham khảo thêm thư viện
lodepng
(lodepng.h) để xem người ta viết thư viện đọc ghi png như thế nàoKhông nên tưởng bở, câu gán đó là move-assignment && chứ không phải copy-assignment, nên không thể tạo ra 2 copy được.
em đã viết xong phần đọc và giải mã ảnh png rồi anh, còn phần hiển thị em không biết dùng gì hiển thị, nên em dùng tạm opencv để show ảnh, :3 vì em code chay từ đầu, hiển thị ảnh thì thấy opencv dùng qt
giờ em đang tập hợp các phần riêng lẻ lại thành 1 thư viện con con thôi
thư viện em tách các định dạng được hỗ trợ thành 1 module gọi là codec, em cũng tính để stream file ở phần xử lý, chắc giờ cho cái đó ra ngoài
hiển thị thì lưu ra file rồi open file đó lên mà coi @_@ hoặc output ra 1 cái object nào đó, rồi các thư viện hiển thị khác sẽ xài cái object đó mà đọc file png.
vô cái lodepng.h coi api của người ta như thế nào, encode/decode ra/từ file, encode/decode ra/từ memory
theo keyword của bác thì em tìm ra cái này
C++11
Rvalue reference và move constructor, move assignment
Khái niệm lvalue và rvalue không có gì xa lại đối với các lập trình viên C++, thường trong một câu lệnh gán:
<đối tượng> = ;
Thì <đối tượng> được gọi là lvalue (left value) còn được gọi là rvalue (right value) của biểu thức. Một cách logic thì đối tượng lvalue sẽ có giá trị thay đổi, còn đối tượng rvalue sẽ không thay đổi giá trị. Xét chi tiết hơn trong lệnh gán trên, trình biên dịch sẽ thực hiện tính giá trị biểu thức nằm bên trái của phép gán, sau đó gán giá trị tính được vào địa chỉ của giá trị lvalue bên phải của phép gán. Như vậy về bản chất phép gán trên có kết quả lưu vào tham chiếu (qua tên) tới một đối tượng. Tổng quát hơn, bất cứ một biểu thức nào (như lệnh gán, lời gọi hàm …) cần lưu kết quả vào một tham chiếu, nó sẽ là một lvalue. Ngược lại bất cứ biểu thức nào trả về giá trị dưới dạng một đối tượng thì đó chính là một rvalue. Vấn đề của các rvalue là chúng có thời gian tồn tại rất ngắn trong chương trình, do chỉ dùng cho các biến tạm, trung gian nên cần phải gán chúng cho các lvalue để có thể dùng lại sau này.
Khái niệm rvalue reference ra đời giúp kéo dài tuổi thọ của các đối tượng rvalue và hơn thế nữa, nó giúp cho việc lập trình hiệu quả hơn rất nhiều. Chúng ta hãy xem ví dụ đơn giản sau:
Khi đoạn mã lệnh trên được thực hiện, mỗi lần lặp môt bản sao của bigObj sẽ được tạo ra, và sau đó được dùng để tạo ra đối tượng v1[i] qua hàm copy constructor. Tiếp đến đối tượng bản sao cũng sẽ bị hủy. Có thể thấy rằng việc truyền đối tượng bigObj như vậy sẽ là một thao tác tốn thời gian (cấp phát bộ nhớ, copy dữ liệu) vì kích thước của nó có thể rất lớn. Rvalue reference giúp chúng ta giải quyết vấn đề này như sau:
Ở đây, C++11 thực hiện một kỹ thuật gọi là move semantics để tối ưu code chương trình với các đối tượng rvalue reference dựa trên nguyên lý làm giảm số thao tác cấp phát (allocate) và copy dữ liệu của các đối tượng có kích thước lớn. Trong ví dụ trên khi thực hiện câu lệnh v1.push_back(std::move(bigObj)), thay vì tạo ra một bản sao của bigObj và thực hiện hàm copy constructor của lớp VerybigType, trình biên dịch sẽ thực hiện chuyển (move, không phải copy) toàn bộ nội dung của bigObj cho đối tượng v1[i], với std::move(bigObj) là một rvalue reference, điều này giúp tránh được việc loại bỏ đối tượng bigObj khỏi bộ nhớ, cũng như việc thực hiện copy dữ liệu (qua phép việc gọi hàm copy constructor) từ bigObj sang v1[i]. Rõ ràng là một công đôi việc.
Để thực hiện kỹ thuật move semantics, các lớp cần cài đặt hai hàm: move constructor và move assignment operator với prototype như sau:
Trong đó “&&” là cú pháp khai báo một rvalue reference. Dù có sự khác nhau về cách thức thực hiện và ý nghĩa, nhưng hai hàm này đều có điểm chung là tham số đầu vào là một rvalue reference và đối tượng được tham chiếu đến sẽ bị loại bỏ sau khi dữ liệu của nó được chuyển (move) cho đối tượng nhận giá trị trả về của hàm. Hầu hết các lớp chứa của thư viện STL C++11 (trừ lớp std::array) đều cài đặt hai hàm trên.
em muốn hiển thị để xem kết quả trực quan với các tham số ấy mà :3 em dùng tạm opencv để đẩy mat vào hiển thị :3 hơi khoai
hàm hiển thị của opencv cần gì mà phải có fstream ở trỏng @_@
em chỉ hiển thị thôi, đọc ảnh em tự code @@
class này chỉ là codec lưu thông tin ảnh, còn data em để class matrix
Hi HelloWorld.
“Trước giờ mình chỉ học ngôn ngữ xem là như là công cụ để giải quyết công việc cần làm. Không đi sâu vào ngôn ngữ lắm, chỉ khi nào cần như trường hợp này thì mình tìm tòi thêm”
P/S Có thể dùng SFML cho phần hiển thi hoặc đơn giản là lưu ra file PPM.
Theo mình nghĩ
Xem qua thấy Qt chắc mình nhầm
opencv/opencv/blob/master/modules/highgui/include/opencv2/highgui.hpp
This file has been truncated. show original// Không phải là OpenCV dùng Qt, mà là Qt có include OpenCV, bạn viết ngược ấy
mình muốn viết hàm hiển thị ảnh giống như opencv, kiểu có 1 cửa sổ rồi hiển thị ảnh với tên ảnh thôi, thì dùng cái gì nhỉ, mình dùng c/c++
P/S Có thể dùng SFML cho phần hiển thi hoặc đơn giản là lưu ra file PPM.
Open CV nó hỗ trợ bạn luôn khoản hiển thị ảnh nhé.
Một lib to như opencv sao phải lo cần xài lib bên thứ 3 nữa.
https://docs.opencv.org/master/examples.html
Nó gồm các hàm chính:
Mình đang tìm thứ để thay thế k sử dụng opencv đó bạn