"无效使用不完整类型"。解决循环依赖关系

时间:2017-08-23 19:14:46

标签: c++ circular-dependency incomplete-type

我是C ++的新手,我一直在尝试其他问题的不同建议,但我不能让我的代码有效。

我有一个班级" PChar"和另一个班级"行动"。一个Action有两个PChar成员和一个PChar方法(" act()")必须能够创建一个Action对象。所以在尝试了不同的东西后,我得到了这段代码:

" action.h":

#ifndef ACTION_H
#define ACTION_H

class PChar;

class Action
{
    PChar *subject, *object;
public:
    Action();
    Action(PChar& p1, PChar& p2);
};


#endif

" action.cpp":

#include "action.h"

Action::Action(){};

Action::Action(PChar& p1,PChar& p2)
{
    *subject=p1;
    *object=p2;
};

" character.h"

#ifndef CHARACTER_H
#define CHARACTER_H

#include <string>

#include "action.h"

class PChar
{
public:
    std::string name;

    PChar();

    PChar(std::string input_name);

    void act(PChar& target, Action &action);
};
#endif    

&#34; character.cpp&#34;

#include "character.h"

PChar::PChar(){}

PChar::PChar(std::string input_name)
{
    name=input_name;
}

void PChar::act(PChar& target, Action& action)
{
    action=Action(*this, target);
}

&#34;的main.cpp&#34;

#include "action.h"
#include "character.h"

int main()
{
    PChar char1("Joe");
    PChar char2("Matt");
    Action handshake;
    char1.act(char2, handshake);
}

目标是创建一个对象&#34;握手&#34;它有两个字符作为成员。编译时我得到错误:

action.cpp:7:10: error: invalid use of incomplete type ‘class PChar’
  *subject=p1;
          ^
In file included from action.cpp:1:0:
action.h:4:7: note: forward declaration of ‘class PChar’
 class PChar;
       ^
action.cpp:8:9: error: invalid use of incomplete type ‘class PChar’
  *object=p2;
         ^
In file included from action.cpp:1:0:
action.h:4:7: note: forward declaration of ‘class PChar’
 class PChar;
       ^

这是一个大项目的一部分,这就是为什么文件结构如此,我只是简化了代码来重现错误。我尝试过其他类似问题的解决方案,但它们似乎不起作用。欢迎任何帮助或提示。谢谢!

2 个答案:

答案 0 :(得分:1)

C ++需要知道能够编译和赋值操作的类型的细节。

解决方案是在"Character.h"中加入"Action.cpp"

答案 1 :(得分:0)

您可以转发声明类型以声明指针或引用它。但是当您开始使用该类型(将其声明为值或分配给它或调用方法)时,必须定义它。在character.h中包含action.cpp可以解决编译错误。请注意,您的ctor中有UB:

Action::Action(PChar& p1,PChar& p2)
{
    *subject=p1;
    *object=p2;
}

当您取消引用未初始化的指针时。你需要让它们指向某个地方,可能你的意思是分配动态内存。在这种情况下,std::unique_ptr会优先考虑Rule of 3/5/0

的问题
class Action
{
    std::unique_ptr<PChar> subject, object;
public:
    ...
};

Action::Action(const PChar& p1, const PChar& p2) :
    subject( new PChar(p1) ), object( new PChar(p2) )
{
}

当您无意修改对象时,最好将其作为const引用传递。