将类传递到基类构造函数的模板参数中?
Passing Classes into template parameters for a base class constructor?
这是一个奇怪的问题,所以我会尽我所能来解释自己。
假设我有以下课程:
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函数。这是我唯一想更新的东西。而已。有没有可能的方法可以访问这些类函数?
如果你要这样做,你必须做几件事。
- 您的类必须通过引用存储
A
和B
,否则它们不会更改。 - 您的类必须在头文件中实现,因为它是模板化的。
好消息是编写它非常简单:
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
放入其自己的文件中,而不包含任何其他文件。
相关文章:
- C++:使用运算符 = 调用多参数构造函数
- 通过零参数构造函数创建的 glm::mat4 应该包含哪些值?
- 好奇的混合与可变参数构造函数
- 具有默认值的单个参数构造函数是否与默认构造函数相同?
- 为什么我们需要创建一个单参数构造函数来使用临时的无名称对象
- 在可变参数构造函数中初始化常量数组
- C++ 显式多参数构造函数歧义
- 零一参数构造函数
- 可变参数构造函数中的 SFINAE
- 当没有显式关键字与单参数构造函数一起使用时,编译器可以发出警告
- 可变参数类模板和可变参数构造函数
- 确保模板参数类型与其可变参数构造函数的类型匹配
- C++默认参数构造函数与内联初始化优先级
- 如何在 c++ 中将包含复制构造函数的类的参数构造函数称为私有?
- 自动存储中没有无参数构造函数的类对象和异常
- 警告:用两个参数构造函数返回对象时,表达结果未使用
- 如何在C++中调用无参数构造函数
- 在 c++ 中具有多个参数构造函数的模板类存在问题
- 可变参数构造函数优先于用户提供的移动构造函数,除非默认
- 如何从可变参数构造函数参数构造任何对象?