我不知道如何问这个问题,但希望有人会理解。可以说我有3个不同的课程。 A类,B类和C类.C类应该将A类或B类作为构造函数中的参数,并将其存储在私有变量中。
重载构造函数很容易。我的问题是C类如何根据使用的构造函数自动使用正确的类? (注意这两个类是相似的,但来自不同的库,因此没有共享的基类)。这可以用模板吗?我对模板没有很多经验。
答案 0 :(得分: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();
}
答案 1 :(得分:0)
使用模板可以轻松完成:
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()
{
...
}