C++ 如何扩展 class 并转换为具有相同名称的适当类型
C++ how to extend a class and cast to appropriate type with same name
首先,让我用"I am new to C++"作为这个问题的序言!这可能会变得非常简单,我会觉得很愚蠢,但现在我真的可以使用帮助。我知道如何使用 Abstract class 来做到这一点,但我不能在这里使用 Abstract class 。另外,如果有更好的方法,我愿意接受建议。
我有一个 ClientCommand(基础 class)和一个 MasterCommand(扩展基础 class)
MasterCommand 可以做 ClientCommand 可以做的一切,还有一些方法。
在我的应用程序中,我想为两个命令使用相同的名称。如果 object 是一个客户端,那么它将仅限于客户端方法。如果 object 是 Master 那么它将拥有所有客户端方法以及 Master 方法。
我知道一定有办法做到这一点。
- 我没有正确投射
- 我没有正确构建它
- 或者我做错了什么
这是我的测试代码:
基地 CLASS HEADER:
#ifndef __OPCommand_H_
#define __OPCommand_H_
class OPCommand {
public:
virtual void doSomething();
void doClientStuff();
};
#endif //__OPCommand_H_
基地 CLASS BODY:
#include "OPCommand.h"
void OPCommand::doSomething() {
// TODO - implement OPClientCommand::doSomething
throw "Not yet implemented";
}
void OPCommand::doClientStuff() {
// TODO - implement OPClientCommand::doClientStuff
throw "Not yet implemented";
}
扩展 CLASS HEADER:
#ifndef __OPMasterCommand_H_
#define __OPMasterCommand_H_
#include "OPCommand.h"
class OPMasterCommand : public OPCommand {
public:
void doSomething();
void doMasterStuff();
};
#endif //__OPMasterCommand_H_
扩展 CLASS BODY:
#include "OPMasterCommand.h"
void OPMasterCommand::doSomething() {
// TODO - implement OPMasterCommand::doSomething
throw "Not yet implemented";
}
void OPMasterCommand::doMasterStuff() {
// TODO - implement OPMasterCommand::doMasterStuff
throw "Not yet implemented";
}
测试 CLASS HEADER:
#ifndef __TestMe_H_
#define __TestMe_H_
#include "OPMasterCommand.h"
#include "OPCommand.h"
class TestMe {
public:
OPCommand* command;
OPMasterCommand* masterCommand;
public:
void startHere();
OPMasterCommand* getMasterCommand();
OPCommand* getCommand();
bool isMaster();
};
#endif //__TestMe_H_
测试 CLASS BODY:
密切关注startHere方法:
#include "TestMe.h"
void TestMe::startHere() {
if (isMaster()) {
masterCommand = getMasterCommand();
} else {
command = getCommand();
}
// Here - How can I point to or cast to the appropriate type, so I can use the same name everywhere in my code?
}
OPMasterCommand* TestMe::getMasterCommand() {
if (!masterCommand) {
masterCommand = new OPMasterCommand();
}
//command = dynamic_cast<OPCommand*> (masterCommand);
return masterCommand;
}
OPCommand* TestMe::getCommand() {
if (!command) {
command = new OPCommand();
}
return command;
}
bool TestMe::isMaster() {
return true;
}
我无法构建它。现在我正在重新定义 'OPCommand'
我的通灵调试技巧告诉我,由于您是 C++ 的新手,您忘记了 header 包含守卫(这是您看到的 redefinition of 'OPCommand'
错误的一个非常常见的原因)。
尝试在您的 header 文件中加入这样的内容(更改每个 header 的名称):
#ifndef OPCOMMAND_H_included
#define OPCOMMAND_H_included
<original header contents>
#endif
回答问题的第二部分:如何对所有命令使用单个基 class 和单个变量?
您需要查找 Command 模式。在您的情况下,您需要从命令派生所有 classes。
此外,如果您从 ClientCommand 派生 MasterCommand,则无需多重继承:Command <= ClientCommand <= MasterCommand,仅此而已。 MasterCommand 是一个命令,因为它是 ClientCommand.
的子class
首先,让我用"I am new to C++"作为这个问题的序言!这可能会变得非常简单,我会觉得很愚蠢,但现在我真的可以使用帮助。我知道如何使用 Abstract class 来做到这一点,但我不能在这里使用 Abstract class 。另外,如果有更好的方法,我愿意接受建议。
我有一个 ClientCommand(基础 class)和一个 MasterCommand(扩展基础 class)
MasterCommand 可以做 ClientCommand 可以做的一切,还有一些方法。
在我的应用程序中,我想为两个命令使用相同的名称。如果 object 是一个客户端,那么它将仅限于客户端方法。如果 object 是 Master 那么它将拥有所有客户端方法以及 Master 方法。
我知道一定有办法做到这一点。
- 我没有正确投射
- 我没有正确构建它
- 或者我做错了什么
这是我的测试代码:
基地 CLASS HEADER:
#ifndef __OPCommand_H_
#define __OPCommand_H_
class OPCommand {
public:
virtual void doSomething();
void doClientStuff();
};
#endif //__OPCommand_H_
基地 CLASS BODY:
#include "OPCommand.h"
void OPCommand::doSomething() {
// TODO - implement OPClientCommand::doSomething
throw "Not yet implemented";
}
void OPCommand::doClientStuff() {
// TODO - implement OPClientCommand::doClientStuff
throw "Not yet implemented";
}
扩展 CLASS HEADER:
#ifndef __OPMasterCommand_H_
#define __OPMasterCommand_H_
#include "OPCommand.h"
class OPMasterCommand : public OPCommand {
public:
void doSomething();
void doMasterStuff();
};
#endif //__OPMasterCommand_H_
扩展 CLASS BODY:
#include "OPMasterCommand.h"
void OPMasterCommand::doSomething() {
// TODO - implement OPMasterCommand::doSomething
throw "Not yet implemented";
}
void OPMasterCommand::doMasterStuff() {
// TODO - implement OPMasterCommand::doMasterStuff
throw "Not yet implemented";
}
测试 CLASS HEADER:
#ifndef __TestMe_H_
#define __TestMe_H_
#include "OPMasterCommand.h"
#include "OPCommand.h"
class TestMe {
public:
OPCommand* command;
OPMasterCommand* masterCommand;
public:
void startHere();
OPMasterCommand* getMasterCommand();
OPCommand* getCommand();
bool isMaster();
};
#endif //__TestMe_H_
测试 CLASS BODY:
密切关注startHere方法:
#include "TestMe.h"
void TestMe::startHere() {
if (isMaster()) {
masterCommand = getMasterCommand();
} else {
command = getCommand();
}
// Here - How can I point to or cast to the appropriate type, so I can use the same name everywhere in my code?
}
OPMasterCommand* TestMe::getMasterCommand() {
if (!masterCommand) {
masterCommand = new OPMasterCommand();
}
//command = dynamic_cast<OPCommand*> (masterCommand);
return masterCommand;
}
OPCommand* TestMe::getCommand() {
if (!command) {
command = new OPCommand();
}
return command;
}
bool TestMe::isMaster() {
return true;
}
我无法构建它。现在我正在重新定义 'OPCommand'
我的通灵调试技巧告诉我,由于您是 C++ 的新手,您忘记了 header 包含守卫(这是您看到的 redefinition of 'OPCommand'
错误的一个非常常见的原因)。
尝试在您的 header 文件中加入这样的内容(更改每个 header 的名称):
#ifndef OPCOMMAND_H_included
#define OPCOMMAND_H_included
<original header contents>
#endif
回答问题的第二部分:如何对所有命令使用单个基 class 和单个变量?
您需要查找 Command 模式。在您的情况下,您需要从命令派生所有 classes。
此外,如果您从 ClientCommand 派生 MasterCommand,则无需多重继承:Command <= ClientCommand <= MasterCommand,仅此而已。 MasterCommand 是一个命令,因为它是 ClientCommand.
的子class