Tôi gặp vấn đề với 2 toán tử trong lớp của mình.
Lớp tôi tuyên bố:
mẫu
lớp Bản đồ của tôi{
phím keyType[MAX];
giá trị loại giá trị [MAX];
kích thước int;
}
Tôi cần xác định lại toán tử [], ví dụ khi tôi gọi:std::cout<<>
giờ.
keyType& operator[] (khóa keyType){}
Nó hoạt động tốt. Tôi cũng sử dụng nó cho bài tập về nhà và nó hoạt động rất tốt, ví dụ:MyMap1["a"]="a1";
Mã này là hoàn hảo. nhưng trong tôitoán tử []
tôi tăng kích cỡ
Tham số, nó chỉ hoạt động nếu tôi muốn làm bài tập. khi tôi chỉ làm std::cout
, Tôi không muốn tăng nó.
Vậy có lẽ tôi nên xác định lại toán tử=
hoạt động nhưng khi tôi không thể viết:
void toán tử=(giá trị valueType){}
因为MyMap1["a"] = "a1"
Thành viên bên trái của là loại khóa
thay vì Bản đồ của tôi
kiểu.
我该怎么做?
Vấn đề không phải ở bản thân kết quả đầu ra; mà là ở chỗ khóa đó không tồn tại. Tôi nghĩ điều quan trọng là bạn phải xác định trước khi đi xa hơn. Có rất nhiều khả năng:
bạn có thể làm std::bản đồ
thực hiện việc đó và chèn nó bằng giá trị mặc định. Điều này rất thuận tiện trong nhiều trường hợp, nhưng điều đó có nghĩa là bạn không thể sử dụng trên bản đồ const []
.
Bạn có thể yêu cầu toán tử trả về một con trỏ chứa giá trị null nếu đối tượng không tồn tại. Cá nhân tôi không thích cái này được sử dụng cho toán tử []
;Điều này có nghĩa là bạn phải viết một cái gì đó như:ValueType* p = myMap[key];if (p != NULL) ...
,这[]
Nó có vẻ không tự nhiên. (Mặt khác, nó cũng hoạt động find
hoặc lấy
chức năng. )
Bạn có thể đưa ra một ngoại lệ (hoặc thậm chí sử dụng các xác nhận nếu bạn cung cấp mộtchứa
hoạt động và sử dụng nó như[]
).
Bạn có thể trả về một giá trị mặc định được xác định trước. Điều này trái ngược với giải pháp đầu tiên; toán tử []
Bản đồ không bao giờ thay đổi và không cần phải có phiên bản không phải const.
Cuối cùng (đây có vẻ là mục tiêu của bạn): bạn có thể để toán tử []
Trả về proxy để phân biệt khi được sử dụng làm giá trị myMap["a"]
Và giữa myMap["a"]
= cái gì đó
. Cảm giác của tôi là giải pháp này không hoạt động tốt với C++, nhưng nó hoạt động tốt với các ngôn ngữ khác (ví dụ như Python).
Đối với giải pháp cuối cùng, bạn sẽ sử dụng một cái gì đó như:
lớpBản đồ của tôi
{
lớpProxy
{
MyMap* myOwner;
Loại khóa myKey;
public:
Proxy (chủ sở hữu MyMap*, khóa KeyType)
: myOwner(chủ sở hữu)
, myKey(khóa)
{
}
Proxy const& operator=( Giá trị loại giá trị ) const
{
myOwner->insertOrUpdate( myKey, value );
return *this;
}
toán tửValueType() const
{
if ( !myOwner->contains( myKey ) ) {
ném UnknownKeyException( myKey );
}
return myOwner->get( myKey );
}
};
public:
Toán tử proxy[](Khóa KeyType)
{
trả về Proxy( cái này, khóa );
}
};
Tôi là một lập trình viên xuất sắc, rất giỏi!