首先,让我以“我是C ++新手”为前提这个问题!这可能会变得非常简单,我会感到非常愚蠢,但现在我真的可以使用帮助了。我知道如何使用Abstract类来完成此操作,但我不能在这里使用Abstract类。此外,如果有更好的方法,我愿意接受建议。
我有一个ClientCommand(基类)和一个MasterCommand(扩展基类)
MasterCommand可以完成ClientCommand可以执行的所有操作以及更多方法。
在我的应用程序中,我想对两个命令使用相同的名称。如果对象是客户端,那么它将仅限于客户端方法。如果对象是Master,那么它将拥有所有客户端方法和Master方法。
我知道必须有办法做到这一点。
这是我的测试代码:
BASE CLASS HEADER:
#ifndef __OPCommand_H_
#define __OPCommand_H_
class OPCommand {
public:
virtual void doSomething();
void doClientStuff();
};
#endif //__OPCommand_H_
BASE 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";
}
扩展班主任:
#ifndef __OPMasterCommand_H_
#define __OPMasterCommand_H_
#include "OPCommand.h"
class OPMasterCommand : public OPCommand {
public:
void doSomething();
void doMasterStuff();
};
#endif //__OPMasterCommand_H_
延伸课程:
#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";
}
TEST 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_
TEST 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'
答案 0 :(得分:2)
我的通灵调试技巧告诉我,既然你是C ++的新手,你会忘记你的标题包括警卫(这是你看到的redefinition of 'OPCommand'
错误的一个非常常见的原因。)
尝试在头文件中添加类似的内容(更改每个标题的名称):
#ifndef OPCOMMAND_H_included
#define OPCOMMAND_H_included
<original header contents>
#endif
答案 1 :(得分:1)
回答问题的第二部分:如何为所有命令使用单个基类和单个变量?
您需要查找Command模式。在您的情况下,您需要从Command派生所有类。
此外,如果从ClientCommand派生MasterCommand,则不需要多重继承:Command&lt; = ClientCommand&lt; = MasterCommand,它就是它。 MasterCommand isa Command,因为它是ClientCommand的子类。