oop — В c ++, как я могу сделать так, чтобы два объекта одного класса имели уникальное поведение функций?

Можно ли заставить функцию класса вести себя совершенно иначе, перегружая функцию после создания объекта?

Например, у меня есть класс с именем Poop, и у него есть функция start ().
Я хочу, чтобы start () делал совершенно разные вещи для каждого экземпляра Poop.

Поэтому, если я вызову a.start (), он может запустить цикл for для 10 итераций
и если я вызову b.start (), он может сделать что-то еще, например, попросить пользователя о двух
цифры и вернуть сумму.

Мой код:

obj.cpp

#include <string>
#include <obj.h>

//Concstructor
Poop::Poop (std::string get_name) {
my_name = get_name;
}

//Obj functions implement here
void Poop::set_name(std::string name) {
my_name = name;
}

// I want to change this so that each object can behave differently
// when they call .start()
void Poop::start() {
std::cout << "I am poop_1's start call" << std::endl;
}//Event objects
Poop poop_1("bob");

obj.h

#include <iostream>
#include <string>

// defin obj
class Poop {
//class attrs; private
private:
std::string my_name;
public: //class function
Poop(std::string); //constructor
std::string get_name() {return (my_name);}
void set_name(std::string); //sets Obj name
void start(); // for the custom event; need to change this somehow

};

// global event objects
extern Poop poop_1;

0

Решение

Один из распространенных способов сделать что-то подобное это использовать Стратегия паттерна. Каждый экземпляр Poop будет содержать ссылку на объект стратегии — экземпляр класса, который расширяет чистый виртуальный strategy класс, а затем он будет делегировать start() к объекту стратегии.

Другим способом было бы иметь библиотеку, которая реализует язык сценариев и реализует различные варианты поведения в языке сценариев; каждый объект может содержать другой скрипт, и start() мог выполнить это.

3

Другие решения

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

enum Action
{
Action1 = 1,
Action2
};

class Poop {
private:
std::string my_name;
Action action;
public: //class function
Poop(const std::string& name, Action action); //constructor
void start();
};

void Poop::start() {
switch(action)  // start performs differently based on parameters
{
case Action1:
std::cout << "I am poop_1's start call" << std::endl;
break;
case Action2:
std::cout << "I am poop_1's start call" << std::endl;
break;
default:
break;
}
}
1

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

0
По вопросам рекламы [email protected]