【问题标题】:What is wrong in the following snippet?以下代码段有什么问题?
【发布时间】:2017-02-17 11:57:07
【问题描述】:

我知道这是一个相当基本的违规行为,但它是什么?

class xyz
{
    void function1()
    {
        cout<<"in class";
    }
};

int main()
{
    xyz s1 = new xyz(100);
    xyz s2 = s1;
    s2.function1();
    delete s1;
    return 0;
}

使用new 的内存分配有问题。我相信,但我似乎无法理解其背后的基本原理和解决方案。

【问题讨论】:

  • 你忘记了类型定义中的星号*
  • 是否编译
  • 接受整数的构造函数在哪里

标签: c++ class compiler-errors code-snippets object-oriented-analysis


【解决方案1】:

您不能将T* 分配给T(病理情况除外)。

xyz * s1 = new xyz();
xyz * s2 = s1;
s2->function1();
delete s1;
return 0;

更好的是,不要使用裸 newdelete 并使用智能指针:

auto s1 = make_unique<xyz>();
xyz * s2 = s1.get(); // non-owning pointer
s2->function1();
// no explicit delete necessary

【讨论】:

  • 什么是“病态”病例?
  • 一个类 T 定义来自 T* 的构造函数。我在生产代码中看到过这样的:(
  • 哇,我从来没想过:)
  • 接受整数的构造函数在哪里
  • 没有,我只是复制了100的代码。已编辑。
【解决方案2】:

new 返回一个指向对象的指针 (xyz *),而不是对象,因此您应该更正 s1 的类型:

xyz* s1=new xyz(100);

要通过指针调用方法,你应该使用操作符-&gt;:

s1->function1();

这相当于取消引用指针并调用对象上的方法:

(*s1).function1();

【讨论】:

  • “你可以”应该是“你有”
  • @Rakete1111,好吧,或者你可以使用 (*s1).function();但是,是的,重新措辞以消除可能的歧义,谢谢 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-10
  • 2011-02-28
相关资源
最近更新 更多