01/10/2018, 14:46

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

viết 16:54 ngày 01/10/2018

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ào

rogp10 viết 16:55 ngày 01/10/2018

Mình xem reference thì thây chỉ hỗ trợ trong c++11

Khô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.

HelloWorld viết 16:48 ngày 01/10/2018

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

viết 16:59 ngày 01/10/2018

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

HelloWorld viết 16:57 ngày 01/10/2018

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:

vector v1;
for(int i=0;i {
VerybigType bigObj;
….
v1.push_back(bigObj);
}

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:

vector v1;
for(int i=0;i {
VerybigType bigObj;
….
v1.push_back(std::move(bigObj));
}

Ở đâ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:

::( && rhs); // C++11 move constructor
& ::operator=( && rhs); // C++11 move assignment operator

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.

HelloWorld viết 17:02 ngày 01/10/2018

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

viết 16:52 ngày 01/10/2018

hàm hiển thị của opencv cần gì mà phải có fstream ở trỏng @_@

HelloWorld viết 17:00 ngày 01/10/2018

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

Tao Không Ngu. viết 16:50 ngày 01/10/2018

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”

  1. Nếu đã thế thì bạn dùng luôn thư viện load PNG thành mảng pixel là xong.
  2. Opencv dùng QT ???

P/S Có thể dùng SFML cho phần hiển thi hoặc đơn giản là lưu ra file PPM.

HelloWorld viết 16:48 ngày 01/10/2018

Nếu đã thế thì bạn dùng luôn thư viện load PNG thành mảng pixel là xong.

Theo mình nghĩ

  • việc đọc ghi được file, tạo ra cấu trúc file phù hợp hay là khai thác cấu trúc file người khác viết kiến thức cơ bản trong lập trình, chứ đó không là đào sâu theo hướng ngôn ngữ

Opencv dùng QT ???

Xem qua thấy Qt chắc mình nhầm

github.com

opencv/opencv/blob/master/modules/highgui/include/opencv2/highgui.hpp

/*M///////////////////////////////////////////////////////////////////////////////////////
//
//  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
//
//  By downloading, copying, installing or using the software you agree to this license.
//  If you do not agree to this license, do not download, install,
//  copy or use the software.
//
//
//                          License Agreement
//                For Open Source Computer Vision Library
//
// Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
// Copyright (C) 2009, Willow Garage Inc., all rights reserved.
// Third party copyrights are property of their respective owners.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
//   * Redistribution's of source code must retain the above copyright notice,
This file has been truncated. show original
Dark.Hades viết 16:56 ngày 01/10/2018

// Không phải là OpenCV dùng Qt, mà là Qt có include OpenCV, bạn viết ngược ấy

HelloWorld viết 16:59 ngày 01/10/2018

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++

Tao Không Ngu. viết 16:47 ngày 01/10/2018

P/S Có thể dùng SFML cho phần hiển thi hoặc đơn giản là lưu ra file PPM.

Dark.Hades viết 16:52 ngày 01/10/2018

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:

//show the faces
namedWindow( "image", 1 );
imshow( "image", img );
waitKey();
HelloWorld viết 16:47 ngày 01/10/2018

Mình đang tìm thứ để thay thế k sử dụng opencv đó bạn

Bài liên quan
0