什么是“表达式必须具有类类型”

问题描述

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

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

    int* ptr;
}
[...]

它抛出一个错误说:

Error: Expression must have class type

我的程序有什么问题?

解决方法

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

试试写这个:

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

您至少有两个问题:

首先,它应该是 this->ptr 而不是点。

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

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

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

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

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

  4. 如果您使用 new,请不要忘记 delete 指针(而不是 free。)

  5. 始终将您的指针初始化为 nullptr,并记住在释放/删除它们后也将它们设置为 nullptr。这有助于您避免一些常见的无提示错误。

在风格上,您可以避免使用原始指针,而是使用 std::unique_ptr<int> 之类的东西。但这取决于你。

,

C++ 不是 Java。您需要 this-> 而不是 this.

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

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

对于 std::unique_ptr<int> 类型使用 std::shared_ptr<int>ptr 更好,因此您无需担心 delete

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

,

this.ptr 无效!

this 是一个指针,必须使用指针运算符访问成员:

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

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

它抱怨 random_date.strftime("%d.%m.%Y") 表达式中点运算符的左侧。点运算符假定左侧应该是类类型,而 this.ptr 是指向类类型的指针。您必须使用 this

其次,malloc 返回 ->,您必须对其进行转换。避免麻烦并使用 void* 除非您确实必须使用 malloc。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...