我不知道如何问这个,但希望有人能理解。可以说我有3个不同的课程。A 类、B 类和 C 类。 C 类应将 A 类或 B 类作为构造函数中的参数,并将其存储在私有变量中。
这对于重载的构造函数很容易。我的问题是 C 类如何根据使用的构造函数自动使用正确的类?(注意这两个类是相似的,但是来自不同的库,因此没有共享的基类)。这可能与模板吗?我对模板没有太多经验。
我不知道如何问这个,但希望有人能理解。可以说我有3个不同的课程。A 类、B 类和 C 类。 C 类应将 A 类或 B 类作为构造函数中的参数,并将其存储在私有变量中。
这对于重载的构造函数很容易。我的问题是 C 类如何根据使用的构造函数自动使用正确的类?(注意这两个类是相似的,但是来自不同的库,因此没有共享的基类)。这可能与模板吗?我对模板没有太多经验。
是的,这可以通过模板实现:
#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();
}
您可以使用模板轻松完成:
class A;
class B;
template<class AorB>
class C
{
public:
C(AorB aorb)
: aorb_(aorb)
{ }
private:
AorB aorb_;
};
这样做是在类内部C
,标识符AorB
可以用作任何其他类,实际上它甚至不必是任何类的实例,A
也B
可以是任何类。
可以这样使用:
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()
{
...
}