test.exe中0x001AF3B5处未处理的异常:0xC0000005:访问冲突读取位置0x00000000。
在项目http://sourcemaking.com/design_patterns/command/cpp/2中实现此代码时遇到未处理的异常
#include <iostream>
#include <string>
using namespace std;
class Person;
class Command
{
// 1. Create a class that encapsulates an object and a member function
// a pointer to a member function (the attribute's name is "method")
Person *object; //
void(Person:: *method)();
public:
Command(Person *obj = 0, void(Person:: *meth)() = 0)
{
object = obj; // the argument's name is "meth"
method = meth;
}
void execute()
{
(object-> *method)(); // invoke the method on the object
}
};
class Person
{
string name;
// cmd is a "black box", it is a method invocation
// promoted to "full object status"
Command cmd;
public:
Person(string n, Command c): cmd(c)
{
name = n;
}
void talk()
{
// "this" is the sender, cmd has the receiver
cout << name << " is talking" << endl;
cmd.execute(); // ask the "black box" to callback the receiver
}
void passOn()
{
cout << name << " is passing on" << endl;
// 4. When the sender is ready to callback to the receiver,
// it calls execute()
cmd.execute();
}
void gossip()
{
cout << name << " is gossiping" << endl;
cmd.execute();
}
void listen()
{
cout << name << " is listening" << endl;
}
};
int main()
{
// Fred will "execute" Barney which will result in a call to passOn()
// Barney will "execute" Betty which will result in a call to gossip()
// Betty will "execute" Wilma which will result in a call to listen()
Person wilma("Wilma", Command());
// 2. Instantiate an object for each "callback"
// 3. Pass each object to its future "sender"
Person betty("Betty", Command(&wilma, &Person::listen));
Person barney("Barney", Command(&betty, &Person::gossip));
Person fred("Fred", Command(&barney, &Person::passOn));
fred.talk();
}
完全不确定为什么?我实现了它,因为它没有任何变化,只是输出有所不同,只有2个人而不是4个人。尝试了一些调试及其在命令中execute()时的错误。
任何帮助或技巧都将非常有用!
编辑:实际上,在经过一些测试之后,当我更改人员和发生的呼叫时,不确定为什么。
Person player("Player", Command());
Person master("House Master", Command(&player, &Person::passOn));
master.talk();
最佳答案
问题在于您允许使用空命令,甚至可以不检查就执行它。
将Command的构造函数更改为此可以解决问题:
Command(Person &obj, void(Person:: *meth)())
关于c++ - 未处理的异常:访问冲突读取位置,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19899546/