如何从类方法对 C++ 中的类进行操作?

九星符文

在伪代码领域,如果我想用 Java 执行某些操作,我可以去

class Dragon
{
   //some code here defining what a Dragon is
}

class Knight
{
   //some code here defining what a Knight is

   public void Attack(Dragon dragon)   // <----- specifically this
   {
      //define an attack
   }
}
   
class Main
{
    public static void main (String[] args)
    {
         Knight knight = new Knight;
         Dragon dragon1 = new Dragon;
         Dragon dragon2 = new Dragon;
         knight.Attack(dragon1);     // <----- specifically this
    }
}

我将如何在 C++ 中做到这一点?当我尝试使用以下代码时,有人告诉我error: unknown type name 'Dragon'

#include <iostream>
#include <list>
#include <string>

class IObserver {
 public:
  virtual ~IObserver(){};
  virtual void Update(const std::string &message_from_subject) = 0;
};

class ISubject {
 public:
  virtual ~ISubject(){};
  virtual void Attach(IObserver *observer) = 0;

  virtual void Notify() = 0;
};

class Knight : public ISubject {
 public:

  void Attach(IObserver *observer) override {
    list_observer_.push_back(observer);
  }


  void Notify() override {
    std::list<IObserver *>::iterator iterator = list_observer_.begin();
    while (iterator != list_observer_.end()) {
      (*iterator)->Update(message_);
      ++iterator;
    }
  }

  void CreateMessage(std::string message = "Empty") {
    this->message_ = message;
    Notify();
  }

  void Attack(Dragon dragon) {    //<-----------right here
    this->message_ = "I am attacking";
    Notify();
    std::cout << "todo\n";
  }

 private:
  std::list<IObserver *> list_observer_;
  std::string message_;
};

class Dragon : public ISubject {
 public:

  void Attach(IObserver *observer) override {
    list_observer_.push_back(observer);
  }


  void Notify() override {
    std::list<IObserver *>::iterator iterator = list_observer_.begin();
    while (iterator != list_observer_.end()) {
      (*iterator)->Update(message_);
      ++iterator;
    }
  }

  void CreateMessage(std::string message = "Empty") {
    this->message_ = message;
    Notify();
  }


  void CallForHelp() {
    this->message_ = "I'm under attack";
    Notify();
    std::cout << "todo\n";
  }

 private:
  std::list<IObserver *> list_observer_;
  std::string message_;
};

class GameManager : public IObserver {
 public:
  GameManager(Knight &subject) : subject_(subject) {
    this->subject_.Attach(this);
    std::cout << "GameManager " << ++GameManager::static_number_ << " online\n";
    this->number_ = GameManager::static_number_;
  }

  void Update(const std::string &message_from_subject) override {
    message_from_subject_ = message_from_subject;
    PrintInfo();
  }

  void PrintInfo() {
    std::cout << "GameManager " << this->number_ << ": a new message is available --> " << this->message_from_subject_ << "\n";
  }

 private:
  std::string message_from_subject_;
  Knight &subject_;
  static int static_number_;
  int number_;
};

int GameManager::static_number_ = 0;

void ClientCode() {
  Knight *knight = new Knight;
  GameManager *gameManager = new GameManager(*knight);

  knight->CreateMessage("I exist");
  knight->CreateMessage("Going to attack dragon1");
  knight->Attack();

}

int main() {
  ClientCode();
  return 0;
}

我一定错过了一些东西,但我觉得这应该有效。我对抽象类或 C++ 不是很了解,但是应该可以进行等效的操作,对吗?

计算机Fido

在 C++ 中,当一个类或任何其他标识符在下面声明时,就编译器而言,它是未声明的。你需要在龙下面声明骑士。

还要注意通过值、引用或指针将类作为参数传递之间的区别。在大多数情况下,您希望通过引用传递类,Dragon& dragon而不是传递值,例如Dragon dragon. 这可以防止不必要的副本。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在C ++中可以将类作为操作数进行操作

如何在Swift类中重写Objective-C类的抽象类级别方法?

包装C ++,如何在cython中执行不同的类操作

如何从单独的类python中的方法操作类中的属性

在C ++中的模板类中对类成员进行排序

如何在C ++中的类中递归调用函数方法?

C ++如何从多个派生类调用基类方法?

如何使用ComponentRef <C>类的destroy()方法

C ++如何使函数指针指向类方法

如果未在类C ++中定义方法,如何在类对象上使用方法

如何在 C++ 中调用类 A 的方法 1 来调用类 B 的方法 2?

作为C ++中的类成员进行分发

与Swift中的C ++类进行交互

如何在Kotlin中创建对类进行操作的扩展功能?

使用c#泛型扩展方法对类而非集合进行操作

通过引用传递给python(áC ++)中的类的参数,以使用类方法对其进行修改

如何在C99中重现类方法的行为?

如何使用C#ScriptEngine在类中执行方法

如何在C ++中以单类方法获取SQLite记录

如何在Swift中调用Objective C类方法

如何找到存储在 C++ 向量中的对象的类方法?

如何从c#WPF中的多个类调用接口方法?

如何在Objective C中的类方法上使用self

如何使方法更新C++中类的属性

如何在 C++ 中调用基类方法?

在C#中的基类中使用泛型:如何确保基类中的方法返回派生类的类型?

如何在C ++中的Normal或Singleton类内GoogleTest私有方法/枚举类

如何在Swift类中从Objective C调用单例类方法?

如何重载作为参数传递给C ++中的模板类的基类方法?