C++;-不完整的类类型? 我最近一直在用C和java工作,所以我有点困惑,回到C++为什么不允许这样做。p>

C++;-不完整的类类型? 我最近一直在用C和java工作,所以我有点困惑,回到C++为什么不允许这样做。p>,c++,class,object,C++,Class,Object,不允许不完整的类型 #pragma once class Expression { private: Expression power; // <--- incomplete type is not allowed }; #pragma一次 类表达式 { 私人: Expression power;//如果你把一个类的实例放在它自己的内部,如果你注意到,你正在创建递归,因为每个实例都有自己的Expression power,而且这种情况会一直持续下去。如果你有一个指针,你可以控制

不允许不完整的类型

#pragma once

class Expression
{
private:
    Expression power; // <--- incomplete type is not allowed
};
#pragma一次
类表达式
{
私人:

Expression power;//如果你把一个类的实例放在它自己的内部,如果你注意到,你正在创建递归,因为每个实例都有自己的
Expression power
,而且这种情况会一直持续下去。如果你有一个指针,你可以控制这个无限递归,因为你可以随时将
power
设置为
nullptr
,(或
NULL/0
,在C++11之前),以结束递归。

您不能将类本身嵌入。请三思:这会导致无限递归。请使用指针,最好使用智能指针。除了无限递归问题外,您不能使用不完整的类型来定义类的成员,因为编译器不知道在类实例中为此保留多少空间成员。因为类型不完整,它还不能知道类有多大。重新考虑一下你的设计,没有真正的问题需要这个解决方案。我认为OP想要做一些类似于pimpl习惯用法的事情,尽管这是一种糟糕的方式。@hatefind“然后我将不得不使用
malloc
calloc
”天哪!不需要!你需要代码<新的< /代码>和<代码>删除<代码>,但是如上面提到的,使用“代码> STD::UnjyQupTrp/代码>,这将释放你做你自己的。我想知道,为什么这样的线在java中工作完全可以,但是C++中会引起这么多问题?同样的事情会在爪哇发生。,正如您在这里看到的:唯一的区别是编译器永远不会知道是,但用户正在执行
animalobject1=newanimal()在
Animal
类的声明中,我在这里基本上输入
Animal object1;
而没有初始化它。这是我没有得到的。这个链接的重点是区分。链接中的代码会导致递归,但在您的情况下,代码是好的,因为ctor不是为c调用的姑娘,几乎像一个女人pointer@Hatefiend为了更精确地回答,在java中,你总是声明类(类)的引用(指针),而不是值。C++中,你也可以这样做,并且引用或指针被显式地注释。