0

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

class Sentence{

private:
     int wordNum;
     Word words[200];
public:..
};

class Word{

private:
        char *word;
        Sentence  sentences[100];
public:..
}

当我在做未定义的 Word Words[200] 时,类的顺序需要如何定义两个类?因为它会影响公共方法。
想请教一下怎么办,谢谢!

4

4 回答 4

1

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

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

于 2013-07-11T23:18:19.873 回答
1

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

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

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

class Word {
    ...
    Sentence* sentences[100];
    ...
};
于 2013-07-11T23:19:32.047 回答
0

你不能这样做。想一想——Sentence实例的字节大小是多少?显然,它必须至少是 的 200 倍Word。那么尺寸应该Word是多少呢?至少是 100 倍的大小Sentence。所以sizeof(Sentence) > sizeof(Word) > sizeof(Sentence)。你能看出这张照片有什么问题吗?

您可以Sentence持有 a Word*or vector<Word>,或Word持有Sentence*or vector<Sentence>,或两者兼而有之。一旦你这样做了,那么正如@McGarnagle 所建议的那样,前向声明将起作用。

于 2013-07-11T23:25:58.287 回答
-1

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

Word有 100 个sentences,每个Sentence有 200 个words(这里是 20000Word秒),每个有 100 个sentences(这里是 2000000Sentence秒),每个有 200 个words(400000000 Words),每个......

我想我可以在这里停下来。你可能会意识到这不是你想要的。

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

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

此外:如果您没有一个只处理始终包含200个单词的句子的项目,您可以考虑使用动态记忆结构,例如std::vector.

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


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

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

我仍然建议坚持使您能够使用 RAII 的东西。

于 2013-07-11T23:29:43.990 回答