抽象类层次结构和访问冲突
Abstract Class Hierarchy and Access Violation
这件事的背景是我试图重新考虑一个复杂的C++应用程序。我把下面的代码放在一起,作为我正在处理的代码的精简版本(去掉不重要的方法等(。我可能在做一些愚蠢的事情,因为我已经多年没有接触C++了,但我可以看到。。。
我有以下几类
message_sink.h:
class IMessageSink
{
public:
virtual ~IMessageSink() { };
virtual void process(const Message& msg) = 0;
};
具有以下基本类
model_base.h:
class Model : public virtual IMessageSink
{
public:
Model(Tag a);
virtual Model* makeA(Tag a) = 0;
void reset();
private:
friend class EM;
const Tag _a;
virtual void calculate(double lambda) = 0;
};
其中model_base.cpp是
Model::Model(Tag a) : _a(a) { }
void Model::reset()
{
// ... some implementation
}
void Model::process(const Message msg)
{
// ... some implementation
}
然后我有以下从基类继承的类
型号_m0.h:
class ModelM0 : public virtual Model
{
public:
ModelM0(Tag a);
ModelM0* make(Tag a);
private:
void calculate(double lambda);
};
model_m0.cpp:
ModelM0::ModelM0(Tag a) : Model(a) { }
ModelM0* ModelM0::make(Tag a)
{
ModelM0* m = new ModelM0(a);
m->reset();
return m;
}
void ModelM0::calculate(double lambda)
{
// Some code...
}
但问题就在这里,我有另一个类ModelM0Holder
,它被定义为
型号_m0_holder.h:
class ModelM0Holder : public IMessageSink
{
public:
static ModelM0Holder* make(Tag a)
{
return new ModelM0Holder(a);
}
ModelM0Holder(Tag a);
~ModelM0Holder();
void process(const Message& msg);
private:
ModelM0* getModel(int line);
};
model_m0_holder.cpp:是
ModelM0Holder::ModelM0Holder(Tag a) : _a(a) { }
ModelM0Holder::~ModelM0Holder()
{
// ... some implementation
}
void ModelM0Holder::process(const Message& msg)
{
// ... some implementation
}
ModelM0* ModelM0Holder::getModel(int ag)
{
ModelM0* m;
m = m->make(_a); // Access Violation Exception.
// ...
}
当我调用ModelM0Holder::getModel
时,我得到了一个AccessViolationException
,我不能调用这个函数,为什么?
非常感谢您抽出时间。
ModelM0* m;
if (_period == tau::PERIOD_A)
m = m->makeA(_newObsTag); // Access Violation Exception.
else
m = m->makeB(_newObsTag);
您正试图取消引用未初始化的指针m
。这是一种未定义的行为。在不了解项目细节的情况下,很难判断到底应该如何修复。也许应该使用某种工厂。
当m
单元化时,不能执行m->
。这将访问一个随机内存位置(并导致转储(。
如果我正确理解了您代码的意图,您可以使makeA
和makeB
成为静态的。
class ModelM0 : public virtual Model
{
public:
. . .
static ModelM0* makeA(Tag newObsTag);
static ModelM0* makeB(Tag newObsTag);
. . .
};
然后将getModel
更改为如下所示:
ModelM0* m;
if (_period == tau::PERIOD_A)
m = ModelM0::makeA(_newObsTag);
else
m = ModelM0::makeB(_newObsTag);
相关文章:
- 写入位置0x0000000C时发生访问冲突
- 如何重构类层次结构以避免菱形问题
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- 链表中写入访问冲突的未知原因
- C++中的openCV Mat访问冲突
- 相同的层次结构,访问基类的受保护成员时的行为不同
- 模板冲突的类型-但类型应该是相同的cfr类层次结构
- 在访问类的树层次结构中的对象时避免使用 null 指针
- 尝试创建结构对象,在位置0x3FE00000中创建访问冲突写入错误
- 在类层次结构中,完美的转发构造函数和复制构造函数之间的冲突
- 写入结构变量时发生strcpy访问冲突
- 读取位置/使用结构的矢量时发生未处理的异常访问冲突
- 基于各个属性/访问器的聚合设计类层次结构
- 当函数在fread()应用于局部结构变量后返回时发生访问冲突
- 使用结构和数组而不使用指针的访问冲突
- 内存访问冲突插入结构在树结构c++
- c++结构访问冲突
- 在c++中删除多维结构会导致访问冲突
- 抽象类层次结构和访问冲突
- 在结构中使用int(*)[4]时发生访问冲突