类包含其他类问题的字段
Classes contains field of the other class issue
我正在尝试创建一个由两个类组成的示例,每个类都包含另一个类的字段,例如(头文件):
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的东西。
- 将结构字段的类型展开为可变模板参数
- 将位字段导出到数组
- 为了方便起见,我应该避免公开私有字段变量吗
- 当字段可以为null时,如何使用C++接口在Avro中写入数据
- 在java中读取c++字节的位字段
- 链接器找不到在虚拟类 c++ 中访问的静态字段的符号
- 私有字段对象与私有继承?
- 声明没有默认构造函数的字段
- C++内存模型和位字段的最大序列
- 声明为无效的变量或字段'...' Ardunio 编译器上的错误
- 如何在QByteArray中放置和检索位字段而不会感到痛苦?
- 为什么最后一个推回向量的对象的字段会转移到向量的其他对象?
- 如何仅在C 中比较其他字段对
- 对C++中的字节字段使用char*或void*或其他什么
- 为结构的字段赋值,也更改其他变量
- 是否设置数组的某些字段,将其他字段设置为零
- 为什么从子类访问超类的其他示例的字段会导致该字段崩溃
- 引用其他对象作为引用类字段
- Visual Studio 忽略"其他库目录"字段
- 类包含其他类问题的字段