By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
446,238 Members | 1,746 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 446,238 IT Pros & Developers. It's quick & easy.

friend classes

P: n/a
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.
Jul 22 '05 #1
Share this Question
Share on Google+
5 Replies


P: n/a
Srini nandiraju wrote in news:b6da7d0d.0405181949.1d79f9f3
@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.
--
http://www.victim-prime.dsl.pipex.com/
Jul 22 '05 #2

P: n/a
"Srini nandiraju" <na******@ureach.com> wrote in message
news:b6**************************@posting.google.c om...
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

Jul 22 '05 #3

P: n/a
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[i].v[j];

}

return _os;

}

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

{

Vector U;

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

{

U.v[i]=0;

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

{

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

cout << U.v[i];

}

}

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;

}

"Srini nandiraju" <na******@ureach.com> wrote in message
news:b6**************************@posting.google.c om...
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.

Jul 22 '05 #4

P: n/a

"Srini nandiraju" <na******@ureach.com> wrote in message
news:b6**************************@posting.google.c om...
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
Jul 22 '05 #5

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

DW

Jul 22 '05 #6

This discussion thread is closed

Replies have been disabled for this discussion.