C++ 查找类时出错,即使它是预定义的

C++ 查找类时出错,即使它是预定义的,c++,class,object,incomplete-type,C++,Class,Object,Incomplete Type,即使我定义了类切片存在。 当我在类Apple中调用它来创建切片对象“x”时,编译器给了我一个错误:字段x的类型不完整。 如果我交换类的顺序,使切片先被生成,错误就消失了,程序编译就没有问题了 和什么问题很相似 有但由于某些原因,预定义类对我来说并不适用 我的问题的图片,如果你需要具体的 这只是我编写的一些乱七八糟的代码,用来学习当一个对象在另一个对象中时如何改变它的状态 如果随后要声明指向不完整类型的指针或引用,而不是使用该类型的实例,则前向声明是有效的 您的Apple类正在使用Slice的完整

即使我定义了类切片存在。 当我在类Apple中调用它来创建切片对象“x”时,编译器给了我一个错误:字段x的类型不完整。 如果我交换类的顺序,使切片先被生成,错误就消失了,程序编译就没有问题了

和什么问题很相似 有但由于某些原因,预定义类对我来说并不适用

我的问题的图片,如果你需要具体的 这只是我编写的一些乱七八糟的代码,用来学习当一个对象在另一个对象中时如何改变它的状态

如果随后要声明指向不完整类型的指针或引用,而不是使用该类型的实例,则前向声明是有效的

您的Apple类正在使用Slice的完整实例,因此编译器需要知道Slice实际上是什么,以便正确地布局Apple类。由于Slice是一个不完整的类型,编译器会给出错误信息


为了解决这个问题,您可以在Apple类中声明一个指向Slice的指针或引用

您在哪里读到,当实例化一个类型时,转发声明就足够了?就像标题上的注释一样。声明和定义是不同的事情。切片类不是预定义的,而是预先声明的。不同之处在于编译器知道定义的类有多大,它是如何布局的,等等。但是从声明中,编译器只知道切片是一个类。没别的了-穴居人,哦,我现在明白了。我想我把事情弄糟了,对不起。英语不是我的母语@LightnessRacesinOrbit在任何地方都没有读过。我只是利用课堂或对象来搞清楚它们是如何工作的,因为我刚在大学里得到了第一个C++课程。除了我链接的一个对我的例子不起作用的解决方案之外,找不到/谷歌解决我的问题的方法,所以我在这里问。希望我不会打扰你们。嗯,最好是根据你在C++书中所读到的事实做出选择和决定,而不是猜测,然后当它不起作用时会表现出惊讶:POhh,这是有道理的。我猜在创建类之前,我必须阅读如何引用另一个类,当我需要使用它及其方法时。所以我不必按照特定的顺序对它们进行排序。谢谢你,保罗,你救了我在搔头的时候用谷歌搜索而秃顶。现在我有一些特定的东西要查找。@Wiking:所以我不必按特定的顺序对它们进行排序。很可能您无法避免这种情况,但这没关系。@LightnessRacesinOrbit好吧。。。听起来不祥,呵呵。所以,我提出的另一个愚蠢的问题是不礼貌的,我要为一个可能对你们来说很简单的问题做另一个主题:第一个问题是通过引用类Slice和Slice*x来解决的。但是,当我需要引用一个尚未生成的类中的函数时,我该怎么办呢?例如int getAppleSlice return x.getSlice;;其中getSlice实际上来自尚未生成的Slice类。我收到一个错误,问我是否打算使用->。@Wiking:如果您已将您的成员x从一个切片更改为一个切片*,那么您需要做一些事情。这不仅仅是改变。到->,但还要决定并实施指向对象的所有权和生存期规则。老实说,我只想保持你的代码原样,但重新排序类定义:为此引入动态分配会把事情搞得一团糟。
class Slice ;

class Apple{
  ...
  Slice x;
};

class Slice{
    ...
};