Visual C ++错误C2146,C4430

时间:2014-04-20 09:35:35

标签: visual-c++

请帮助弄清楚此代码的错误。

main.cpp 创建 Object3D ,创建 Box 并将Object3D *指针传递给Box。

在我从Box中删除Object3D声明之前有错误。

的main.cpp


#include <iostream>
#include "stdafx.h"
#include "Object3D.h"


int _tmain(int argc, _TCHAR* argv[])
{
    Object3D obj;

    char c;
    std::cin >> c;
    return 0;
}

Object3D.cpp


#include "Object3D.h"
#include "Box.h"

Object3D::Object3D()
{}

Object3D::~Object3D()
{}

Object3D.h


#ifndef OBJECT3D_H
#define OBJECT3D_H
#include "Box.h"

class Object3D
{
public:
    Object3D();
    ~Object3D();
private:
    Box _box_obj;  //<<<---ERROR HERE (C2146, C4430)
};

#endif

Box.cpp


#include "Box.h"
#include "Object3D.h"

int Box::Init(Object3D* _obj)
{
    obj = _obj;
}

Box::Box()
{}

Box::~Box()
{}

Box.h


#ifndef BOX_H
#define BOX_H
#include "Object3D.h"

class Box
{
public:
    Object3D* obj;  //<<<---ERROR HERE (C2143, C4430)

    int Init(Object3D* _obj);  //<<<---ERROR HERE (C2061)

    Box();
    ~Box();
};

#endif

1 个答案:

答案 0 :(得分:0)

更改Box.h:

#ifndef BOX_H
#define BOX_H

// forward reference possible since the class is not dereferenced here.    
class Object3D;

class Box
{
public:
    Object3D* obj;

    int Init(Object3D* _obj);

    Box();
    ~Box();
};

#endif

类定义不使用Object3D的任何成员。因此,您不需要知道Object3D的定义,而只需知道它是一个类。前向引用就足够了,也是解决循环依赖的适当工具。

BTW:对象的循环引用通常包括一些拥有其他对象的“主”对象。更改成员名称以显示关系而不是类型是有意义的。我建议

Object3D* owner;

当盒子拥有对象时