我面临在参数中传递对象指针的问题。(这是编译器错误) 我有一个2类,为简单起见,我创建了第一类和第二类。
one.h
#pragma once
#include "two.h"
class one
{
private:
two* t;
public:
one();
};
one.cpp
#include "one.h"
one::one()
{ t = new two(this);//error: No matching constructor for initialization of 'two' }
two.h
#pragma once
#include "one.h"
class two
{
public:
explicit two(one*);
};
two.cpp
#include "two.h"
two::two(one*o)
{ }
答案 0 :(得分:1)
在您的.h
文件中,为其他类添加前向声明。当您具有彼此包含的标头时,实际上不会获得包含,否则它们将扩展为无限地相互包含。
因此,在one.h
中,您将拥有:
#pragma once
class two; // removed include, added forward declaration
class one
{
private:
two* t;
public:
one();
};
然后实际上在one.cpp
中进行包含,您需要完整的两个定义
#include "one.h"
#include "two.h" // added this include
one::one()
{ t = new two(this);}
答案 1 :(得分:0)
最好不要互相包含两个标头,
您可以在两个小时内将#include "one.h"
更改为class one;
之类的定义。
彼此包含两个标头,会使编译器感到困惑,并产生许多奇怪的错误。
#include
表示在其中扩展完整的头文件。
和#pragma once
仅使头文件扩展一次,您可以尝试将one.h的全部内容复制到#include "one.h"
所在的位置,然后会发现问题。
例如,在one.cpp中,扩展头文件后,该文件如下所示:
class two
{
public:
explicit two(one*);
};
class one
{
private:
two* t;
public:
one();
};
one::one()
{
t = new two(this);
}
由于在第二类之前没有对第一类的声明或定义,因此未正确声明第二类的构造函数,因此会发生错误。