这是一个奇怪的问题,所以我会尽我所能解释自己。
说我有以下课程:
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函数。这是我要更新的唯一内容。而已。有什么可能的方法来访问那些类函数?
答案 0 :(得分:0)
如果要执行此操作,则必须做一些事情。
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
放入其自己的文件中,而不包含任何其他文件。