Arrays of smart pointers to base class

R

Rune Allnor

Hi all.

I am sure this is an oldie, but I can't find a useful suggestion on
how to solve it.

I have a class hierarchy of classes derived from a base class.
I would like to set up a vector of smart pointers to the base
class, and access the virtual functions of any class in the
hierarchy through the virtual functions.

For some reason the compiler doesn't like the way I do things
(code showing intentions of use below).

Any pointers to standard solutions are highly appreciated.

Rune

/////////////////////////////////////////////////////////////////////////////////////////
#include <boost/scoped_ptr.hpp>
#include <iostream>
#include <vector>

class base{
public:
virtual void report() const { std::cout << "Base Class Report" <<
std::endl;};
virtual ~base(){std::cout << "Base Class Destructor" << std::endl;};
};

class derivedA : public base{
virtual void report() const{std::cout << "Derived A Class Report" <<
std::endl;};
virtual ~derivedA(){std::cout << "Derived A Class Destructor" <<
std::endl;};
};

class derivedB : public base{
virtual void report() const{std::cout << "Derived B Class Report" <<
std::endl;};
virtual ~derivedB(){std::cout << "Derived B Class Destructor" <<
std::endl;};
};

int main(int argc,char* argv[])
{
std::vector<boost::scoped_ptr<base> > v;
v.push_back(boost::scoped_ptr<base>(new base)); // Compile error
v.push_back(boost::scoped_ptr<base>(new derivedA)); // Compile error
v.push_back(boost::scoped_ptr<base>(new derivedB)); // Compile error

std::vector<boost::scoped_ptr<base> >::iterator i;
for (i=v.begin();i!=v.end();++i)
(*i)->report();

return 0;
}
 
N

newbarker

Hi all.

I am sure this is an oldie, but I can't find a useful suggestion on
how to solve it.

I have a class hierarchy of classes derived from a base class.
I would like to set up a vector of smart pointers to the base
class, and access the virtual functions of any class in the
hierarchy through the virtual functions.

For some reason the compiler doesn't like the way I do things
(code showing intentions of use below).

Any pointers to standard solutions are highly appreciated.

Rune

///////////////////////////////////////////////////////////////////////////­//////////////
#include <boost/scoped_ptr.hpp>
#include <iostream>
#include <vector>

class base{
public:
        virtual void report() const { std::cout << "Base Class Report" <<
std::endl;};
        virtual ~base(){std::cout << "Base Class Destructor" << std::endl;};

};

class derivedA : public base{
        virtual void report() const{std::cout << "Derived A Class Report" <<
std::endl;};
        virtual ~derivedA(){std::cout << "Derived A Class Destructor" <<
std::endl;};

};

class derivedB : public base{
        virtual void report() const{std::cout << "Derived B Class Report" <<
std::endl;};
        virtual ~derivedB(){std::cout << "Derived B Class Destructor" <<
std::endl;};

};

int main(int argc,char* argv[])
{
        std::vector<boost::scoped_ptr<base> > v;
        v.push_back(boost::scoped_ptr<base>(new base)); // Compile error
        v.push_back(boost::scoped_ptr<base>(new derivedA)); // Compile error
        v.push_back(boost::scoped_ptr<base>(new derivedB)); // Compile error

        std::vector<boost::scoped_ptr<base> >::iterator i;
        for (i=v.begin();i!=v.end();++i)
                (*i)->report();

        return 0;



}- Hide quoted text -

- Show quoted text -

The following reworked code works:

///////////////////////////////////////////////////////////////////////////­//////////////
#include <boost/shared_ptr.hpp>
#include <iostream>
#include <vector>


class base{
public:
virtual void report() const { std::cout << "Base Class Report"
<<
std::endl;};
virtual ~base(){std::cout << "Base Class Destructor" <<
std::endl;};



};


class derivedA : public base{
public:
virtual void report() const{std::cout << "Derived A Class
Report" <<
std::endl;};
virtual ~derivedA(){std::cout << "Derived A Class Destructor"
<<
std::endl;};


};


class derivedB : public base{
public:
virtual void report() const{std::cout << "Derived B Class
Report" <<
std::endl;};
virtual ~derivedB(){std::cout << "Derived B Class Destructor"
<<
std::endl;};


};


int main(int argc,char* argv[])
{
std::vector<boost::shared_ptr<base> > v;
v.push_back(boost::shared_ptr<base>(new base)); // Compile
error
v.push_back(boost::shared_ptr<base>(new derivedA)); // Compile
error
v.push_back(boost::shared_ptr<base>(new derivedB)); // Compile
error

std::vector<boost::shared_ptr<base> >::iterator i;
for (i=v.begin();i!=v.end();++i)
(*i)->report();


return 0;


}


I changed the scoped_ptrs to shared_ptrs. scoped_ptr AFAIK is designed
for simple RAII. I also declared the methods in derivedA and derivedB
public (having private destructors didn't help!!).
 

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

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,537
Members
45,020
Latest member
GenesisGai

Latest Threads

Top