1

我不知道如何问这个,但希望有人能理解。可以说我有3个不同的课程。A 类、B 类和 C 类。 C 类应将 A 类或 B 类作为构造函数中的参数,并将其存储在私有变量中。

这对于重载的构造函数很容易。我的问题是 C 类如何根据使用的构造函数自动使用正确的类?(注意这两个类是相似的,但是来自不同的库,因此没有共享的基类)。这可能与模板吗?我对模板没有太多经验。

4

2 回答 2

0

是的,这可以通过模板实现:

#include <iostream>

template<class T>
class C {
public:
    C(T const& ref) : ref(ref) {}
    void doStuff() const {
        ref.doStuff();
    }
private:
    T ref;
};

class A {
public:
    void doStuff() const {
        std::cout << "A::doStuff" << std::endl;
    }
};

class B {
public:
    void doStuff() const {
        std::cout << "B::doStuff" << std::endl;
    }
};

int main() {
    C<A> foo((A()));
    foo.doStuff();

    C<B> bar((B()));
    bar.doStuff();
}
于 2012-10-26T09:20:50.507 回答
0

您可以使用模板轻松完成:

class A;
class B;

template<class AorB>
class C
{
public:
    C(AorB aorb)
        : aorb_(aorb)
        { }

private:
    AorB aorb_;
};

这样做是在类内部C,标识符AorB可以用作任何其他类,实际上它甚至不必是任何类的实例,AB可以是任何类。

可以这样使用:

A myA;
B myB;

C<A> myCWithA(myA);
C<B> myCWithB(myB);

然而,在使用模板创建类时,您必须记住一件事:规范和实现不能再拆分为单独的头文件和源文件。所有代码都必须在头文件中可用。

成员函数的语法也有些不同。

例子:

template<class T>
class C
{
public:
    ...

    void someFunction();
};

template<class T>
C<T>::someFunction()
{
    ...
}
于 2012-10-26T09:21:32.200 回答