Как независимый объект может вызывать метод из класса вызывающего? - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть независимый класс с шаблоном, который выполняет перегрузку для некоторого оператора, и я хочу поместить его в качестве триггера для класса вызывающего.Пример кода:

Независимый класс

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;}
};

Производный класс

В этом классе будет использоваться независимый класс.

//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);
   }
};

Main

int main(){
   DerivedClass objectTLM;
   return 0;
}

До сих пор я думал использовать 2шаблон template<typename DataType, typename Caller> и добавьте еще один конструктор в мой Независимый класс, но все же, как я могу передать сам производный класс, т.е. (I8 objA = new I8(this)) * Он также не работал

В сценарии реального кода у меня есть несколько производных классовиз того же базового класса, и базовый класс может контролировать каждое значение для каждого производного класса.

Пожалуйста, помогите.Спасибо.

1 Ответ

0 голосов
/ 03 декабря 2018

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>;

Обратите внимание, что если вы сделаете это, вы все равно не получите вывод, которыйвы просите, потому что вы добавите 8 к неинициализированному значению BaseClass::sum, прежде чем добавить к нему 4.

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);
   }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...