Re: trouble assigning reference
On May 6, 10:32 pm, Neelesh <neelesh.bo...@gmail.com> wrote:
On May 7, 5:29 am, Christopher <cp...@austin.rr.com> wrote:
I am getting an odd compiler error:
'Pass::operator =' : cannot access private member declared in class
'Pass'
It is speaking as if I am trying to assign a Pass object to Pass
another object, but I am trying to assign a reference to another
reference.
Reference is not something "different" than an object, a reference is
simply an alias (i.e. a different name) for an object. More
importantly, once an alias gets associated with an object, it cannot
get associated with any other object. Hence, assigning a reference is
effectively assigning the objects for which they are aliases.
//---------------------------------------------------------------------=
----=AD=AD---
class Pass
{
public:
/** Only a Technique should construct a Pass */
friend class Technique;
~Pass();
// Snip
private:
/**
* Constructor
*
* Only a Technique should construct a Pass
**/
Pass(ID3D10EffectPass * pass);
/* No copy not allowed */
Pass(const Pass & rhs);
/** No assignment allowed */
Pass & operator = (const Pass & rhs);
// SNIP
};
class PolygonSet
{
// SNIP
protected:
// SNIP
struct PassInfo
{
PassInfo(Pass & pass, const std::vector<unsigned> &
vertexBufferIndices, ID3D10InputLayout * inputLayout);
PassInfo(const PassInfo & rhs);
PassInfo & operator = (const PassInfo & rhs);
Pass & m_pass; =
// A
single pass from a technique
std::vector<unsigned> m_vertexBufferIndices; // Which bu=
ffers
provide the data required for the pass
ID3D10InputLayout * m_inputLayout; =
// Input layout
used for a specific pass
};
};
//---------------------------------------------------------------------=
----=AD=AD-----------------
PolygonSet::PassInfo & PolygonSet::PassInfo::operator = (const
PassInfo & rhs)
{
m_pass =
rhs.m_pass; // PROBL=
EM HERE
m_vertexBufferIndices = rhs.m_vertexBufferIndices;
m_inputLayout = rhs.m_inputLayout;
return *this;
}
I don't understand why it is not letting me assign a reference to
another reference. I don't ever have problems doing that in a
constructor's initialization list. What's going on here?
Because constructor initialization list is a place where, for the
first time, we give meaning to a reference. In other words, you tell
that reference whose alias it is. (Remember that there cannot be null
references, and hence every reference member must be explicitly
initialized in the constructor initialization list). Once that is
done, there is no way one can "separate out" the reference from the
object. Thus, any time other than a constructor initialization list,
any attempt to assign a reference effectively results in assigning
objects. References are not pointers.- Hide quoted text -
- Show quoted text -
Ok, I think I understand the problem.
Two more questions though:
1) I think I can have a null reference. What can i expect when this
happens:
#include <iostream>
int main()
{
int * ptr = new int(7);
int & ref = *ptr;
delete ptr;
// more stuff
std::cout << ref << std::endl;
}
2) Is this safe?
#include <iostream>
class A
{
public:
A() { m_ptr = new int(9); }
~A() { delete m_ptr; }
const int & GetInt() const { return *m_ptr; }
private:
int * m_ptr;
};
int main()
{
A a();
int * anotherPtr = &(a.GetInt());
std::cout << *anotherPtr << std::endl;
return 0;
}