在伪代码领域,如果我想在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++不是很了解,但应该有一个等价的操作可以执行,对吧?
发布于 2021-10-02 05:55:50
在C++中,当一个类或任何其他标识符在下面声明时,只要编译器知道它是未声明的。你需要在龙的下面声明骑士。
还要注意通过值、引用或指针将类作为参数传递之间的区别。在大多数情况下,您可能希望通过引用传递类,比如Dragon& dragon,而不是通过值传递,比如Dragon dragon。这可以防止不必要的副本。
发布于 2021-10-02 05:56:43
与Java语言不同的是,C和C++代码是在一次遍历中编译的,因此类只有在定义好之后才能被引用。当您在定义class Dragon之前引用类Dragon时,编译器无法识别它。在使用class Dragon;之前,必须先在代码中定义它。
https://stackoverflow.com/questions/69414335
复制相似问题