【问题标题】:Unhandled Exception: Access violation reading location未处理的异常:访问冲突读取位置
【发布时间】:2013-11-22 20:28:12
【问题描述】:

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();

【问题讨论】:

  • passOnplayer 上调用cmd.execute(),但player 没有下一个命令...
  • 个人播放器("播放器", Command());调用 Command 的默认构造函数,并将 obj 和 method 都设置为 undefined(如果您在调试模式下使用 Visual Studio,则为 NULL)。 Person master("House Master", Command(&player, &Person::passOn)) 然后创建一个Person对象,其obj是player并且Command是传递的Command对象,但是当调用passOn时,它调用cmd.execute()在播放器上,其方法为空。

标签: c++ design-patterns command


【解决方案1】:

问题是你允许空命令,你甚至在没有检查的情况下执行它。

将命令的构造函数更改为此应该可以解决问题:

Command(Person &obj, void(Person:: *meth)())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-01
    • 1970-01-01
    • 2011-09-28
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-05
    相关资源
    最近更新 更多