1

サーバーの初期化時に提供されるユーザー (ログインとパスワードのチェック、ファイルの配信など) を処理するクラスでパラメーター化できる単純な柔軟な ftp サーバーを C++ で作成したいと考えています。

だから私はこのきちんとした(そう思った)アイデアを思いついた:

class FtpDelegate
{
public:
    FtpDelegate() {}
    virtual ~FtpDelegate() {}
    virtual bool login(QString username, QString password) = 0;
    // ...
};

class DummyDelegate : public FtpDelegate
{
public:
    virtual bool login(QString username, QString password)
    {
        return true;
    }
};

template<class Delegate>
class FtpServer : public QObject, Derived_from<Delegate, FtpDelegate>
{
    Q_OBJECT
public:
    explicit FtpServer(const QHostAddress &address = QHostAddress::Any,
                       quint16 port = 21,
                       QObject *parent = 0);

public slots:
    void newConnection();

private:
    QTcpServer *server;
    QHostAddress address;
};

template <class Delegate>
void FtpServer<Delegate>::newConnection()
{
    FtpDelegate *delegate = new Delegate();
    new FtpConnection (delegate, server->nextPendingConnection(), address, this);
}

class FtpConnection : public QObject
{
    Q_OBJECT
public:
    explicit FtpConnection(FtpDelegate *delegate,
                           QTcpSocket *socket,
                           const QHostAddress &address,
                           QObject *parent = 0);

public slots:
    void newDataConnection();

private:
    QTcpSocket *socket;
    QTcpServer *dataServer; // needed to transfer data to user
    QTcpSocket *dataSocket;
};


// server initialization
FtpServer<DummyDelegate> ftpServer();

そして(おそらくあなたはそれが来るのを見たでしょう)バム!

Error: Template classes not supported by Q_OBJECT

私は C++ テンプレート メカニズム (および Qt も) を学び始めたばかりなので、他のエラーや誤解もある可能性があります。

私の質問は次のとおりです。関数ポインターを渡すなどの醜いハックを使用したり、具体的な FtpDelegate の派生クラスごとにファクトリ実装を作成したりする必要なく、それを機能させる最良の方法は何ですか。私には見えない巧妙なデザインパターンがあるのか​​もしれません。最終的には、ネットワーク メカニズムを書き直して、それが最適なオプションである場合はブーストすることができます。

4

1 に答える 1

2

テンプレート Q_OBJECT クラスを作成することはできません (これと回答を参照してください)。

静的継承を使用する代わりに、ランタイム継承を使用し、FtpDelegate クラスから継承するオブジェクトを注入する必要があります。


FtpServer は実際には接続を作成するファクトリのようです。あなたの質問から、なぜそれが Q_OBJECT クラスでなければならないのかわかりません。そのため、設計を再検討し、そのクラスを単純化する必要がある場合があります。


関数ポインタを渡したり、具体的な FtpDelegate の派生クラスごとにファクトリ実装を作成する必要があるなどの醜いハックを使用せずに機能させる最良の方法は何ですか。

最善の方法は、FtpDelegate型のインスタンスを作成するファクトリ クラスを持つことです。しかし、投稿されたコードには非常に多くの問題があるため、すべての詳細を知らずに詳細を伝えることはできません.

于 2013-11-05T16:25:00.077 に答える