【问题标题】:What is "Expression must have class type"什么是“表达式必须具有类类型”
【发布时间】:2021-06-16 14:55:43
【问题描述】:

我在作为对象成员的指针上使用了 std::malloc()。并且在一个方法中,它抛出了一个错误。

[...]
class SomeClass
{
  public:
    void method()
    {
      this.ptr = std::malloc(4);
    }

    int* ptr;
}
[...]

它抛出一个错误说:

Error: Expression must have class type

我的程序有什么问题?

【问题讨论】:

    标签: c++ class pointers memory member


    【解决方案1】:

    这可能是因为this 是一个指针,并尝试使用. 访问它。 此外 malloc 返回一个 void* 所以你必须转换

    试着改写这个:

    this->ptr = static_cast<int *>(std::malloc(4));
    

    【讨论】:

    • 在 C++ 中,您需要将 malloc 投射到右侧。
    • 是的,编辑了帖子以考虑到这一点
    • 是的,我只是从互联网黑暗角落的一个粗略网站上了解到的,显然这不是其他语言中的对象......?
    • @TheSmolCodar 通常在其中被称为self,java 除外。它们是对象的引用
    【解决方案2】:

    C++ 不是 Java。你需要this-&gt; 而不是this.

    尽管在您的情况下,您可以简单地编写 ptr = (int*)std::malloc(4),因为 this-&gt; 是隐含的。

    更好的是,写ptr = new int;,因为这样你就不会对sizeof(int)做出假设。不要忘记您在某个地方也需要delete int;,并且您需要担心赋值运算符、复制构造函数和析构函数。

    对于ptr 类型使用std::unique_ptr&lt;int&gt;std::shared_ptr&lt;int&gt; 更好,因此您无需担心delete

    如果要求允许,最好使用int 作为成员类型。

    【讨论】:

      【解决方案3】:

      你至少有两个问题:

      首先,它应该是this-&gt;ptr,而不是点。

      其次,您必须将malloc() 的结果转换为您想要的指针类型。例如this-&gt;ptr = static_cast&lt;int *&gt;(malloc(4));

      您的代码也存在一些其他问题。

      1. 你必须free()你分配的指针。如果你 malloc 它,你也必须在某个地方 free 它。

      2. 您假设int 的大小为四个字节。这是不正确的。你应该使用sizeof(int)。或者至少添加一个static_assert(sizeof(int) == 4);,如果你必须假设它。

      3. 如果你使用new 来分配内存(而不是malloc)像这样:this-&gt;ptr = new int;,你同时摆脱了上面的两个问题。您不需要强制转换返回的指针,也不会假定 int 的大小始终为 4。

      4. 如果你使用new,别忘了delete指针(而不是free。)

      5. 始终将指针初始化为nullptr,并记住在释放/删除它们之后将它们设置为nullptr。这可以帮助您避免一些常见的静默错误。

      从风格上讲,您可以避免使用原始指针,而是使用std::unique_ptr&lt;int&gt; 之类的东西。但这取决于你。

      【讨论】:

      • 我们将不得不同意不同意 (5):在我看来,这样做会掩盖编写不佳的代码,这必然会出现其他控制流问题。
      • 是的,并且将指针设置为有效对象的地址或 nullptr 如果您尝试在其有效生命周期之外访问它,则会导致您的程序崩溃,从而帮助您诊断那些“控制流”问题。有什么选择?只是指向一些旧的和已释放的内存,其中可能有也可能没有另一个对象,然后默默地读取和写入这些字节?!
      【解决方案4】:

      什么奇怪的编译器会给出这样的错误信息?

      它抱怨this.ptr 表达式中点运算符的左侧。点运算符假定左侧应该是类类型,而this 是指向类类型的指针。你必须使用-&gt;

      其次,malloc返回void*,你必须转换它。避免麻烦并使用new int,除非你真的必须使用malloc。

      【讨论】:

      • 也许他根本不应该使用原始指针,但这取决于用例和他试图实现的目标
      • @RoQuOTriX 是的。在写完答案时,我记得编译器会给出这样的错误文本:Turbo-C++。在架构上,IDE 被限制为每个错误一行,因此程序员必须将它们解码为某种密码。所以我懒得推荐了。
      【解决方案5】:

      this.ptr 无效!

      this是一个指针,成员必须用指针操作符访问:

      this->ptr = static_cast<int *>(std::malloc(4));
      

      【讨论】:

        猜你喜欢
        • 2011-09-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多