C ++:Class - 重载的构造函数 - 单个变量?

时间:2012-10-26 09:17:52

标签: c++ class constructor

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

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

2 个答案:

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