gpt4 book ai didi

c++ - 使指向基类指针的 std::vector 的指针指向派生类指针的 std::vector

转载 作者:太空宇宙 更新时间:2023-11-04 15:15:44 24 4
gpt4 key购买 nike

为冗长的标题道歉。我不知道如何简洁地表达这一点。

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 type std::vector<B*>

但是自B源自 A ,这应该是可能的吧?我见过人们使用

B bObj;
A *aObj = &bObj ;

那么你能告诉我我犯了什么错误吗?

我经历这一切的原因是因为我有 class Cclass 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com