【发布时间】:2021-11-23 14:25:16
【问题描述】:
在伪代码领域,如果我想在 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++ 不是很了解,但应该可以进行等效的操作,对吧?
【问题讨论】:
-
旁白:在 C++ 中,您不需要
new来创建类的实例:Knight knight; GameManager gameManager(knight);很好 -
旁白 2:
ISubject的两个子类具有相同的实现。为什么没有Subject基类? -
旁白3:你不需要显式使用迭代器
for (auto observer : list_observer_) { observer->Update(message_); }
标签: c++ function class methods