Boost logo

Boost Users :

From: Gustavo Ribeiro Alves (gralves_at_[hidden])
Date: 2006-03-12 20:06:23


Hello,

   I'm writing an small library to represent types. Right now I'm
focusing on representing type composition.

  For that I'm using the composite pattern as proposed by Gamma et
al., so I have an abstract base class for my composites that has the
virtual functions to addComposite members, but not their
implementation.

  The header of my class looks like this:
namespace dintype {
class Type{
        public:
                virtual ~Type()=0;
                typedef std::string Name_t;
                virtual void addComposition(const Name_t& name,Type* tp)=0;
                virtual void delComposition(const Name_t& name)=0;
                Type* clone() const;
        protected:
                typedef ptr_map<Name_t,Type> children_t;
                typedef children_t::iterator children_iterator;
                typedef children_t::const_iterator children_const_iterator;
                typedef children_t::size_type children_size_type;
                Type();
        private:
                virtual Type* do_clone() const=0;
};
inline Type* new_clone(const Type& c) {
        return c.clone();
}
}

      The one for my composite class is:

class CompositeType : public Type
{
        private:
                children_t m_children;
                CompositeType(const CompositeType& r);
                virtual Type* do_clone();
        protected:
                void clearAllCompositeChildren();
        public:
                CompositeType();
                virtual ~CompositeType();
                virtual void addComposition(const Name_t& name,Type* tp);
                virtual void delComposition(const Name_t& name);
};

Here is the implementation of the composite class:
CompositeType::CompositeType(const CompositeType& r)
        : m_children(r.m_children.clone())
{
}

CompositeType::CompositeType()
{
}

CompositeType::~CompositeType()
{
}

void CompositeType::clearAllCompositeChildren() {
        m_children.erase(m_children.begin(),m_children.end());
}

void CompositeType::addComposition(const Name_t& name,Type* tp) {
        m_children[name]=tp; // <========= THIS LINE IS THE PROBLEM
}

void CompositeType::delComposition(const Name_t& name) {
        m_children.erase(name);
}

I can't get the program to compile because gcc keeps complaining
m_children[name] don't has operator= and that type is an abstract
class and can't be initialized.

I read all the boost::prt_container documentation and I couldn't find
what I'm doing wrong. I also tried m_children.insert(name,tp); to no
avail.

I'll greatly appreciate any help.

Thanks,

Gustavo


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net