C++ 类包含其他类问题的字段

C++ 类包含其他类问题的字段,c++,oop,C++,Oop,我试图创建一个包含两个类的示例,每个类包含另一个类的字段,例如(头文件): 当我在做单词[200]未定义时,类的顺序应该是如何定义这两个类的?因为它影响公共方法。 我想得到一些建议做什么,谢谢 这是不可能的。一个句子必须包含200个单词,因此必须包含20000个句子;试着计算一下它的大小 一个句子可以包含一个句子*,或者一个向量,或者导致其他句子,但不能包含一系列句子。你必须修改你的设计。你不能。您的两个类都包含在彼此内部,这是胡说八道 您可能想要的是保持指向彼此的指针。即: class Sen

我试图创建一个包含两个类的示例,每个类包含另一个类的字段,例如(头文件):

当我在做单词[200]未定义时,类的顺序应该是如何定义这两个类的?因为它影响公共方法。

我想得到一些建议做什么,谢谢

这是不可能的。一个
句子
必须包含200个
单词
,因此必须包含20000个
句子
;试着计算一下它的大小


一个
句子
可以包含一个
句子*
,或者一个
向量
,或者导致其他
句子
,但不能包含一系列
句子
。你必须修改你的设计。

你不能。您的两个类都包含在彼此内部,这是胡说八道

您可能想要的是保持指向彼此的指针。即:

class Sentence
    ...
    Word* words[200];
    ...
};

class Word {
    ...
    Sentence* sentences[100];
    ...
};

你不能这样做。想想看,
句子
实例的字节大小是多少?显然,它必须至少是
Word
大小的200倍。那么
Word
的大小应该是多少?至少是句子大小的100倍。所以
sizeof(句子)>sizeof(单词)>sizeof(句子)
。你能看出这幅画有什么毛病吗


您可以让
句子
保留
单词*
向量
,或者让
单词
保留
句子*
向量
,或者两者兼而有之。一旦您这样做了,那么@McGarnagle建议的转发声明就可以工作了。

让我们想象一下这将编译

你的
Word
有100个
句子
,其中每个
句子
有200个
单词
(这里是20000个
单词
),每个
句子都有100个
(这里是2000000个
句子
),每个
句子都有200个
单词
(400000000
单词

我想我可以到此为止。你可能会意识到这不是你想要的

您需要重新考虑您的结构,并且应该考虑此类代码的用户或维护人员可能期望的内容

一个包含几个单词的句子->好的,这是合乎逻辑的。
包含句子的单词?->为什么一个词应该包含句子?没有人会想到会是这样

此外:如果你没有一个只处理完全包含200个单词的句子的项目,你可以考虑使用一个动态的内存结构,比如<代码> STD::向量< /代码>。

class Sentence
{
private:
   int wordNum;
   std::vector<Word> words;
public:
   ...
};
类语句
{
私人:
int-wordNum;
向量词;
公众:
...
};

如果需要关系,你当然可以自由使用指针

如果您想要某种类型的自动生存期(如果您手头有C++11功能),例如,您可以使用
std::shared\u ptr
从句子到单词的向量。->每个包含特定单词的句子都有自己的共享ptr到该单词对象。如果所有带有特定单词的句子都超出范围/被销毁,该单词也将被删除


我仍然建议您坚持使用RAII。

再考虑一下这个问题。它就像
struct X{X;}
。换句话说,一个包含它自己的盒子的内容是什么?唯一“修复”的方法是重新考虑你的层次结构。它可以编译,但它会带来一系列问题以及内存处理。我不想冒犯任何人,但我认为这不是一个好的建议。除了“我尝试了这个,它没有编译”之外,我们对这个问题一无所知。我可以继续指出,你提出的答案在逻辑上是有缺陷的,因为你的向量将保存对象的副本,而不是引用,这可能是你的本意。对于一些甚至没有具体说明或询问的事情,没有必要迂腐。我也没有否决你的答案,梅的评论也没有迂腐或无礼。除了这个问题,OP“特别指出”他大概是个初学者。请停止抱怨!在我的示例中,启用关系是引入单个
*
(或共享的\u ptr或任何合适的东西)。。。数组和指针组合的整洁处理很难实现。即使某个解决方案可能是OP“要求”的解决方案,也没有必要不暗示它可能存在的问题。(有可能这是最合适的,但我认为这不太可能。)一个词可能包含对共享它的句子的引用;在这种情况下,让句子包含他们自己的单词是错误的,因为他们没有分享单词。你看,我也可以很迂腐。我想OP可能比你更了解他想要实现的目标的相关性,他的例子中有一些句子能表达他们的意思,所以我没有偏离我的解决方案。但是,是的,这可能仍然不是奥普注定要做的。
class Sentence
{
private:
   int wordNum;
   std::vector<Word> words;
public:
   ...
};