Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 类静态方法,返回包含此类对象的结构_C++ - Fatal编程技术网

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应在函数定义之前包含两个标题。