reference to pointer used in ctor - using 'this' in ctor (repost- corrected sample code)

A

Anonymous

template<class T>
class A
{
public:
A() {
T * object = new T(this); //passing instance as parent of nested class
m_obj.push_back(object);
}

~A() {
for (std::vector<T>::iterator it= m_obj.begin();
it != m_obj.end(); it++) delete *it ;
}

private:
std::vector<T*> m_objs ;
};

class B
{
public:
friend class A;
~B(){};

private:
B(A<B>* parent):m_parent(parent){}

A<B>* m_parent ;
};


class C
{
public:
friend class A;
~C(){};

private:
C(A<C>*& parent):m_parent(parent){}

A<C>* m_parent ;
};


int main( int argc, char* argv[])
{
A<B> ab ; // Ok
A<C> ac ; // Croaks here ...
};


Class A instantiated with B compiles ok, but when instantiated with
class C (that accepts a *&), I get the error message - cannot convert
parameter 1 from A const* to A* - why is that ?

Why is a reference to a ptr being passed as a const ptr ?

If 'this' is a const ptr during construction (I doubt this assertion
very much), then why is it ok to use as a non-const pointer in class B?
 
V

Victor Bazarov

Anonymous said:

The code still doesn't compile because of numerous errors (like 'm_obj'
and 'm_objs', declarations of friends that are templates, etc. Read
the FAQ 5.8 please.
class C
{
public:
friend class A;
~C(){};

private:
C(A<C>*& parent):m_parent(parent){}

The advice is still the same:

C(A said:
A<C>* m_parent ;
};


int main( int argc, char* argv[])
{
A<B> ab ; // Ok
A<C> ac ; // Croaks here ...
};


Class A instantiated with B compiles ok, but when instantiated with
class C (that accepts a *&), I get the error message - cannot convert
parameter 1 from A const* to A* - why is that ?

Why is a reference to a ptr being passed as a const ptr ?

If 'this' is a const ptr during construction (I doubt this assertion
very much), then why is it ok to use as a non-const pointer in class
B?

V
 
B

Barry

Anonymous said:
template<class T>
class A
{
public:
A() {
T * object = new T(this); //passing instance as parent of nested class
m_obj.push_back(object);
}

~A() {
for (std::vector<T>::iterator it= m_obj.begin();
it != m_obj.end(); it++) delete *it ;
}

private:
std::vector<T*> m_objs ;
};

class B
{
public:
friend class A;
~B(){};

private:
B(A<B>* parent):m_parent(parent){}

A<B>* m_parent ;
};


class C
{
public:
friend class A;
~C(){};

private:
C(A<C>*& parent):m_parent(parent){}

A<C>* m_parent ;
};


int main( int argc, char* argv[])
{
A<B> ab ; // Ok
A<C> ac ; // Croaks here ...
};


Class A instantiated with B compiles ok, but when instantiated with
class C (that accepts a *&), I get the error message - cannot convert
parameter 1 from A const* to A* - why is that ?

Why is a reference to a ptr being passed as a const ptr ?

If 'this' is a const ptr during construction (I doubt this assertion
very much), then why is it ok to use as a non-const pointer in class B?

I attempted to compile your code, but found the template class friend
problem, as Victor marked else-thread.
You inject a friend A into B, actually A is a template class, so you
have to write A<T> as a friend of B(so B have also to be templated),

template <class T>
class B
{
public:
friend class A<T>;
....

when come to declaration of A's object,
A<B> ab;
B have to be changed into B<X>, where X is recursively dependent on T of
A<T>, which is to be a templated B.
So the recursive declaration looks like this:
A<B<B<B....> > >

So the job couldn't be done. Probably you have to redesign your classes.
 

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,997
Messages
2,570,239
Members
46,827
Latest member
DMUK_Beginner

Latest Threads

Top