2013-05-16 33 views
8

Tôi đang cố gắng cấu trúc lại mã của mình để tôi sử dụng các khai báo chuyển tiếp thay vì bao gồm nhiều tiêu đề. Tôi mới đến điều này và có một câu hỏi liên quan đến tăng :: shared_ptr.Tuyên bố chuyển tiếp và shared_ptr

Nói rằng tôi có giao diện như sau:

#ifndef I_STARTER_H_ 
#define I_STARTER_H_ 

#include <boost/shared_ptr.hpp> 

class IStarter 
{ 
public: 
    virtual ~IStarter() {}; 

    virtual operator()() = 0; 
}; 

typedef boost::shared_ptr<IStarter> IStarterPtr; 

#endif 

sau đó tôi có một hàm trong một lớp học mà phải mất một đối tượng IStarterPtr như là đối số, nói:

virtual void addStarter(IStarterPtr starter) 
{ 
    _starter = starter; 
} 
... 
IStarterPtr _starter; 

làm thế nào để tôi về phía trước tuyên bố IStarterPtr không bao gồm IStarter.h?

Tôi đang sử dụng C++ 98 nếu đó là mức độ liên quan.

Trả lời

7

con trỏ Shared làm việc với phía trước tuyên bố loại miễn là bạn không gọi * hoặc -> vào chúng vì thế nên làm việc chỉ đơn giản là viết: -

class IStarter; 
typedef boost::shared_ptr<IStarter> IStarterPtr; 

Bạn cần phải bao gồm <boost/shared_ptr.hpp> tất nhiên

2

Mặc dù nó sẽ thêm tệp tiêu đề, bạn có thể đặt tệp đó vào một tệp tiêu đề riêng biệt:

#include <boost/shared_ptr.hpp> 

class IStarter; 
typedef boost::shared_ptr<IStarter> IStarterPtr; 

và sau đó bao gồm cả hai trong IStarter.h và trong tiêu đề khác của bạn, tránh đồng de sao chép (mặc dù nó khá nhỏ trong trường hợp này).

Có thể có giải pháp tốt hơn.

1

Có một cách nhưng bạn cần phải bao gồm tiêu đề tăng trong tập tin của bạn:

#include <boost/shared_ptr.hpp> 

class IStarter; 
typedef boost::shared_ptr<IStarter> IStarterPtr; 

// ... 

virtual void addStarter(IStarterPtr starter) 
{ 
     _starter = starter; 
} 
// ... 
IStarterPtr _starter; 
1

Bạn không thể về phía trước tuyên bố typedefs trong C++ 98 vì vậy những gì tôi thường làm gì trong trường hợp này là kéo ra các typedefs tôi cần phải đặt chúng vào một tập tin types.h, hoặc một cái gì đó tương tự. Bằng cách đó, mã loại phổ biến vẫn được tách biệt với định nghĩa của chính lớp đó.

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