gpt4 book ai didi

c++ - 注册表模式中的段错误 11

转载 作者:行者123 更新时间:2023-11-28 05:37:22 26 4
gpt4 key购买 nike

我正在尝试创建一个 Animal 类,其中一些子类具有接口(interface)方法 newObject() 返回 self 的新实例:

动物.h

class Animal{
public:
virtual Animal* newObject()=0;
};

我正在尝试使用 AnimalRegister 类实现注册表模式,该类存储类名和类实例之间的映射:

动物注册.h

#include <map>
class Animal;
class AnimalRegister{
public:
static void* add(const char* name,Animal* a);
static Animal* get(const char* name);
protected:
static std::map<const char*,Animal*> m;
};

动物注册.cpp

#include "AnimalRegister.h"
#include <stdio.h>
std::map<const char*,Animal*> AnimalRegister::m;
void* AnimalRegister::add(const char* name,Animal* a){
m[name]=a;
printf("%s registered\n",name);
return NULL;
}

Animal* AnimalRegister::get(const char* name){
return m[name];
}

当我添加一个子类 Cat 时:

目录.h

#include "Animal.h"
class Cat : public Animal{
public:
virtual Animal* newObject();
protected:
static void* Cat_;
};

猫.cpp

#include "Cat.h"
#include <stdio.h>
#include "AnimalRegister.h"

void* Cat::Cat_=AnimalRegister::add("Cat",new Cat());
Animal* Cat::newObject(){
printf("Cat::newObject");
return new Cat();
}

线

void* Cat::Cat_=AnimalRegister::add("Cat",new Cat());

将字符串“Cat”映射到 Cat 的实例,以便稍后我可以按名称创建一个新的 Cat:

Animal* a=AnimalRegister::get("Cat")->newObject();

代替

if(string(name)=="Cat"){
return new Cat();
}

在添加新的子类时违反了开闭原则。

但是当我尝试测试上面的代码时:

#include "Cat.h"
#include "AnimalRegister.h"
int main(){
printf("#1");
Animal* a1=AnimalRegister::get("Cat");
printf("#2");
Animal* a2=a1->newObject();
printf("#3");
};

输出只有:

Segmentation fault: 11

而且似乎永远达不到主线,这是什么原因?

最佳答案

打印件上缺少行尾字符 ("\n")。段错误发生在您输出行尾字符之前,因此不会打印任何内容。尝试

printf("#1\n");

编辑:至于为什么会发生段错误,get("Cat") 返回一个空指针,因为您还没有调用 add("Cat")。段错误来自于尝试在空指针上调用 newObject。

关于c++ - 注册表模式中的段错误 11,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37938980/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com