C :类 - 超载构造函数 - 单个变量

C++: Class - Overloaded Constructors - single variable?

本文关键字:单个 变量 构造函数 超载      更新时间:2023-10-16

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

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

您可以使用模板很容易做到这一点:

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()
{
    ...
}

是的,模板是可以的:

#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();
}