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

Passing Classes into template parameters for a base class constructor?

本文关键字:参数 构造函数 基类      更新时间:2023-10-16

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

假设我有以下课程:

Class1 A;
Class2 B;
Class3 B;

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

现在让我在这里阻止你!你可能会问,"你为什么不把1个类叫做类,做一个A类,B类和C类?这是因为我正在从事的当前项目构建了不同的类,这些类并不都具有相同的结构。例如,假设 Class1 是一个 OpenGL 继承的类,Class2 是一个小部件,它有一些带有一些值的滑块,而 Class3 是一个只有一个值的文本框。

我只是像这样分解它,以便自己更容易想象。现在我们已经解决了这个问题,让我解释一下我想要做什么:

#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 的函数。那是因为它们未在此文件中 #included。所以现在你的下一个问题是,"好吧,你为什么不把每一堂课都 #include 进去呢?这是因为我不想为必须创建的每个类定义一个 BaseClass 构造函数。我所知道的是,这些类中的每一个都有一个getValue和setValue函数。这是我唯一想更新的东西。而已。有没有可能的方法可以访问这些类函数?

如果你要这样做,你必须做几件事。

  • 您的类必须通过引用存储AB,否则它们不会更改。
  • 您的类必须在头文件中实现,因为它是模板化的。

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

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放入其自己的文件中,而不包含任何其他文件。