将另一个类的对象传递到当前类C++的构造函数中(不是成员初始化)

Passing object of another class into constructor of current class C++ (Not member initialization)

本文关键字:初始化 构造函数 成员 对象 另一个 C++      更新时间:2023-10-16

我正在尝试将Pair类的对象传递到FollowsQuery类的构造函数中,如下所示。我收到一个no default constructor exists错误。我不确定如何纠正此错误。

这是下面Pair.hPair类的定义。对象是通过静态方法创建的CreatePair

class Pair
{
public:
pair<DesignEntities, string> firstPair;
pair<DesignEntities, string> secondPair;
static Pair CreatePair(string first, string second, map<string, DesignEntities> varMap);
pair<int, int> getStatementAndPos();
pair<DesignEntities, DesignEntities> getTypes();
private:
Pair(pair<DesignEntities, string> first, pair<DesignEntities, string> second);
};

这是我的以下查询类定义文件。FollowQuery.h

class FollowsQuery : Query {
public:
FollowsQuery(Pair pair);
~FollowsQuery();
Pair pair; // for (s1,s2) in follows(s1,s2)
list<int> filterList;

void setList(list<int> filteredList); // set the curr list from the prev select
list<string> evaluate(PKB pkb);
bool isRelatedToSelect(DesignEntities designEntity); // check if design entity was from prev select
};

这是我的FollowQuery.c类文件,错误发生的地方。

FollowsQuery::FollowsQuery(Pair pair) {
this->pair = pair;
}

尽管我已经查看了stackoverflow并发现了类似的问题,但我无法找到答案,因为我想单独创建Pair类并将其传递给FollowsQuery的构造函数。

你会得到FollowsQuery类的pair成员的"不存在默认构造函数",因为编译器尝试默认构造pairPair类没有默认构造函数。

FollowsQuery构造中发生的事情基本上是这样的:

FollowsQuery::FollowsQuery(Pair pair)
// Here the `FollowsQuery::pair` member is default constructed
{
// Here you assign to the already constructed `FollowsQuery::pair` member
this->pair = pair;
}

由于Pair类没有默认构造函数(如前所述(,因此这将不起作用。

通过使用构造函数初始值设定项列表初始化(构造(成员变量来解决此问题:

FollowsQuery::FollowsQuery(Pair pair)
: pair(pair)  // Copy-construct the `FollowsQuery::pair` member
{
// Nothing needed here, the `FollowsQuery::pair` member is already initialized
}