类包含其他类问题的字段

时间:2013-07-11 23:11:14

标签: c++ oop

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

class Sentence{

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

class Word{

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

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

4 个答案:

答案 0 :(得分:1)

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

Sentence可以包含Sentence*vector<Sentence>,或任何其他导致其他Sentences的内容,但不包含{{1}的数组}}。你必须修改你的设计。

答案 1 :(得分:1)

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

你可能想要的是互相指点。那就是:

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

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

答案 2 :(得分:0)

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

您可以Sentence暂停Word*vector<Word>,或Word暂停Sentence*vector<Sentence>,或两者兼而有之。一旦你这样做,那么按照@McGarnagle的建议,前向声明就可以了。

答案 3 :(得分:-1)

让我们假设这会编译。

Word有100 sentences,其中Sentence每个words有200 Word(此处为200 sentences),每个{100} Sentence }(2000000 words此处),每个都有200 Words(400000000 std::vector),每个都有......

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

您需要再次考虑您的结构,并且您应该考虑这些代码的用户或维护者可能期望的内容。

包含多个单词的句子 - &gt;好吧,这是合乎逻辑的 一个包含句子的单词? - &GT;为什么单词包含句子?没人会指望这种情况。

此外:如果你没有一个项目只处理总是包含 200个单词的句子你可能会考虑使用像{{1}这样的动态内存结构}}

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

<小时/> 如果需要关系性,你当然可以自由使用指针。

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

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