c++ - C++中的指针赋值

标签 c++ pointers

我有一个简单的结构来容纳两个 const double

struct Scale {
    const double SCALE_X, SCALE_Y;

    Scale(double, double);
};

Scale::Scale(double sx, double sy) :
SCALE_X(sx), SCALE_Y(sy) {
}

我有这个函数返回一个 bool 值作为确认,并将传递的 oscale 指针设置为在内部找到的任何计算值。

bool FindSequence(Scale* oscale) {
    // ...
    *oscale = Scale(sx, sy);
    // ...
    return true;
}

正在使用中:

Scale *scale;
if (FindSequence(scale)) {
    std::cout << "Yes" << std::endl;
}

编译日志:

photon.cpp:286:14: error: use of deleted function 'photon::Scale& photon::Scale::operator=(photon::Scale&&)'
      *oscale = Scale(sx, sy);
              ^
In file included from photon.h:5:0,
                 from photon.cpp:4:
globals.h:76:9: note: 'photon::Scale& photon::Scale::operator=(photon::Scale&&)' is implicitly deleted because the default definition would be ill-formed:
  struct Scale {
         ^
globals.h:76:9: error: non-static const member 'const double photon::Scale::SCALE_X', can't use default assignment operator
globals.h:76:9: error: non-static const member 'const double photon::Scale::SCALE_Y', can't use default assignment operator

我必须重写 operator= 吗?是因为 Scale 结构是不可变的吗?我做错了什么?

最佳答案

这里有几个问题。我将一一介绍。

const double SCALE_X, SCALE_Y;

这是您问题的主要来源。如果类有 const 成员,编译器将不会生成复制构造函数或复制赋值运算符;你必须自己生成它们。

但是,我认为这些成员甚至不应该是 const。如果某人有一个 Scale 对象,那么他们应该能够更改它的值,但如果他们有一个 const Scale 对象,那么他们不会能够,因为所有(非可变)数据成员在const对象上访问时“变成”const

换句话说,让类的消费者决定他们是否希望实例是只读的;非const Scale 对象应该是可变的!

通过这一更改,编译器将能够生成健全的复制构造函数和健全的复制赋值运算符,从而消除特定错误。

但是,你这里确实有另一个错误:

Scale *scale;
if (FindSequence(scale)) {

您正在传递一个未初始化的指针。一旦 FindSequence() 取消引用该指针,就会调用未定义的行为,您的程序可能会崩溃。

通常您会使用引用来执行此操作:

bool FindSequence(Scale & oscale) {

然后调用代码变成这样(只需删除*):

Scale scale;
if (FindSequence(scale)) {

但是要执行这个,您将需要一个默认构造函数。一个明智的选择是让它将成员初始化为零:

Scale::Scale() : SCALE_X(0), SCALE_Y(0) { }

(或者,您可以只执行 Scale scale(0, 0);。)

应用这三个更改,编译器应该可以解决这些问题。 (当然,它可能会遇到其他问题,但这些更改将解决您问题中的问题。)

关于c++ - C++中的指针赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27351915/

相关文章:

c++ - 全屏模式下的Allegro颜色变化

c++ - 编译器在这里生成的汇编代码中的寻址模式是什么?

c++ - VC++ : Pass multiple arrays between functions

c - 返回结构实例的函数

c - 指向 C 中结构表的指针

C# 对象有效

c++ - 我是否遗漏了 Evil Hangman 的构造函数?

c++ - 使用 SFINAE 检查模板参数继承

c++ - 调查 visual studio 程序集输出

c++ - 类(class) build 的额外拷贝