2013-05-23 46 views
5
blog blog::operator+(const blog * b) 
{ 
    next = b; //blog * next; it's a next pointer in a doubly linked list. 
    return * this; 
} 

Tôi đã tự hỏi liệu có cách nào tôi có thể gán b cho con trỏ tiếp theo của nút hiện tại hay không. Có cách nào khác mà tôi có thể làm được không? Hiện tại tôi đang nhận đượcChuyển đổi không hợp lệ? Chỉ định con trỏ const cho con trỏ

invalid conversion from ‘const blog*’ to ‘blog*’ [-fpermissive] 

Xem xét ghi chú của tôi, có vẻ như tôi nên sử dụng hằng số khi thực hiện quá tải toán tử, nhưng hiện tại nó không thực sự biên dịch. Làm cách nào tôi có thể truyền blog const * b vào con trỏ tiếp theo? Cảm ơn!

+0

Tại sao bạn muốn? Bạn không thể sửa đổi các hằng số mà không cần gọi hành vi không xác định. Đúc và quên không phải là một giải pháp. – chris

+1

Bạn không được phép, trừ khi triệu hồi Satan và 'const_cast' của mình. Nếu con trỏ này đã được đánh dấu là 'const' trong ngữ cảnh đó, nó có nghĩa là nó sẽ không cho phép bất kỳ cách nào để sửa đổi nó. – Nbr44

+4

Tại sao bạn sử dụng toán tử '+' để _assign_ một giá trị cho đối tượng của bạn? –

Trả lời

7

Từ câu hỏi và nhận xét của bạn Tôi hiểu bạn đang nhầm lẫn về ý nghĩa của const blog *.

Bạn phải đọc các loại con trỏ ngược.

  • blog * là con trỏ tới blog - bạn có thể thay đổi giá trị con trỏ, bạn có thể thay đổi đối tượng được trỏ bằng con trỏ.
  • blog const * (và const blog *) là một con trỏ tới blog const - bạn có thể thay đổi giá trị con trỏ, nhưng bạn không thể thay đổi đối tượng bằng con trỏ này.
  • blog * const con trỏ const vào blog - bạn không thể thay đổi giá trị con trỏ, nhưng bạn vẫn có thể thay đổi đối tượng được trỏ với con trỏ này.

Sự nhầm lẫn thường xảy ra do bạn có hai loại loại phát đến tại đây. Kiểu con trỏ và kiểu được trỏ tới. Cả hai đều có thể là const.

Với giao diện của operator+ bạn đảm bảo đối tượng được trỏ đến bởi thông số sẽ không bị thay đổi bởi con trỏ đó (con trỏ tới blog const). Nhưng sau đó bạn gán nó cho một con trỏ tới blog, sau đó có thể được sử dụng để thay đổi đối tượng và phá vỡ hợp đồng giao diện. Tôi đề nghị bạn suy nghĩ lại giao diện hoặc thay đổi việc thực hiện của nhà điều hành của bạn - bạn có thể muốn sao chép nội dung của đối tượng được trỏ vào danh sách nội bộ, thay vì chỉ thao tác với con trỏ.

+1

Bạn cũng có thể thêm rằng 'const blog *' và 'blog const *' là như nhau (đặc biệt là kể từ sau này là gần gũi hơn để "đọc các loại ngược") – Joe

+0

True , Tôi sẽ chỉnh sửa nó trong – Fiktik

+0

Hoàn hảo! Tôi đã bối rối bởi vì tôi biết const blog * và blog const * là điều tương tự, nhưng khi tôi thấy blog * const chỉ thực sự làm tôi bối rối! Nó đã bị xóa, Cảm ơn rất nhiều! – ZZPLKF

0

Nếu bạn thực sự muốn quá tải toán tử +, khác với ý nghĩa và cách sử dụng thông thường của lớp học, vì vậy bạn không cần khai báo tham số của mình dưới dạng const. Với cách mà bạn có thể giải quyết vấn đề của bạn

0

Bạn có thể sử dụng next = const_cast<blog *>(b)

const_cast sẽ loại bỏ hoặc ném cái constantness của biến.

1

Nếu bạn thực sự muốn đưa con trỏ const đến con trỏ không const, bạn có thể sử dụng const_cast như Gaurav đề xuất.

Tuy nhiên, tôi sẽ sử dụng một cái gì đó như vậy chỉ như một phương sách cuối cùng khi tôi thực sự dồn vào lib/api của người khác tôi chỉ cần sử dụng.

Nếu đây là xảy ra trong mã của riêng bạn này ususally có nghĩa là bạn không được thiết kế api của bạn/giao diện một cách cẩn thận và/hoặc sử dụng sai/hiểu lầm "đúng đắn const"

Tôi mạnh mẽ enourage bạn đọc về const correctness.

CẬP NHẬT: const corectness không chỉ là một điều thú vị khác mà chúng tôi có trong C++. Đôi khi nó có thể gây thêm một số cơn đau, nhưng nó cũng cung cấp một số chỗ cho các giả định cho các khách hàng của mã của bạn cũng như trình biên dịch/trình tối ưu hóa. Làm const_cast theo nghĩa đen là "vi phạm các quy tắc" và có thể dễ dàng dẫn đến hành vi không mong muốn.

0

ghi chú của bạn có lẽ đề cập đến trường hợp thông thường của quá tải toán tử nhị phân, nơi hai toán hạng không thay đổi (họ chỉ dùng để tạo ra kết quả a)

như thể bạn đang quá tải + hoặc - để làm phép tính số học.

tham số của bạn là con trỏ đến đối tượng không được phép thay đổi, vì bạn có danh sách được liên kết nơi dữ liệu nút được lưu trữ trong lớp, đây không phải là thứ bạn muốn các đối tượng.

sử dụng dàn diễn viên để sửa lỗi của bạn chỉ đơn giản là phá hủy mục đích làm cho bạn tham số const, tốt hơn hết là không làm cho nó const, có lẽ là tốt cho những gì bạn đang làm.

tình trạng quá tải của nhà điều hành chỉ hoạt động, không có lý do gì khiến chúng phải có nhiều const hơn bất kỳ chức năng nào khác mà tôi có thể thấy.

Các vấn đề liên quan