0

我尝试创建一个 SSCE,因为这通常也有助于及早发现问题。但是,我似乎找不到解决方案,所以我想知道是否可以定义一个未指定模板类指针的参数。

我定义了一个接口和一个解析器类,它应该处理 xerces 的实现细节(如转码和所有这些开销)。接口类将被设计为从 (SAX) 解析器创建对象,但不必处理 xerces 库。

在 Java 中,我知道我可以使用一个未指定的泛型类型参数,如下所示:

class Parser
{
    public Parser(IGenericInterface<?> oImpl) {};
}

基本上我想知道如何在 C++ 中做到这一点。在下面的示例中,我在声明接口变量的行上出现编译器错误,因为它缺少类型。但当然,在类声明中,类型是未知的,应该在运行时分配,如main.

#include <iostream>
#include <string>

template <class T>
class IGenericInterface
{
public:
    IGenericInterface() {};
    virtual ~IGenericInterface() {};

    virtual T *createInstance(void) = 0;
};

template <class T>
class Implementation : public IGenericInterface<T>
{
public:
    Implementation() {};
    virtual ~Implementation() {};

    T *createInstance(void)
    {
        T * t = new T;
        return t;
    }
};

class Parser
{
public:
    Parser(IGenericInterface *oImpl) { mImpl = oImpl; };
    virtual ~Parser() { delete mImpl; };

    void doSomething(void) {  do whatrever is needed; t = createInstance(); };

private:
    IGenericInterface *mImpl;
};

int main()
{
    Parser *p = new Parser(new Implementation<int>());
    sleep(3);

    return 0;
}

那么如何定义Parser构造函数以使其传递任意接口参数?

4

3 回答 3

1

C++ 是一种静态语言,因此任何类型都必须在编译时解析。因此,您在 java 中所做的事情不能在 C++ 中以相同的方式完成。相反,您可以使用动态多态性(使用继承)或“静态多态性”,使用模板(在编译时解决)和 CRTP。

于 2013-08-11T18:31:36.810 回答
0

由于显然 Java 中的泛型无法在 C++ 中实现,因此我找到了一个不同的解决方案,它也允许我将解析器的细节分开。

应该在接口类中的函数现在作为虚拟抽象函数移动到解析器类。我可以定义一个从解析器派生的模板,从而被迫实现虚函数,这基本上是我想要的。

模式现在看起来像这样:

template <class T>
class ISerialization
{
public:
    virtual ~ISerialization(void) {};

public:
    virtual std::string serialize(void) = 0;
    virtual bool deserialize(std::vector<T *> &oObjects, std::string const &oSerialized) = 0;
};

class parser
{
    void parsing(void) { abstract_function(); }
    virtual void abstract_function() = 0;
};


class implementation : public ISerialization<Task>, public parser
{
    std::string serialize(void) {};
    bool deserialize(std::vector<T *> &oObjects, std::string const &oSerialized) {};
    void abstract_function() { specific implementation goes here};
};
于 2013-08-12T15:11:55.117 回答
0

混合静态和动态多态性是不行的(可能适用豁免)

template <class T>
class IGenericInterface
{
public:
    IGenericInterface() {};
    virtual ~IGenericInterface() {};

    virtual T *createInstance(void) = 0;
};

而你对指针的使用是一场噩梦。

于 2013-08-11T18:19:53.007 回答