在伪代码领域,如果我想用 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++ 中,当一个类或任何其他标识符在下面声明时,就编译器而言,它是未声明的。你需要在龙下面声明骑士。
还要注意通过值、引用或指针将类作为参数传递之间的区别。在大多数情况下,您希望通过引用传递类,Dragon& dragon
而不是传递值,例如Dragon dragon
. 这可以防止不必要的副本。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句