如何通过 class 方法对 C++ 中的 class 执行操作?
How do I act upon a class in C++ from a class method?
在伪代码领域,如果我想对 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++ 中,当在下面声明 class 或任何其他标识符时,就编译器所知,它是未声明的。你需要在龙下面声明骑士。
还要注意按值、引用或指针将 class 作为参数传递的区别。在大多数情况下,您会希望通过引用传递 class,例如 Dragon& dragon
,而不是 Dragon dragon
等值。这样可以防止不必要的复制。
C 和 C++ 代码与 Java 不同,它们是一次性编译的,因此 classes 在定义之前不能被引用。当您在定义 class Dragon
之前引用 class Dragon
时,编译器无法识别它。在使用它之前,您必须在代码的前面定义 class Dragon;
。
在伪代码领域,如果我想对 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++ 中,当在下面声明 class 或任何其他标识符时,就编译器所知,它是未声明的。你需要在龙下面声明骑士。
还要注意按值、引用或指针将 class 作为参数传递的区别。在大多数情况下,您会希望通过引用传递 class,例如 Dragon& dragon
,而不是 Dragon dragon
等值。这样可以防止不必要的复制。
C 和 C++ 代码与 Java 不同,它们是一次性编译的,因此 classes 在定义之前不能被引用。当您在定义 class Dragon
之前引用 class Dragon
时,编译器无法识别它。在使用它之前,您必须在代码的前面定义 class Dragon;
。