Có một cách thanh lịch để trao đổi tài liệu tham khảo trong C++?


0 Phiếu
Đã hỏi 25/5/2016 bởi hfvbalde (800 điểm)
Sometimes classes are referencing other classes. Implementing std::swap() for such classes cannot be straightforward, because it would lead to swapping of original instances instead of references. The code below illustrates this behavior:
#include <iostream>
class A
{
   int& r_;
public:
   A(int& v) : r_(v) {}
   void swap(A& a)
   {
      std::swap(r_, a.r_);
   }
};
void test()
{
   int x = 10;
   int y = 20;
   A a(x), b(y);
   a.swap(b);
   std::cout << "x=" << x << "\\n"
             << "y=" << y << "\\n";
}
int main()
{
    test();
    return 0;
}
A simple workaround with a union:
class A
{
   union
   {
      int& r_;
      size_t t_;
   };
public:
   A(int& v) : r_(v) {}
   void swap(A& a)
   {
      std::swap(t_, a.t_);
   }
};
This is effective, but not handsome. Is there a nicer way to swap two references in C++? Also how does C++ standard explain mixing references and values in one union, considering that in Stroustrup's "The C++ Programming Language" book a 'reference' is defined as an 'alternative name of an object, an alias' (p.189).

2 Câu trả lời

0 Phiếu
Đã trả lời 02/6/2016 bởi PollYou (960 điểm)
được bình chọn là câu trả lời hay nhất 04/6/2016 bởi exactly_rau
 
Câu trả lời hay nhất
Mẹo liên minh bạn đang sử dụng là khoảng như không-di động như code được. Tiêu chuẩn địa điểm không có yêu cầu gì trên làm thế nào trình biên dịch thực hiện tài liệu tham khảo. Họ có thể (và hầu hết có thể làm) sử dụng con trỏ dưới mui xe, nhưng điều này không bao giờ được đảm bảo. Không phải đề cập đến một thực tế là sizeof(size_t)sizeof(T*) không phải là cần thiết để được bình đẳng anyway. Câu trả lời tốt nhất cho vấn đề của bạn: không sử dụng tài liệu tham khảo thành viên nếu bạn cần một chuyển nhượng/swappable lớp. Chỉ cần sử dụng một member pointer thay thế. Sau khi tất cả tài liệu tham khảo được không-reseatable theo định nghĩa, nhưng bởi mong class swappable, bạn muốn một cái gì đó reseatable. Và đó là một con trỏ.
Đã bình luận 02/6/2016 bởi vflouro (110 điểm)
Trong ngắn hạn, không sử dụng tài liệu tham khảo các thành viên cho các đối tượng cần đầy đủ swappable. Tài liệu tham khảo không con trỏ. Đừng mong muốn họ.
Đã bình luận 03/6/2016 bởi i_Debem (500 điểm)
+ 1 câu hỏi cũng được viết và đó là rõ ràng và ví dụ làm việc nhỏ. Tuy nhiên, không sử dụng nó trong sản xuất mã. Làm theo lời khuyên của Angew
Đã bình luận 03/6/2016 bởi pbz190I (100 điểm)
Những gì nó có nghĩa là để "trao đổi tài liệu tham khảo hai"? Tài liệu tham khảo là bí danh cho các đối tượng, vì vậy bất cứ điều gì khác hơn là cách trao đổi các đối tượng sẽ là kỳ lạ. Suy nghĩ của tài liệu tham khảo là con trỏ chỉ thêm rắc rối.
Đã bình luận 04/6/2016 bởi Rkc_5638 (520 điểm)
: Không chính xác. Trong cùng một cuốn sách Stroustrup, thuộc tính của tài liệu tham khảo được thảo luận và ý tưởng về trao đổi tài liệu tham khảo hai không mâu thuẫn với bất kỳ của những thuộc tính. Đó là không giống như bạn chỉ định các tham chiếu đến nhau. Số lượng các đối tượng và thực tế rằng tài liệu tham khảo được khởi tạo vẫn bất biến.
Đã bình luận 04/6/2016 bởi exactly_rau (890 điểm)
: Không chính xác. Trong cùng một cuốn sách Stroustrup, thuộc tính của tài liệu tham khảo được thảo luận và ý tưởng về trao đổi tài liệu tham khảo hai không mâu thuẫn với bất kỳ của những thuộc tính. Đó là không giống như bạn chỉ định các tham chiếu đến nhau. Số lượng các đối tượng và thực tế rằng tài liệu tham khảo được khởi tạo vẫn bất biến.
Đã bình luận 04/6/2016 bởi Cne9934act (930 điểm)
trao đổi tài liệu tham khảo không có nghĩa là bất cứ điều gì khác hơn là cách trao đổi các đối tượng mà họ đề cập đến. Có lẽ bạn có thể xây dựng trên làm thế nào điều này có thể có bất kỳ ý nghĩa nào khác.
0 Phiếu
Đã trả lời 04/6/2016 bởi ramieThink (140 điểm)
Bạn có thể sử dụng std::reference_wrapper thay vì trực tiếp tham khảo (mà bạn không thể swap) hoặc pointer (có thể là nullptr). Một cái gì đó như:
class A
{
    std::reference_wrapper<int> r;
public:
   A(int& v) : r(v) {}
   void swap(A& rhs)
   {
      std::swap(r, rhs.r);
   }
   int& get() const { return r; }
};
sống ví dụ
Đã bình luận 05/6/2016 bởi bess_Have (110 điểm)
trao đổi tài liệu tham khảo không có nghĩa là bất cứ điều gì khác hơn là cách trao đổi các đối tượng mà họ đề cập đến. Có lẽ bạn có thể xây dựng trên làm thế nào điều này có thể có bất kỳ ý nghĩa nào khác.
Đã bình luận 06/6/2016 bởi gur677 (410 điểm)
"Đây là có hiệu quả" - không nó không. Một liên minh có thể không có một thành viên tham khảo. Có lẽ compiler của bạn hỗ trợ nó như là một phần mở rộng (đúng hơn là không rõ ràng), nhưng nó không phải là cầm tay.

ToughDev Q&A là gì?

Trang web hỏi đáp cho các bạn đam mê lập trình, phát triển phần mềm và các vấn đề kỹ thuật khác. Với sự giúp đỡ của bạn, chúng tôi hy vọng sẽ xây dựng thành công một thư viện đầy đủ các câu hỏi và trả lời về tất cả các vấn đề có liên quan đến lập trình!







...