friend classes

S

Srini nandiraju

Hi folks,

I am trying to implement a friend class and the following is what I did.
Please scroll down.

/***************** CODE **********************************/
class BKP
{
private:
int nVar;
vector<int> p;
vector<int> w;
int b;

public:

BKP();
BKP(ifstream &in);
~BKP();

friend ostream &operator<<( ostream &_os, BKP& _bkp);

};

ostream& operator <<( ostream& _os, BKP& _bkp)
{

for ( int i =0; i <_bkp.nVar ; i++)
{
_os << _bkp.p.at(i) << " " << _bkp.w.at(i) << endl;
}
_os << _bkp.b <<endl;

return _os;
}


I tried to compile in MSVC++ 6.0 and I get the following errors:

error C2248: 'nVar' : cannot access private member declared in class 'BKP'
error C2248: 'p' : cannot access private member declared in class 'BKP'
error C2248: 'w' : cannot access private member declared in class 'BKP'
error C2248: 'b': cannot access private member declared in class 'BKP'

I can't figure this. A friend function is supposed to access the private
members is what I read. Please clarify. thanx for ur time.

srini.
 
R

Rob Williscroft

Srini nandiraju wrote in @posting.google.com in comp.lang.c++:
I tried to compile in MSVC++ 6.0 and I get the following errors:

MSVC++ 6.0 is your problem, upgrade your compiler. MSVC 7.1 is the
current version if you can live without the IDE its a free download.

Rob.
 
D

David White

Srini nandiraju said:
Hi folks,

I am trying to implement a friend class and the following is what I did.
Please scroll down.

/***************** CODE **********************************/
class BKP
{
private:
int nVar;
vector<int> p;
vector<int> w;
int b;

public:

BKP();
BKP(ifstream &in);
~BKP();

friend ostream &operator<<( ostream &_os, BKP& _bkp);

};

ostream& operator <<( ostream& _os, BKP& _bkp)
{

for ( int i =0; i <_bkp.nVar ; i++)
{
_os << _bkp.p.at(i) << " " << _bkp.w.at(i) << endl;
}
_os << _bkp.b <<endl;

return _os;
}


I tried to compile in MSVC++ 6.0 and I get the following errors:

error C2248: 'nVar' : cannot access private member declared in class 'BKP'
error C2248: 'p' : cannot access private member declared in class 'BKP'
error C2248: 'w' : cannot access private member declared in class 'BKP'
error C2248: 'b': cannot access private member declared in class 'BKP'

I can't figure this. A friend function is supposed to access the private
members is what I read. Please clarify. thanx for ur time.

That's not what I get when I compile it with VC++ 6.0. I get:
z.cpp(5) : error C2143: syntax error : missing ';' before '<'
z.cpp(5) : error C2501: 'vector' : missing storage-class or type specifiers
z.cpp(5) : error C2059: syntax error : '<'
z.cpp(5) : error C2238: unexpected token(s) preceding ';'
z.cpp(6) : error C2143: syntax error : missing ';' before '<'
And so on and on...

The reason is that you omitted the following:
#include <ostream>
#include <vector>

You also did not include the "std::" qualifier on anything. Without them you
need to use 'using' at least once.

The following compiles without an error, though I don't know why it doesn't
complain about ifstream:
#include <ostream>
#include <vector>

using namespace std;

class BKP
{
private:
int nVar;
vector<int> p;
vector<int> w;
int b;

public:

BKP();
BKP(ifstream &in);
~BKP();

friend ostream &operator<<( ostream &_os, BKP& _bkp);

};

ostream& operator <<( ostream& _os, BKP& _bkp)
{

for ( int i =0; i <_bkp.nVar ; i++)
{
_os << _bkp.p.at(i) << " " << _bkp.w.at(i) << endl;
}
_os << _bkp.b <<endl;

return _os;
}

DW
 
D

Dave Townsend

Srini,



I think what you are seeing is a VC++ 6 bug, I used the .NET

2003 C++ and the code below works ok and prints out what you'd

expect.



dave



+++++++++++++++++++++++++++++++++++++++++++



#include <vector>

#include <iostream>

using namespace std;

class Matrix;

class Vector

{

public:

float v[4];

friend Vector operator*(const Matrix& M, const Vector& V);

};

class Matrix

{

private:

Vector v[4];

public:

friend ostream;

friend ostream& operator<<( ostream& _os, const Matrix& M );

friend Vector operator*(const Matrix& M, const Vector& V);

};

ostream& operator<< ( ostream& _os, const Matrix& M)

{

for ( int i=0; i<4; i++)

for (int j=0; j<4; j++)

{

float x = M.v.v[j];

}

return _os;

}

Vector operator*(const Matrix& M, const Vector& V)

{

Vector U;

for (int i=0; i<4; i++)

{

U.v=0;

for (int j=0; j<4; j++)

{

U.v += M.v.v[j] * V.v[j];

cout << U.v;

}

}

return U;

}





class BKP

{


int nVar;

vector<int> p;

vector<int> w;

int b;

public:

BKP()

{

nVar=10;

b=1;

for (int i=0; i<10; i++)

{

p.push_back(i);

w.push_back(i*i);

}


};

BKP(ifstream &in){};

~BKP(){};

friend ostream& operator<<( ostream& _os, const BKP& _bkp );

};

ostream& operator <<( ostream& _os, const BKP& _bkp)

{

for ( int i =0; i <_bkp.nVar ; i++)

{

_os << _bkp.p.at(i) << " " << _bkp.w.at(i) << endl;

}

_os << _bkp.b <<endl;

return _os;

}




int main()

{

BKP bkp;

cout << bkp;

return 0;

}
 
J

John Harrison

Srini nandiraju said:
Hi folks,

I am trying to implement a friend class and the following is what I did.
Please scroll down.

/***************** CODE **********************************/
class BKP
{
private:
int nVar;
vector<int> p;
vector<int> w;
int b;

public:

BKP();
BKP(ifstream &in);
~BKP();

friend ostream &operator<<( ostream &_os, BKP& _bkp);

};

ostream& operator <<( ostream& _os, BKP& _bkp)
{

for ( int i =0; i <_bkp.nVar ; i++)
{
_os << _bkp.p.at(i) << " " << _bkp.w.at(i) << endl;
}
_os << _bkp.b <<endl;

return _os;
}


I tried to compile in MSVC++ 6.0 and I get the following errors:

error C2248: 'nVar' : cannot access private member declared in class 'BKP'
error C2248: 'p' : cannot access private member declared in class 'BKP'
error C2248: 'w' : cannot access private member declared in class 'BKP'
error C2248: 'b': cannot access private member declared in class 'BKP'

I can't figure this. A friend function is supposed to access the private
members is what I read. Please clarify. thanx for ur time.

srini.

This is an MSVC++ 6 bug. Which service pack are you using? I think this was
fixed in the latest service pack.

Another workaround is to move the function into the class

class BKP
{
...

friend ostream &operator<<( ostream &_os, const BKP& _bkp)
{
...
}
};

Also you should declare operator<< with a const reference parameter like I
have done above. operator<< does not change _bkp, so the reference should be
const.

john
 
D

David White

In light of John Harrison's post, I'll add that I'm using Service Pack 5 for
my VC++ 6.0.

DW
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,579
Members
45,053
Latest member
BrodieSola

Latest Threads

Top