2010-03-17 37 views
5

vì một lý do nào đó tôi đang suy nghĩ về việc triển khai giao diện trong một hàm (phương thức) nào đó làm lớp địa phương.Triển khai lớp trừu tượng thành lớp địa phương? ưu và khuyết điểm

xem xét sau đây:

class A{ 
public: 

    virtual void MethodToOverride() = 0; 

}; 

A * GetPtrToAImplementation(){ 

    class B : public A { 
    public: 
     B(){} 
     ~B(){} 

     void MethodToOverride() { 
      //do something 
     } 
    }; 

    return static_cast<A *>(new B()); 
} 


int _tmain(int argc, _TCHAR* argv[]) 
{ 

    A * aInst = GetPtrToAImplementation(); 

    aInst->MethodToOverride(); 

    delete aInst; 
    return 0; 
} 

những lý do tại sao tôi đang làm điều này là:

  1. Tôi lười biếng để thực hiện lớp (B) trong tập tin riêng biệt
  2. MethodToOverride chỉ các đại biểu gọi đến lớp khác
  3. Lớp B không được hiển thị cho người dùng khác
  4. không cần phải lo lắng ab xóa aIn vì các con trỏ thông minh được sử dụng để triển khai thực tế

Vì vậy, câu hỏi của tôi là nếu tôi làm điều này đúng không?

Cảm ơn trước!

+0

Tại sao bạn không thể xác định 'B' hoàn toàn (không phải cục bộ) trong tệp triển khai cho' A'? –

+1

Chỉ cần một nitpick, nhưng A nên có một destructor ảo – jpalecek

+0

A chỉ là một giao diện - khai báo trong một tập tin tiêu đề. Ngoài ra, B không thể hiển thị bên ngoài đơn vị dịch mà GetPtrToAImplementation được định nghĩa. – sinek

Trả lời

5
  1. Bạn có thể xác định B trong không gian tên vô danh của tập tin thực hiện, nơi bạn thực hiện GetPtrToAImplementation().

  2. A cần phải có một dtor ảo.

  3. Theo tiêu chuẩn C++ hiện tại, bạn không thể sử dụng các lớp địa phương làm đối số mẫu. (Có nghĩa là bạn không thể sử dụng chúng với STL chẳng hạn.)

+0

@sbi: có vẻ như đã đến lúc tôi nghỉ ngơi vì tôi không thể nhớ các không gian tên chưa được đặt tên :) p.s. cảm ơn vì thông tin rằng họ không thể được sử dụng làm đối số mẫu vì tôi không biết! – sinek

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