C++ &引用;nullptr";在c+中通过赋值初始化类之后+;

C++ &引用;nullptr";在c+中通过赋值初始化类之后+;,c++,pointers,C++,Pointers,我构建了一个类,它存储缓冲区类型、大小和指向该缓冲区的指针。 目的是通过该指针访问缓冲区以执行所有操作。 问题是,当我将此类的一个实例分配给另一个类似的实例时: buffer=示例用法(10); 指针断了 以下是两个类(缓冲区和该缓冲区的用法): 首先,我在示例中使用的缓冲区: 类示例缓冲区{ 公众: ExampleBuffer():大小(0),缓冲区(0){} 示例缓冲区(大小){ 这个->大小=大小; 缓冲区=向量(大小); } 无效绘制(整数索引,整数值){ 缓冲区[索引]=val; }

我构建了一个类,它存储缓冲区类型、大小和指向该缓冲区的指针。 目的是通过该指针访问缓冲区以执行所有操作。
问题是,当我将此类的一个实例分配给另一个类似的实例时:

buffer=示例用法(10);
指针断了

以下是两个类(缓冲区和该缓冲区的用法):
首先,我在示例中使用的缓冲区:

类示例缓冲区{
公众:
ExampleBuffer():大小(0),缓冲区(0){}
示例缓冲区(大小){
这个->大小=大小;
缓冲区=向量(大小);
}
无效绘制(整数索引,整数值){
缓冲区[索引]=val;
}
int Get(int索引){
返回缓冲区[索引];
}
受保护的:
整数大小;
向量缓冲区;
};
接下来是我用来访问缓冲区并对其执行操作的类:

类示例用法{
公众:
示例用法():
尺寸(0),
缓冲器(0),
ptr(&缓冲区){}
示例用法(整数大小):
尺寸(尺寸),
缓冲区(大小),
ptr(&缓冲区){}
无效绘制(整数索引,整数值){
ptr->绘图(索引,val);
}
int Get(int索引){
返回ptr->Get(索引);
}
受保护的:
整数大小;
例如缓冲区;
示例缓冲区*ptr;
};
这里有一个程序来演示这个问题

class-SomeClass{
公众:
void Init(){
缓冲区=示例用法(10);
}
void DoStuff(){
缓冲区绘制(01234);
}
受保护的:
例如使用缓冲区;
};
int main(){
一些班级的例子;
Init();
例如,DoStuff();
}
当它执行时,它使用默认构造函数初始化
exampleAusage
然后在
SomeClass
Init()
方法中生成另一个实例,并分配给
buffer

然后调用方法
DoStuff()
,该方法执行缓冲区的
Draw()
方法,指针应该从那里访问存储的
ExampleBuffer
,但它指向一个null ptr,而不是导致异常

我知道如果我删除该行:

buffer=示例用法(10);
并用类似以下内容替换它:

buffer.Init(10)//用于初始化类的假设方法。
它会起作用的


为什么
exampleAusage
中的指针不指向该程序中的
ExampleBuffer

在此代码中,您同时复制向量和指针:

buffer = ExampleUsage(10);
在一天结束时,缓冲区对象有一个向量的有效副本,加上指向另一个向量最近所在的某个内存的指针

class ExampleUsage {
    // ...
    ExampleBuffer buffer; // This is a valid copy of the object
    ExampleBuffer* ptr; // Where does this ptr point after the copying?
};
这就是获得异常的原因。 有关守则的其他问题: 如果将此信息存储为vector::size(),为什么要将大小存储在外部? 为什么同时存储向量和指针(更喜欢使用指针)


考虑一个更简单的C++惯用解决方案。

为什么要千方百计让它以如此奇怪的方式工作?人们期望事情与<代码>新< /C> >或在不太常见的情况下,工厂方法,但调用大多数名为“代码> > init /CODE >的代码在大多数C++代码库中都是非常不合适的。您应该为
SomeClass
实现(并使用)构造函数,以及复制赋值、复制构造函数、移动赋值和移动构造函数。如果您的意思是
SomeClass
中的
Init
,那么它只是为了证明此时没有使用构造函数。最后替换赋值的init是为了显示错误不会发生的假设方式。这两个都没有在实现中使用。谢谢你的回答,这让我明白了。在实现中,它是一个带有宽度和高度的向量,因此会有一个宽度和高度变量,将大小保留在其中,这是一个疏忽。