为冗长的标题道歉。我不知道如何简洁地表达这一点。
class A
{
bool a1;
unsigned int a2 ;
virtual bool aFn1(unsigned int t_) = 0 ;
virtual void aFn2(unsigned int t_, bool val_) = 0 ;
A()
{
a1 = false ; a2 = 0 ;
};
}
下一步:
#include <bitset>
#define MAX_SIZE 500
class B : public class A
{
private:
std::bitset<MAX_SIZE> _bmem;
public:
B() : A() {};
using A::aFn1 ;
virtual bool aFn1(unsigned int t_)
{
return _bemem[t_]
}
using A::aFn2;
virtual void aFn2(unsigned int t_, bool val_)
{
_bemem[t_] = val_ ;
}
}
下一步:
#include "A.h"
#include "B.h"
std::vector<A*> * vecA;
vecA = new std::vector<B*> ;
但这最后一步不起作用。 clang complete 告诉我
assigning to
std::vector<A*> *
from incompatible typestd::vector<B*>
但是自B
源自 A
,这应该是可能的吧?我见过人们使用
B bObj;
A *aObj = &bObj ;
那么你能告诉我我犯了什么错误吗?
我经历这一切的原因是因为我有 class C
和 class D
, 完全一样 class B
,唯一的区别是 #define MAX_SIZE
是不同的。
我这样做是因为,我需要一个 bitset
不同大小,用于程序的不同阶段。和 bitset
需要在编译时需要存储的元素数量。
最佳答案
您使用了太多接口(interface)和指针。
class A {
bool a1 = false;
unsigned int a2 = 0;
std::vector<bool> values;
bool aFn1(unsigned int t_) const { return values[t_]; }
void aFn2(unsigned int t_, bool val_) { values[t_] = val_; }
void set_size(size_t i){values.resize(i);}
A() = default;
static A of_size(size_t i){ A r; r.set_size(i); return r; }
};
然后使用 std::vector<A>
.
如果你有 100 个大小为 500 的元素,执行 std::vector<A> v( 100, A::of_size(500) );
与您的代码相比,此代码将执行更少的分配、使用更少的内存并且具有更少的间接性。使用 new
是“代码味道”,通常表示您犯了错误,除非您确实需要生命周期极其复杂的对象。
A std::vector<bool> values
将几乎与 std::bitset<500>
一样紧凑, 差异由我消除的其他指针弥补。
关于c++ - 使指向基类指针的 std::vector 的指针指向派生类指针的 std::vector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33761541/