c++ - 独立对象如何从调用者类调用方法?
问题描述
我有一个带有模板的独立类,它为某些运算符重载,我想把它作为调用者类的触发器。示例代码:
独立班
template <typename DataType>
class IndependentClass{
public:
DataType _value;
IndependentClass(){};
IndependentClass(DataType val):_value(val){};
~IndependentClass(){};
IndependentClass& operator=(const IndependentClass<DataType>& mu){
if (this != &mu){
_value = mu._value;
//I want to trigger caller method from here
//But how this class can know the caller class?
// _caller.callParentMethod();
}
return (*this);
}
IndependentClass& operator=(int val){
return (operator=(IndependentClass<DataType>(val)));
}
DataType getValue()const{
return _value;
}
};
基类
class BaseClass{
public:
int sum;
BaseClass(){};
~BaseClass(){};
void setValue(int value){sum+=value;}
int getValue(){return sum;}
};
派生类
在这个类中将使用 Independent 类。
//Declare Independent Class
typedef IndependentClass<int> I8;
class DerivedClass : public BaseClass{
public:
I8 sumThisClassValue;
DerivedClass(){
methodDerivedClass();
};
~DerivedClass(){};
void methodDerivedClass(){
sumThisClassValue = 8;
Base::setValue(4);
cout<<"Value = "<<Base::getValue()<<endl; //Output 4
cout<<sumThisClassValue<<endl;
cout<<"Value = "<<Base::getValue()<<endl; //Output that I want is 12
}
void callParentMethod(int _val){
Base::setValue(_val);
}
};
主要的
int main(){
DerivedClass objectTLM;
return 0;
}
到目前为止,我正在考虑使用 2 模板template<typename DataType, typename Caller>
并在我的独立类中添加另一个构造函数,但我仍然如何传递派生类本身,即(I8 objA = new I8(this))
*它也不起作用
在真实的代码场景中,我有多个来自同一个基类的派生类,而基类可以监控每个派生类的每个值。
请帮忙。谢谢。
解决方案
IndependentClass
需要引用一个实例DerivedClass
来调用callParentMethod
它。您不能更改 的参数operator =
,因此它必须是 的成员IndependentClass
。
class DerivedClass;
template <typename DataType>
class IndependentClass{
DerivedClass & _caller;
public:
DataType _value;
IndependentClass(DerivedClass & caller, DataType val = {}) : _caller(caller), _value(val) {};
IndependentClass(const IndependentClass &) = delete;
IndependentClass& operator= (const IndependentClass &) = delete;
IndependentClass& operator= (int mu) {
_value = mu;
_caller.callParentMethod();
return *this;
}
DataType getValue() const {
return _value;
}
};
using I8 = IndependentClass<int>;
请注意,如果您这样做,您仍然不会得到您要求的输出,因为您将在向未初始化的BaseClass::sum
值添加 4 之前添加 8。
class DerivedClass : public BaseClass{
public:
I8 sumThisClassValue;
DerivedClass() : sumThisClassValue(*this) {
methodDerivedClass();
};
void methodDerivedClass(){
Base::setValue(4);
std::cout << "Value = " << Base::getValue() << std::endl; //Output 4
sumThisClassValue = 8;
std::cout << sumThisClassValue._value << std::endl;
std::cout << "Value = " << Base::getValue() << std::endl; //Output 12
}
void callParentMethod(int _val){
Base::setValue(_val);
}
};
推荐阅读
- apache-kafka-streams - Kafka Streams DSL 重试逻辑(将记录写回主题)
- android - 房间 - 同步 @Delete all
- google-maps - 谷歌方向服务错误的航点订单返回
- visual-studio-code - 如何在 vs-code 上禁用 [abc] 建议?
- c# - 列表列表的 Where 子句
- sql - 如何仅旋转选定的行数
- css - 如何用钩子覆盖材质 ui 样式
- angular - Angular 6 可观察和订阅
- html - Bootstrap 折叠和手风琴向侧面打开,而不是在下面
- python - 如何在 python 的 SPARQLWrapper 中创建参数化查询