代码重构试图使用多态和std :: map

时间:2013-07-26 07:57:40

标签: c++ map stl constructor polymorphism

我有这个班级

struct B {
   B( int x=0 ) { }
   virtual void something() {
          std::cout << "B()";
   }
};

struct A { 
     B b;
     int a;
     A( int a, int b_ ) : a(a), b(b_) {a}
};

我已经实现了另一个C类

 struct C : public B {
   C( int x ) : B(b) { }
   virtual void something() {
          std::cout << "C()";
   }
}; 

使用C代替B的最佳方法是什么?

我已经尝试过了:

struct A { 
         B  & b;
         int a;
         A( int a, B &b_ ) : a(a), b(b_) {a}
    };

然后我必须使用std::map<int, A> 这给出了编译错误:

'A::A' : no appropriate default constructor available.

所以我这样做了:

struct A { 
             B  & b;
             int a;
             A( int a=0, B &b_=B() ) : a(a), b(b_) {a}
        };

在我的主要

std::map<int,A> mmap;
for( int i=0;i<5;++i ) {
   auto & b = C();
   mmap.insert( std::make_pair(i,A(i,b) ) ) ;
}

但只要auto & b超出范围,mmap A中的这些C对象就会变为B.

它不起作用。如何解决?

1 个答案:

答案 0 :(得分:1)

在A构造函数中,您尝试分配B的临时实例以引用B,这是非法的。

您需要做的是通过指向此类的指针来更改此引用:

#include <iostream>
#include <memory>
#include <map>

using namespace std;

struct B {

   B( int x=0 ) { }
   virtual void something()
   {
        std::cout << "B()";
   }
};

struct A { 
        shared_ptr<B> b;
        int a;
        A( int a = 0, shared_ptr<B> b = shared_ptr<B>(new B()) ) : a(a), b(b) {}
};

struct C : public B {
    C( int x ) { }
    virtual void something()
    {
        std::cout << "C()";
    }
}; 

int main()
{
    shared_ptr<B> b = shared_ptr<B>( new C(0));
    // Polymorphic test
    b->something();

    A a (0, b);
    // map test
    map<int, A> my_map;
    my_map[0] = a;

    return 0;
};

如果您不能使用C ++ 11,只需通过裸指针更改智能指针并像往常一样正确处理动态内存。甚至更好:使用Boost库,如chris所述。