类包含其他类问题的字段

Classes contains field of the other class issue

本文关键字:字段 其他 包含 问题      更新时间:2023-10-16

我正在尝试创建一个由两个类组成的示例,每个类都包含另一个类的字段,例如(头文件):

class Sentence{
private:
     int wordNum;
     Word words[200];
public:..
};
class Word{
private:
        char *word;
        Sentence  sentences[100];
public:..
}

当我做Word Words[200]没有定义时,类的顺序需要如何才能定义这两个类?因为它影响了公共方法
我想得到一些建议该怎么做,谢谢!

你不能。你的两个类都包含在彼此内部,这是无稽之谈。

你可能想要的是保持彼此之间的指针。即:

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

这是不可能的。一个Sentence必须包含200个Word实例,因此必须包含20000个Sentence实例;试着计算一下它的大小。

Sentence可以包含Sentence*vector<Sentence>,或者任何数量的导致其他Sentences的其他事物,但不能包含Sentences的数组。你必须修改你的设计。

你不能这样做。想想看,Sentence实例的字节大小是多少?显然,它必须至少是Word大小的200倍。那么Word的大小应该是多少?至少是Sentence大小的100倍。所以sizeof(Sentence) > sizeof(Word) > sizeof(Sentence)。你能看到这张照片怎么了吗?

您可以让Sentence容纳Word*vector<Word>,或者让Word容纳Sentence*vector<Sentence>,或者两者兼而有之。一旦你这样做了,那么转发声明,就像@McGarnagle建议的那样,就会起作用。

让我们想象一下它会编译。

您的Word有100个sentences,其中每个Sentence有200个words(此处为20000个Word s),每个sentences有100个(此处为2000000个Sentence s),各个words有200个(40000000个Words),每个。。。

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

您需要重新考虑您的结构,并且应该考虑这样的代码的用户或维护人员可能会期望什么。

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

此外:如果你没有一个项目只处理总是包含正好200个单词的句子,你可以考虑使用std::vector这样的动态记忆结构。

class Sentence
{
private:
   int wordNum;
   std::vector<Word> words;
public:
   ...
};


如果需要相对性,你当然可以自由使用指针。

如果你想要某种自动化的生命周期(如果你手头有C++11功能),你可以使用一个从句子到单词的std::shared_ptr向量。->每个包含特定单词的句子都有自己的共享ptr。如果所有带有特定单词的句子都超出了范围/被销毁,该单词也将被删除。

我仍然建议你坚持一些能让你利用RAII的东西。