我试图创建一个2个类的示例,每个类包含另一个类的字段,例如(头文件):
class Sentence{
private:
int wordNum;
Word words[200];
public:..
};
class Word{
private:
char *word;
Sentence sentences[100];
public:..
}
当我没有定义Word Words [200]时,类的顺序如何定义两个类?因为它影响公共方法 我想得到一些建议,谢谢!
答案 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的东西。