C++ 如何定义在头文件中具有继承性的结构?

C++ 如何定义在头文件中具有继承性的结构?,c++,struct,header,C++,Struct,Header,我的cpp文件中有一个包含冒号定义的结构: struct GeomMeshLoader: VRayStaticGeomSource, VRaySceneModifierInterface { <definitions> } 然后,在编译另一个cpp文件(包括此头文件)期间,我将获得: allocation of incomplete type 'GeomMeshLoader' 如果我像这样声明标题: struct GeomMeshLoader: VRayStaticGeom

我的cpp文件中有一个包含冒号定义的结构:

struct GeomMeshLoader: VRayStaticGeomSource, VRaySceneModifierInterface
{
   <definitions>
}
然后,在编译另一个cpp文件(包括此头文件)期间,我将获得:

allocation of incomplete type 'GeomMeshLoader'
如果我像这样声明标题:

struct GeomMeshLoader: VRayStaticGeomSource, VRaySceneModifierInterface;
然后,它将在以下情况下编译失败:

error: expected '{' after base class list
将包含冒号的headers结构定义放入其中的方法是什么

allocation of incomplete type 'GeomMeshLoader'
意味着您有一些代码试图以某种方式使用该类型,需要查看完整定义(即,不只是持有指针或引用)。如果不能计算出对象的大小,它如何分配该类型的对象?它需要查看整个类:所有基类,所有成员数据

您需要将整个类定义放在标题中。您不能在
.cpp
中进行转发声明和定义

任何成员函数(但不是成员函数模板)的定义仍可以在
.cpp
中。这些成员函数的声明必须放在类定义中(在标题中)

因此:

意味着您有一些代码试图以某种方式使用该类型,需要查看完整定义(即,不只是持有指针或引用)。如果不能计算出对象的大小,它如何分配该类型的对象?它需要查看整个类:所有基类,所有成员数据

您需要将整个类定义放在标题中。您不能在
.cpp
中进行转发声明和定义

任何成员函数(但不是成员函数模板)的定义仍可以在
.cpp
中。这些成员函数的声明必须放在类定义中(在标题中)

因此:


谢谢,但是当我将整个结构定义放在标题中(包含在多个cpp中)时,链接时会出现重复的对象错误。我怎样才能防止这种情况发生?停止将您的定义多次复制到单个翻译单元中(即在一个
.cpp
文件中多次看到)。谢谢,但当我将整个结构定义放在标题中(包含在多个cpp中)时,链接时会出现重复对象错误。我怎样才能防止这种情况发生?停止将定义多次复制到单个翻译单元中(即在一个
.cpp
文件中多次看到)。冒号定义?哥们,这叫继承冒号定义?哥们,这叫遗产
allocation of incomplete type 'GeomMeshLoader'
// geomeshloader.h
#ifndef INCLUDED_GEOMESHLOADER_H // Don't forget your header guards
#define INCLUDED_GEOMESHLOADER_H
struct GeomMeshLoader: VRayStaticGeomSource, VRaySceneModifierInterface {
    int i_;
    void foo() const;
};
#endif
// geomeshloader.cpp
#include "geomeshloader.h"
void GeoMeshLoader::foo() const
{
    // do stuff
}