Lỗi “Cout không rõ ràng” trong C++

Loi Cout Khong Ro Rang Trong C



Bài viết này quan tâm đến các lỗi không rõ ràng trong cout trong ngôn ngữ lập trình C++. Tình huống mơ hồ xuất hiện khi trình biên dịch không thể xác định các phương thức hoặc toán tử sẽ được sử dụng cho các tác vụ khác nhau. Đôi khi, chúng ta sử dụng cùng một hàm tham số với cùng một không gian tên và sau đó cout được xác định trong cả hai trường hợp. Khi chúng ta thực thi chương trình, trình biên dịch sẽ tạo ra lỗi không rõ ràng cout do trình biên dịch không hiểu ý nghĩa của mã này. Sự không rõ ràng của cout phát sinh khi có xung đột giữa các không gian tên được xác định hoặc nhiều khai báo hàm bên trong chương trình.

Ví dụ 1:

Đây là một ví dụ về lỗi mơ hồ cout thường xảy ra trong lập trình C++. Ở đây, chúng ta sẽ thấy cách trình biên dịch tạo ra các lỗi không rõ ràng trên cout khi chúng ta sử dụng nhiều không gian tên. Đoạn mã của ví dụ này được đề cập như sau:







#include

không gian tên máy tính xách tay {

trống rỗng trưng bày ( ) {

tiêu chuẩn :: cout << 'đây là không gian tên máy tính xách tay' << tiêu chuẩn :: kết thúc ;

}

}

không gian tên di động {

trống rỗng trưng bày ( ) {


tiêu chuẩn :: cout << 'đây là Không gian tên di động' << tiêu chuẩn :: kết thúc ;

}

}

int chủ yếu ( ) {

sử dụng không gian tên máy tính xách tay ;
sử dụng không gian tên di động ;

trưng bày ( ) ;

trở lại 0 ;


}

Ở đây, chúng tôi lấy một chương trình có hai không gian tên được xác định theo nhu cầu của chúng tôi. Chúng tôi muốn hiển thị các chuỗi trên màn hình. Đầu ra của mã này được đính kèm như sau:





Khi thực thi mã, lỗi được tạo ra về tình huống không rõ ràng trong cout. Lỗi được tạo ra do khi trình biên dịch đọc mã, trình biên dịch không nhận được đầu vào rõ ràng từ phía người dùng. Chúng tôi đã sử dụng nhiều khai báo vùng tên trong mã của mình. Trong toàn bộ mã, chúng tôi chỉ sử dụng phương pháp “hiển thị” để hiển thị kết quả đầu ra trên màn hình. Trình biên dịch không biết phương thức hiển thị nào có liên quan đến không gian tên nào. Chúng ta cần làm cho code đơn giản và rõ ràng để trình biên dịch dễ dàng hiểu được các bước mà không làm cho code trở nên mơ hồ.





Giải pháp cho lỗi này là gọi phương thức có namespace liên quan trong hàm main để trình biên dịch hiểu rõ hơn. Chúng tôi chỉ định rõ ràng phương thức không gian tên nào chúng tôi muốn gọi trong phần thực thi chính của mình.

#include

không gian tên máy tính xách tay {

trống rỗng trưng bày ( ) {


tiêu chuẩn :: cout << 'đây là không gian tên máy tính xách tay' << tiêu chuẩn :: kết thúc ;

}

}

không gian tên di động {

trống rỗng trưng bày ( ) {

tiêu chuẩn :: cout << 'đây là Không gian tên di động' << tiêu chuẩn :: kết thúc ;

}

}

int chủ yếu ( ) {

sử dụng không gian tên máy tính xách tay ;
sử dụng không gian tên di động ;
máy tính xách tay :: trưng bày ( ) ;
trở lại 0 ;


}

Ở đây, chúng ta chỉ có thể liên kết phương thức display() với namespace “laptop” trong hàm main như trong ảnh chụp màn hình trước đó. Bây giờ, hãy chạy chương trình. Đầu ra được hiển thị trên cửa sổ giao diện điều khiển.



Ví dụ 2:

Tình huống này có liên quan đến lỗi mơ hồ cout trong C++. Trình biên dịch hiển thị lỗi khi nó không hiểu luồng thực thi. Đoạn mã của ví dụ này được đính kèm sau đây:

#include

không gian tên Ngôn ngữ C {

trống rỗng in ( int Tôi ) {

tiêu chuẩn :: cout << 'Không gian tên của ngôn ngữ C:' << Tôi << tiêu chuẩn :: kết thúc ;

}

}

không gian tên java {

trống rỗng in ( int j ) {

tiêu chuẩn :: cout << 'Không gian tên của ngôn ngữ java:' << j << tiêu chuẩn :: kết thúc ;

}

}

sử dụng không gian tên Ngôn ngữ C ;

sử dụng không gian tên java ;

int chủ yếu ( ) {

in ( 5 ) ;
trở lại 0 ;


}

Trong mã này, chúng tôi xác định tất cả các tiêu đề thư viện cần thiết. Chúng tôi tạo hai không gian tên cho các mục đích khác nhau. Trong không gian tên “Clingu”, chúng tôi xác định phương thức “print” lấy giá trị số nguyên từ người dùng. Trong chức năng “in”, chúng tôi muốn hiển thị giá trị mà người dùng đã chuyển trên màn hình bảng điều khiển. Chúng tôi hiển thị kết quả đầu ra được yêu cầu bằng cách sử dụng luồng “cout” trong mã của chúng tôi. Sau đó, chúng ta định nghĩa một namespace khác có tên là “Java”.

Trong không gian tên “Java” này, chúng tôi sử dụng lại phương thức “print” để hiển thị giá trị mà người dùng chuyển bằng “cout”. Chúng tôi gọi cả hai không gian tên để sử dụng trong hàm main của mình nhằm nhận được kết quả mong muốn trên cửa sổ bảng điều khiển trong C++. Trong hàm “main”, chúng ta gọi hàm nạp chồng “print()” để hiển thị giá trị được truyền trên màn hình bảng điều khiển.

Nhấp vào tùy chọn “thực thi” từ menu chính và chọn tùy chọn “biên dịch và chạy”. Lỗi về sự mơ hồ xảy ra khi thực thi mã này. Ảnh chụp màn hình lỗi được đính kèm như sau:

Lỗi này cho thấy trình biên dịch nhầm lẫn về hàm print() bị quá tải được gọi. Lỗi này nằm ở dòng 19,  “in (5)”. Trình biên dịch nhầm lẫn về không gian tên mà hàm quá tải này thuộc về. Những người mới bắt đầu luôn mắc phải những loại lỗi này hầu hết thời gian.

Hãy giải quyết lỗi này trên thực tế không phức tạp. Các lỗi mơ hồ có thể được giải quyết dễ dàng. Chúng ta phải chỉ định không gian tên dọc theo hàm quá tải trong hàm “chính” để có thể nhìn thấy và hiểu được trình biên dịch. Như trong chương trình này, chúng tôi thêm “java::print(5)” này vào mã hiện có của chúng tôi như được đề cập trong phần sau:

#include

không gian tên Ngôn ngữ C {

trống rỗng in ( int Tôi ) {

tiêu chuẩn :: cout << 'Không gian tên của ngôn ngữ C:' << Tôi << tiêu chuẩn :: kết thúc ;

}

}

không gian tên java {

trống rỗng in ( int j ) {

tiêu chuẩn :: cout << 'Không gian tên của ngôn ngữ java:' << j << tiêu chuẩn :: kết thúc ;

}

}

sử dụng không gian tên Ngôn ngữ C ;

sử dụng không gian tên java ;

int chủ yếu ( ) {

java :: in ( 5 ) ;
trở lại 0 ;


}

Bây giờ, chương trình được thực thi hoàn hảo mà không có bất kỳ lỗi mơ hồ cout nào và hiển thị kết quả đầu ra trên màn hình bảng điều khiển. Đầu ra của chương trình này được đính kèm như sau:

Ví dụ 3:

Đây là ví dụ cuối cùng và cũng là ví dụ cuối cùng liên quan đến lỗi được tạo ra do một vấn đề không rõ ràng. Trình biên dịch không thể có được kết quả chính xác. Đoạn mã của ví dụ này được đính kèm ở phần sau để người dùng hiểu rõ hơn:

Ở đây, chúng tôi xác định các thư viện cần thiết. Sau đó, chúng ta xác định một không gian tên chứa lớp mà chúng ta muốn hiển thị chuỗi trên cửa sổ bảng điều khiển. Chúng tôi gọi không gian tên được xác định này trong hàm “main” bằng biến “c”. Sau đó, chúng ta gọi phương thức print() bằng cách sử dụng đối tượng không gian tên. Chúng tôi hiển thị lại chuỗi trên màn hình bảng điều khiển sau lệnh gọi phương thức. Đầu ra phải là cả hai chuỗi và được hiển thị trên màn hình bảng điều khiển. Khi chúng tôi thực thi mã này, lỗi xảy ra như sau:

#include

sử dụng không gian tên tiêu chuẩn ;

không gian tên không gian tên của tôi {

lớp học cout {
công cộng :
trống rỗng in ( ) {


cout << 'Cout tùy chỉnh' << tiêu chuẩn :: kết thúc ;

}

} ;

}

int chủ yếu ( ) {

không gian tên của tôi :: cout c ;
c. in ( ) ;


cout << 'Chào thế giới!' << tiêu chuẩn :: kết thúc ;

trở lại 0 ;

}

Trình biên dịch không chọn câu lệnh cout để hiển thị dữ liệu trên màn hình bảng điều khiển. Trình biên dịch không thể hiểu được vùng tên thuộc câu lệnh cout và tạo ra lỗi. Giải pháp cho lỗi này là thêm một đối tượng không gian tên với câu lệnh cout để trình biên dịch dễ đọc và hiểu. Thêm “std::” dọc theo câu lệnh cout và chạy mã. Đầu ra sau đây được hiển thị trên màn hình bảng điều khiển:

Phần kết luận

Ở đây, có thể nói rằng việc hiển thị đầu ra trên màn hình console cũng tạo ra một lỗi không phải lỗi cú pháp cũng không phải lỗi logic. Trong hầu hết trường hợp, người dùng viết mã rất tốt nhưng trình biên dịch lại không thể hiểu được. Trình biên dịch không rõ ràng về đầu vào. Vì vậy, hãy làm rõ từng bước mã bằng cách đặt tên và cú pháp thích hợp để tránh lỗi trong ngôn ngữ lập trình C++. Các bước liên quan đến việc giải quyết vấn đề này là sử dụng các vòng loại rõ ràng, ngăn ngừa xung đột vùng tên và đảm bảo rằng các hàm hoặc đối tượng dự định đã xác định các bước liên quan đến việc giải quyết vấn đề này.