Reputation: 15
This is a question earlier asked by me. I'm getting compilation errors using the copy constructor suggested by the forum.
class A
{
private:
int a;
int b;
public:
A() { a = 0; b = 0; }
int getA() { return a; }
int getB() { return b; }
A(const Beta& b) :a{ *b.X() }, b{ *b.Y } {}
};
class Beta
{
private:
int *x;
int *y;
public:
Beta(int a, int b) { x =&a; y = &b; }
int* X() { return x; }
int* Y() { return y; }
};
int main()
{
B aObject;
Alpha a1 = aBObject;
Alpha a2;
a2 = aBObject;
return 0;
}
Without const Alpha(Beta& be) in the copy constructor argument
Error C2061 syntax error: identifier 'Beta'
Error C2228 left of '.getY' must have class/struct/union
Error C2228 left of '.getX' must have class/struct/union
Error C2679 binary '=': no operator found which takes a right-hand operand of type 'Beta' (or there is no acceptable conversion)
Error C2440 'initializing': cannot convert from 'Beta' to 'Alpha'
Error C2065 'be': undeclared identifier
Error C2535 'Alpha::Alpha(void)': member function already defined or declared
With const Alpha(const Beta& be) in the copy constructor argument
Error (active) the object has type qualifiers that are not compatible with the member function "Beta::getX"
Error (active) the object has type qualifiers that are not compatible with the member function "Beta::getY"
Error C2061 syntax error: identifier 'Beta'
Error C2228 left of '.getY' must have class/struct/union
Error C2228 left of '.getX' must have class/struct/union
Error C2679 binary '=': no operator found which takes a right-hand operand of type 'Beta' (or there is no acceptable conversion)
Error C2440 'initializing': cannot convert from 'Beta' to 'Alpha'
Error C2065 'be': undeclared identifier
Error C2535 'Alpha::Alpha(void)': member function already defined or declared
Upvotes: 0
Views: 159
Reputation: 87959
There are no copy constructors (or assignment operators) in your code. But anyway that's not the issue. They issue that your code for Alpha
uses Beta
before Beta
has been defined. That's what the compiler is complaining about, it doesn't recognise Beta
at the point you first use it.
Just move Beta
so it's definition is before Alpha
and everything will compile.
Upvotes: 0
Reputation: 162
Is this what you want?
class Beta
{
private:
int *x;
int *y;
public:
Beta() { x = nullptr; y = nullptr; }
int* getX() { return x; }
int* getY() { return y; }
};
class Alpha
{
private:
int a;
int b;
public:
Alpha() { a = 0; b = 0; }
int getA() { return a; }
int getB() { return b; }
Alpha( Beta& be) :a{ *be.getX() }, b{ *be.getY() } {}
//It is not copy Constructor. You can't pass const reference here because getX getY returns pointer. So it could break const contract
};
int main()
{
Beta aBetaObject;
Alpha a1 = aBetaObject;
Alpha a2;
a2 = aBetaObject;
return 0;
}
Upvotes: 1