C++ 类静态方法,返回包含此类对象的结构
我有一门课:C++ 类静态方法,返回包含此类对象的结构,c++,C++,我有一门课: class SOMECLASS { public: (...) static SOMESTRUCT GetInfo(); }; 和一个结构: struct SOMESTRUCT { (...) SOMECLASS Instance; }; 它们在SOMESTRUCT.h和SOMECLASS.h中声明 #ifndef SOMECLASS_H #DEFINE SOMECLASS_H class SOMECLASS {
class SOMECLASS
{
public:
(...)
static SOMESTRUCT GetInfo();
};
和一个结构:
struct SOMESTRUCT
{
(...)
SOMECLASS Instance;
};
它们在SOMESTRUCT.h和SOMECLASS.h中声明
#ifndef SOMECLASS_H
#DEFINE SOMECLASS_H
class SOMECLASS
{
public:
(...)
static struct SOMESTRUCT GetInfo();
};
#endif // SOMECLASS_H
我无法编译它,即使有转发声明。
我仍然得到:
error: field ‘Instance’ has incomplete type
我如何解决这个问题?试试下面的方法
某个班级
#ifndef SOMECLASS_H
#DEFINE SOMECLASS_H
class SOMECLASS
{
public:
(...)
static struct SOMESTRUCT GetInfo();
};
#endif // SOMECLASS_H
SOMESTRUCT,h
#ifndef SOMESTRUCT_H
#DEFINE SOMESTRUCT_H
#include "SOMECLASS.h"
struct SOMESTRUCT
{
(...)
SOMECLASS Instance;
};
#endif // SOMESTRUCT_H
如果用户包含SOMESTRUCT.h,上面给出的答案将是正确的。 如果用户这样做
#include "SOMECLASS.h"
int main()
{
SOMECLASS::GetInfo();
}
同样的错误也会发生
原因是编译器必须知道返回变量的完整定义;否则,当函数返回时,它无法知道如何构造它
当包含SOMECLASS.h时,编译器只知道标识符SOMESTRUCT是sturct。如果用户调用SOMECLASS::GetInfo,函数必须构造一个SOMESTRUCT,因此必须在同一文件中该行之前给出该结构的完整定义
为了解决这个问题,在SOMECLASS.h中包含SOMESTRUCT.h更为合理,因此用户可以确保调用类中的任何函数都不会导致编译错误,只要它们包含头。
还应该在SOMESTRUCT.h中向前声明类SOMECLASS
如果有只使用SOMESTRUCT.h的情况,那么SOMECLASS.h也应该包含在SOMESTRUCT.h中,因为构造SOMESTRUCT需要SOMECLASS.h的定义。
可以通过将实例变量声明为SOMECLASS&或SOMECLASS*而不是SOMECLASS来避免这种情况
如果您真的不想公开SOMESTRUCT的详细定义,可以尝试以下方法
使用虚拟访问器定义IInfo接口类,以从SOMESTRUCT获取信息
使用pimpl成语
通过这些方法,您不必在SOMECLASS.h中包含SOMESTRUCT.h。SOMECLASS不需要完整的类型,因此使用SOMESTRUCT的前向声明。SOMESTRUCT需要一个完整的类型,所以让SOMECLASS的定义可用。这与使用pragma一次相同吗?@peku33 pragma once不是标准功能。尽管如此,如果编译器提供了它,那么您可以使用它。它是gcc版本4.7.2 Debian 4.7.2-5,我得到以下错误:Classes/SOMECLASS.cpp:27:84:错误:返回类型“struct SOMESTRUCT”为incomplete@peku33模块SOMECLASS.cpp应在函数定义之前包含两个标题。