【发布时间】:2021-08-27 09:57:14
【问题描述】:
我正在努力解决一个关于从模板中链接两个派生类的问题。假设我们有一个模板基类 Param_B,它将其子类(Param_S 或 Param_M)之一作为参数。 Param_B 类的模板参数进一步用于定义其他局部变量(_parent 和回调函数 _func)。对我来说,需要有 Param_S 或 Param_M 来动态调用函数。
问题是,在我创建了指向孩子的指针并向它们添加计时器和函数之后,我想要一个 _link 变量,它可以在两个孩子类型之间交换信息。例如。从 Param_S 我想通过使用 _link 变量来更改 Param_M 计时器的超时。我
#include <stdio.h>
#include <memory>
#include <vector>
class Param_S;
class Param_M;
template <class T>
class Functionn{
Functionn(){};
~Functionn(){};
private:
std::function<void(std::shared_ptr<T>)> _callback;
};
template <class T>
class Timer
{
public:
Timer(){ timeout = 0; };
~Timer(){};
void setTimeout(const int time){ timeout = time; };
std::weak_ptr<Functionn<T>>& getFunction(){ return _func; };
std::weak_ptr<T> getParent(){ return _parent;};
private:
int timeout;
std::weak_ptr<T> _parent;
std::weak_ptr<Functionn<T>> _func;
};
template <class T>
class Param_B {
public:
Param_B(){};
~Param_B(){};
std::vector<std::shared_ptr<Timer<T>>>& getTimers(){
return _timers;
}
void addTimer(std::shared_ptr<Timer<T>> _t){
_timers.push_back(std::move(_t));
}
std::weak_ptr<Param_B> getLink(){
return _link;
}
void setLink(std::weak_ptr<Param_B> link){
_link = link;
}
private:
std::weak_ptr<Param_B> _link;
std::vector<std::shared_ptr<Timer<T>>> _timers;
};
class Param_S : public Param_B<Param_S>
{
public:
Param_S(){ paramS = -2; };
~Param_S(){};
void setValue(){
paramS = 33;
}
int getValue(){ return paramS;};
private:
float paramS;
};
class Param_M : public Param_B<Param_M>
{
public:
Param_M(){ parammM = -4; };
~Param_M(){};
int getValue(){ return parammM; };
private:
int parammM;
};
class sys{
public:
std::vector<std::shared_ptr<Param_S>> getParams(){
return _params;
}
private:
std::vector<std::shared_ptr<Param_S>> _params;
};
class module{
public:
std::vector<std::shared_ptr<Param_M>> getParams(){
return _params;
}
private:
std::vector<std::shared_ptr<Param_M>> _params;
};
void main(){
std::shared_ptr<sys> _sys = std::make_shared<sys>();
_sys->getParams().push_back(std::make_shared<Param_S>());
_sys->getParams()[0]->addTimer(std::make_shared<Timer<Param_S>>());
std::shared_ptr<module> _mod = std::make_shared<module>();
_mod->getParams().push_back(std::make_shared<Param_M>());
_mod->getParams()[0]->addTimer(std::make_shared<Timer<Param_M>>());
_sys->getParams()[0]->setLink(_mod->getParams()[0]); // this not work , the conversion failed
}
感谢您的帮助。
【问题讨论】:
-
这两个孩子不是多态的。为此,您需要template covariance,它通常会产生比它解决的问题更多的问题。这不是您所面临的确切情况,但问题是相同的
-
getParams()应该返回sys和module中的引用 -
你想用
getLink()做什么? -
@Caleth 正在调用
getLink()然后我可以获取链接参数(param_M 或 Param_S)的计时器并更改计时器超时。还有一点就是调用附在定时器上的函数。