2013-07-18 29 views
9

Tôi có một struct (có thể là lớp) và được định nghĩa trong lớp khác nhưthử nghiệm phức tạp để kiểm tra mà đối tượng khởi tạo một cuộc gọi chức năng

struct A{ 
somedata_A; 
somespecificimplementation_A(someclass *S1); 
}; 

class someclass{ 
somedata_someclass; 
A a; 
}; 

main(){ 
someclass c1, *c2; 
c2 = &c1; 
c1.a.somespecificimplementation_A(c2); 
} 

Làm thế nào để xác minh c2 mà thực sự là một tài liệu tham khảo cho c1? Xin lỗi vì đã đưa ra ví dụ này vì rõ ràng c2 là tham chiếu cho c1.

Cập nhật: A không lưu trữ một con trỏ đến SomeClass

+0

Bạn có thể giải thích tốt hơn một chút không? 'c2' trỏ tới' c1' nếu '& c1 == c2'. Đó là những gì bạn đang yêu cầu? Hoặc bạn có muốn biết liệu 'c1' thực sự vẫn tồn tại chỉ bằng cách nhìn vào' c2'? –

+0

@NikosC. Tôi muốn biết liệu & c1 == c2 –

Trả lời

6

Nếu bạn không biết gì về cha mẹ, so sánh thành viên' adresses

void A::somespecificimplementation_A(someclass *S1) 
{ 
    if (this == &(S1->a)) { 
     // parent == S1 
    } else { 
     // parent != S1 
    } 
} 
+0

Đó là một ý tưởng hay. Đơn giản hơn nhiều so với giải pháp của tôi. (Ngoài ra, hành vi được chỉ định đầy đủ trên tất cả các máy.) –

+0

Vâng, tôi nghĩ đây là cách duy nhất sẽ hoạt động. – PierreBdR

+0

Ahh - oops, tôi thấy bạn đánh tôi với nó! :) Tôi sẽ xóa câu trả lời của tôi ... – Nim

1

Giả sử struct A có một con trỏ đến c1, sau đó bạn có thể mất một con trỏ đến c2 và so sánh giá trị con trỏ? Tương tự như những gì bạn sẽ làm với quá tải toán tử gán?

+0

Có cách nào khác để làm điều đó giả sử A không lưu trữ con trỏ của c1? Lý do tôi hỏi điều này là A không cần biết sự tồn tại của c1 hoặc là một vấn đề của thực tế bất kỳ đối tượng nào khác. –

+0

Xem câu trả lời của SGrebenkin. – user268396

3

Giống như rằng:

struct A{ 
    int somedata_A; 
    int somespecificimplementation_A(someclass *S1){ 
    if ((void*) &(S1->a) == this) 
    { 
     std::cout << "S1 is a pointer to myself" << std::endl; 
     return 1; 
    } 
    return 0; 
    } 
}; 
+1

nhưng "this" sẽ trỏ đến struct A phải không? –

+0

Cảm ơn bạn đã trả lời. Có an toàn để giả định, sau đó, rằng "điều này" thực sự đề cập đến c1? –

+0

Không hoạt động, địa chỉ của thể hiện * của 'A' bên trong' someclass' có thể không giống với địa chỉ của cá thể 'someclass' sở hữu cá thể' A'. – Nim

1

Tại sao đi đường xung quanh và vượt qua một con trỏ của lớp học của bạn đến struct lồng nhau mà sau đó bạn phải kiểm tra, khi bạn thay vì có thể cung cấp một tài liệu tham khảo cho phụ huynh của phụ huynh trong quá trình xây dựng?

class someclass 
{ 
    public: 
     struct a 
     { 
      void foo() 
      { 
       parent.doSomething(); 
      } 

      private: 
       friend someclass; 
       a(someclass & parent) 
       : parent(parent) 
       {} 
       someclass & parent; 
     } a; 

     someclass() : a(*this) {} 

    private: 
     void doSomething() 
     { 
     } 
}; 
1

Mặc dù về mặt kỹ thuật không xác định, sau đây sẽ làm việc trên hiện đại nhất, máy mục đích chung:

void A::somespecificimplementation_A(someclass* S1) 
{ 
    char const* s = reinterpret_cast<char const*>(S1); 
    char const* t = reinterpret_cast<char const*>(this); 
    if (this >= s && this < s + sizeof(someclass)) { 
     // This A is a member of S1 
    } else { 
     // This A isn't 
    } 
} 

Có nói rằng, tôi sẽ nhấn mạnh:

  1. Điều này không được chỉ định theo tiêu chuẩn. Nó sẽ hoạt động trên các máy có địa chỉ bằng phẳng, tuyến tính, nhưng có thể không thành công (cung cấp các mặt tích cực sai) trên máy tính, ví dụ: bộ nhớ phân đoạn.

  2. Tôi muốn đặt câu hỏi nghiêm túc về thiết kế nếu A cần biết ai là người là thành viên của.

  3. Và nếu A thực sự cần thông tin này, nó thực sự cần lưu trữ con trỏ đến someclass, được chuyển cho hàm tạo của nó, sao cho phụ thuộc hiển thị.

+0

Cảm ơn bạn đã trả lời. Tôi đã hiểu bản ngã nhưng tại sao nó lại thất bại trong trường hợp bộ nhớ phân đoạn? –

+0

@SumanVajjala Bởi vì theo tiêu chuẩn, so sánh con trỏ cho sự bất bình đẳng chỉ hợp lệ giữa các con trỏ vào cùng một đối tượng; kể từ khi trên một kiến ​​trúc phân đoạn, thông thường tất cả các con trỏ vào cùng một đối tượng sẽ có cùng một phân đoạn, một thực hiện có thể (và thường sẽ) chỉ so sánh các offset. –

+0

Tôi cảm ơn bạn đã giải thích của bạn :) –

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