将指针传递给对象时,没有匹配的构造函数初始化问题

时间:2019-03-18 01:44:58

标签: c++

我面临在参数中传递对象指针的问题。(这是编译器错误) 我有一个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)
{ }

2 个答案:

答案 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);
}

由于在第二类之前没有对第一类的声明或定义,因此未正确声明第二类的构造函数,因此会发生错误。