C++ 如何在C++;

C++ 如何在C++;,c++,polymorphism,circular-dependency,incomplete-type,C++,Polymorphism,Circular Dependency,Incomplete Type,我已经关注stackoverflow和google有一段时间了,但我似乎找不到关于循环引用、不完整类型和多态性的具体问题的答案 我希望我可以解释这个问题,而不必发布很多代码,但如果我失败了,请让我知道,我将尝试写下一个简单的例子 我有两个类,它们都互相使用(比如说COne类和CTwo类)。另外,类COne有一个基类(比如BaseOne) 我使用头保护(如果你这样称呼它们)和不完整类型来“解决”循环依赖性问题 在顶部的头文件中: #pragma once 和C++文件顶部的某个地方,用于C2:

我已经关注stackoverflow和google有一段时间了,但我似乎找不到关于循环引用、不完整类型和多态性的具体问题的答案

我希望我可以解释这个问题,而不必发布很多代码,但如果我失败了,请让我知道,我将尝试写下一个简单的例子

我有两个类,它们都互相使用(比如说COne类和CTwo类)。另外,类COne有一个基类(比如BaseOne)

我使用头保护(如果你这样称呼它们)和不完整类型来“解决”循环依赖性问题

在顶部的头文件中:

#pragma once
和C++文件顶部的某个地方,用于C2: < /P>
class COne;
现在我遇到的问题是,由于类型不完整,编译器似乎不知道COne是从BaseOne派生的。 所以在一个返回类型为BaseOne*的函数中,我想返回一个COne*,这应该是可能的,因为它是一个downcast,但它说它们不是同一类型的。 我现在已经用C型石膏修复了这个问题

return (BaseOne*)m_c_one;

我想问的是:有没有比使用C样式转换更好的方法来解决这个问题?

C样式转换是不安全的,因为不能保证
COne
对象及其
BaseOne
子对象具有相同的内存地址(如果
COne
是标准布局类(9p7),则可以保证),但这通常排除了多态性)

编译器需要
COne
完成才能执行强制转换(3.2p5),因为
COne
可以使用虚拟继承或多重继承,而且一般来说,多态类不需要有简单的内存布局

struct COne: BaseZero, BaseOne { ... };
struct COne: virtual BaseOne { ... };

您必须将强制转换移动到源文件中有
COne
定义的点,或者将自己的强制转换函数
BaseOne*写入_base(COne*)
在源文件中的某个点上实现,其中
COne
的定义可用。

将您的成员函数定义放在单独的.cpp文件中。但是一个.cpp并不意味着一个类。您可以将两个类中的成员放在一个.cpp文件中,该文件包含包含类声明和编译的头文件。这将解决大多数问题。您是否有
return(BaseOne*)m_c_one在头文件中?如果您的返回是在cpp文件中,那么整个头文件应该已经被读取了,所以编译器应该知道,COne来自BaseOne。谢谢您的建议。实际上,通常我将所有成员函数都放在cpp文件中,但因为它只是一行get函数,所以我将其直接放在类声明中。现在我知道怎么修了。