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.
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:
The values stored in the various containers can be of any assignable data type. To qualify, a type must provide a default constructor, a copy constructor, and an assignment operator.
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. ;)
First in a.cpp
update function definition:
void A::function(){ // A: added
//Do something.
}
Second, I would add A(const A&)
copy constructor since list may need this for internal buffer reallocation purposes.