0

是否可以通过在创建对象后重载函数来使类函数的行为完全不同?

例如,我有一个名为 Poop 的类,它有一个名为 start() 的函数。我希望 start() 为 Poop 的每个实例做完全不同的事情。

因此,如果我调用 a.start(),它可能会为 10 次迭代运行 for 循环,如果我调用 b.start(),它可能会完全执行其他操作,例如向用户询问两个数字并返回总和。

我的代码:

对象.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");

对象.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;
4

3 回答 3

3

做这样的事情的一种常见方法是使用策略模式。的每个实例都Poop将包含对策略对象的引用——扩展纯虚拟strategy类的类的实例,然后它将委托start()给策略对象。

另一种方法是拥有一个实现脚本语言的库,并实现脚本语言中的各种行为;每个对象可以包含不同的脚本,并且start()可以执行它。

于 2013-06-09T01:48:28.930 回答
1

对象存储状态,您可以使用适当的参数初始化对象,然后根据存储的参数调用操作以归档您想要的内容。

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;
   }
}
于 2013-06-09T01:52:14.917 回答
0

好吧,也许它可以与仿函数一起使用。您可以在每个类中添加一个仿函数指针作为成员,仿函数将是基类,并且一些派生类将从它继承每个派生类将具有不同的函数,它们将决定类的功能持有他们。我从来没有尝试过,也没有见过这样的事情,但我看不出它不应该工作的原因。

于 2013-06-09T05:16:31.960 回答