I have a class B that creates an object of a class A and calls a method of the object.
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();
}
The problem is that this does not compile. It returns "no matching function to call 'A:A()'". I know that this can be solved with a forward declaration but this does not work here since I want to call the function "function". I also do not want to include the whole class A in the class B.
First in
a.cpp
update function definition:Second, I would add
A(const A&)
copy constructor since list may need this for internal buffer reallocation purposes.As with many Qt containers,
QVector
's element type must be an assignable data type in your version.Unlike the standard library, Qt defines this as:
This is really unfortunate, because there's no practical need for a default constructor in your example, and indeed a
std::vector
would (compliantly) let you use an element type that doesn't have one.The
QVector::value(int)
function does rely on this property, but you're not using it! The Qt devs must be doing some kind of checks up-front, rather than taking the standard library's approach of "just check preconditions when they're actually needed", or else this is an "accident" of the code!As a consequence, until 5.13 in which this was changed, you will have to give
A
a default constructor, sorry.Don't forget a copy constructor, too… and a proper qualification on that
A::function()
definition.A forward declaration will not solve this, neither do you need one. In fact, adding one to this particular program will do literally nothing. ;)