cuốn sách gpt4 ai đã làm

Tại sao các con trỏ lớp bị ghi đè lại sử dụng toán tử== và toán tử!= của lớp cơ sở

In lại Tác giả: Vũ trụ không gian Thời gian cập nhật: 2023-11-04 16:12:24 29 4
mua khóa gpt4 Nike

Tôi có mẫu lặp của lớp và lớp cho câu lệnh.

mẫu
lớp Itr2 {
public:
Itr2() { }
~Itr2() { }

tên kiểu chữ typedef Kiểu Itr2;
typedef tên kiểu T& tham chiếu;

loại ảo& operator++() { return *this }
ảo T& operator*() { return ((reference)*((type*)this));
toán tử bool ảo==(const type& o) const { return true }
toán tử bool ảo!=(const type& o) const { return false }
};


mẫu
lớp I2
{
public:
typedef I2 loại;
giá trị typedef T;
typedef T& tham chiếu;
typedef tên kiểu Itr2 iterator;

trình vòng lặp ảo& bắt đầu() { return *(new iterator());
trình vòng lặp ảo& end() { return *(new iterator());
};

Tiếp theo, tôi tạo một lớp cho std::vector<> tiêu chuẩn.

mẫu
lớp ItrSTD : công khai Itr2 {
public:
tên kiểu typedef Itr2 base_type;
tên kiểu chữ typedef ItrSTD kiểu;
typedef tên kiểu T& tham chiếu;
tên kiểu typedef std::vector::iterator std_itr;
protected:
std_itr itr_;
public:
ItrSTD(const type& o) { itr_ = o.itr_ }
ItrSTD(const std_itr& o) { itr_ = o }

base_type& operator++() { itr_++; return *this }

ảo T& operator*() { return ((reference)(*this->itr_));
bool operator==(const base_type& o) const ghi đè { return (((const type&)o).itr_ == this->itr_ }
toán tử bool!=(const base_type& o) const ghi đè { return (((const type&)o).itr_ != this->itr_ }
};



mẫu
lớp VSTD : công khai I2 {
protected:
std::vector arr_;
public:
tên kiểu typedef Trình lặp ItrSTD;

VSTD(const VSTD& o) { arr_ = o.arr_ }
template VSTD(E&&...e) : arr_({ std::forward(e)... }) { }

iterator&begin() _NOEXCEPT ghi đè{ return (*new iterator(arr_.begin()) }
iterator& end() _NOEXCEPT ghi đè{ return (*new iterator(arr_.end()) }

};

Nếu tôi sử dụng câu lệnh trực tiếp for(int i:v). Nó hoạt động tốt, nhưng khi tôi cố gắng thực hiện điều này từ trình biên dịch con trỏ, sử dụng toán tử lớp cơ sở != (không ghi đè toán tử !=) và mã không hoạt động :(.

int v_i = 0;
VSTD vstd_a = { 1, 2, 3 };
I2 *i2 = &vstd_a;

for (int j : *i2) //KHÔNG hoạt động :( sử dụng toán tử!= từ lớp cơ sở
{
v_i += j;
}
for (int j : vstd_a) //hoạt động tốt :) sử dụng operator!= từ VSTD.
{
v_i += j;
}

Nếu tôi đơn giản hóa mã:

mẫu
lớp I3
{
public:
Tôi;
toán tử bool ảo==(const I3& o) const { return false }
};

mẫu
lớp I3O : công khai I3
{
public:
toán tử bool ảo==(const I3& o) const ghi đè { return true }
};

I3O i3_a, i3_b; I3 *i3_ap, *i3_bp;

i3_ap = &i3_a;

i3_c = (i3_a == i3_b);
i3_c = ((*i3_ap) == (*i3_bp));

Cả hai kết quả đều ổn (trả về true) và so sánh với lớp bị ghi đè (chỉ với ( : ) không hoạt động tốt :( :

Tại sao điều này lại xảy ra. Con trỏ mẫu có thể được sử dụng trong câu lệnh không? Các hàm start(), end() hoạt động tốt. Chỉ có người vận hành làm việc khác nhau.

PS Tôi sử dụng trình biên dịch VS2013.

câu trả lời hay nhất

Tôi chưa xem chi tiết trong mã của bạn, nhưng... có vẻ như bạn đang cố gắng tạo ra trình vòng lặp đa hình. Tuy nhiên, tiêu chuẩn tiếp tục chuyển chúng theo giá trị và truyền theo giá trị không hỗ trợ tính đa hình; Vì vậy (tôi giả sử), trong:

cho ( int j : *i2 )

Trình biên dịch tạo các biến cục bộ cho trình vòng lặp với kiểuxác định tĩnh. Mặc dù nó gọi là đúng begin(), gán kết quả cho biến cục bộ này, do đó cắt nó.

Nếu bạn cần các trình vòng lặp đa hình, bạn cần triển khai thành ngữ chữ cái/phong bì:

lớpIterator
{
Trình vòng lặp* myImpl;

Virtual Iterator* clone() const { abort() }
ảo T& current() const { abort();
bool ảo isEqual( Iterator const* other ) { abort();
khoảng trống ảo tiếp theo() { hủy bỏ();

protected:
Iterator() : myImpl( nullptr ) {}
public:
Iterator( Iterator* impl ) : myImpl( impl ) {}
Iterator( Iterator const& other ) : myImpl( other.clone() ) {}
ảo ~Iterator() { xóa myImpl }

T& toán tử*() const
{
trả về myImpl->current();
}
toán tử bool==(Iterator const& other) const
{
trả về myImpl->isEqual( other.myImpl );
}
Trình vòng lặp & toán tử++()
{
myImpl->next();
return *this;
}
// ...
};

lớp DerivedIterator : Iterator công khai
{
Iterator* clone() const ghi đè { return new DerivedIterator( *this );
T& current() const ghi đè { ... }
bool isEqual( Iterator const* other ) ghi đè { ... }
khoảng trống ảo tiếp theo() { ... }
public:
DerivedIterator(...) ...
};

Sau đó, nguồn gốc của bạn beginend Trả về như sau:

Iterator(new DerivedIterator(...) );

Điều này khá tốn kém khi chạy, nhưng nó thực sự là cách duy nhất để cung cấp tính đa hình mà vẫn có các vòng lặp.

Về c++ - tại sao con trỏ của lớp bị ghi đè lại sử dụng operator== và operator!= của lớp cơ sở, chúng tôi tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/26995999/

29 4 0
không gian vũ trụ
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress