我有这个班级
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.
它不起作用。如何解决?
答案 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所述。