将类传递给基类构造函数的模板参数?

时间:2019-04-09 23:51:01

标签: c++

这是一个奇怪的问题,所以我会尽我所能解释自己。

说我有以下课程:

Class1 A;
Class2 B;
Class3 B;

这些类中的每一个都有一个setVariable和getVariable函数,这些函数将设置一个称为变量的私有变量。

现在让我在这里阻止您!您可能会问:“为什么不只创建一个称为Class的类,而创建Class A,Class B和Class C?”这是因为我正在处理的当前项目具有内置的不同类,但它们并非都具有相同的结构。例如,假设Class1是OpenGL继承的类,Class2是一个小部件,上面带有一些带有一些值的滑块,而Class3是一个只有一个值的textBox。

我正在像这样分解它,以便于自己进行可视化。现在我们已经解决了这个问题,让我解释一下我要做什么:

#include "class1.hpp"
#include "class2.hpp"
#include "class3.hpp"
#include "baseClass.hpp"

int main()
{
  Class1 A;
  Class2 B;
  Class3 C;

  BaseClass<Class1,Class2> base1(A,B);

  base1.setValue(30);
}

然后在后台,将A类和B类的变量设置为30。但是,这是我要处理的问题:

#ifndef BASE_CLASS_HPP
#define BASE_CLASS_HPP

#include <utility>

template<class A, class B>
class BaseClass
{
  public:
    BaseClass(const A &classA, const B &classB) : class1(classA), class2(classB){}
    void setValue(int);
    std::pair<int,int> getValue();

  private:
    A class1;
    B class2;
};
#endif

问题是BaseClass对Class1,Class2或Class3的功能一无所知。那是因为它们没有#include在此文件中。因此,现在您的下一个问题将是:“那么,为什么不将每个单独的类都包含在其中?”那是因为我不想为我必须创建的每个类都定义一个BaseClass构造函数。我所知道的是,这些类中的每一个都有一个getValue和setValue函数。这是我要更新的唯一内容。而已。有什么可能的方法来访问那些类函数?

1 个答案:

答案 0 :(得分:0)

如果要执行此操作,则必须做一些事情。

好消息是,编写它非常简单:

template<class A, class B>
class BaseClass {
    A& a; // store them by reference
    B& b; 
   public:
    // References have to be initialized in the member initializer list
    BaseClass(A& a, B& b) 
      : a(a), b(b) 
    {}
    void setValue(int value) {
        a.setValue(value); 
        b.setValue(value); 
    }
    std::pair<int, int> getValue() {
        return {a.getValue(), b.getValue() };
    }
};

然后,在main函数中,您必须提供这些类作为模板参数:

int main()
{
    Class1 A;
    Class2 B;

    BaseClass<Class1, Class2> base1(A,B);

    // This works now
    base1.setValue(30);

    std::cout << A.getValue() << '\n'; // Prints 30
}

如果您以这种方式进行操作,则将BaseClass放入其自己的文件中,而不包含任何其他文件。