我有一个B类,它创建A类的对象并调用该对象的方法。
a.h
#ifndef A_H
#define A_H
class A
{
public:
A(int);
void function();
};
#endif // A_H
a.cpp
#include "a.h"
A::A(int x)
{
}
void A::function(){
//Do something.
}
b.h
#ifndef B_H
#define B_H
#include <QVector>
#include <a.h>
class B
{
public:
B(int);
QVector<A> list;
};
#endif // B_H
b.cpp
#include "b.h"
B::B(int y)
{
list.append(A(y));
list[0].function();
}
问题是这无法编译。它返回“没有匹配的函数来调用'A:A()'”。我知道可以使用前向声明解决此问题,但这在这里不起作用,因为我想将函数称为“函数”。我也不想将整个A类都包括在B类中。
答案 0 :(得分:8)
与许多Qt容器一样,您的版本中为QVector
's element type must be an assignable data type。
不同于标准库Qt defines this as:
存储在各个容器中的值可以是任何可分配的数据类型。要获得资格,类型必须提供默认的构造函数,副本构造函数和赋值运算符。
这真的很不幸,因为there's no practical need for a default constructor in your example和std::vector
的确可以(合规地)让您使用没有一个的元素类型。
QVector::value(int)
函数确实依赖此属性,但是您没有使用它! Qt开发人员必须预先进行某种检查,而不是采用标准库的方法“仅在实际需要时检查先决条件”,否则这是代码的“意外”!
因此,until 5.13 in which this was changed,您将不得不给A
一个默认的构造函数,抱歉。
也不要忘记复制构造函数……以及对该A::function()
定义的适当限定。
前向声明不能解决这个问题,您也不需要一个。实际上,在此特定程序中添加一个实际上不会执行任何操作。 ;)
答案 1 :(得分:0)
a.cpp
中的第一个更新函数定义:
void A::function(){ // A: added
//Do something.
}
第二,我将添加A(const A&)
复制构造函数,因为list可能出于内部缓冲区重新分配目的而需要它。