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

标签 c++ pointers c++11 vector new-operator

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

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/

相关文章:

c++11 获取第一个(第二个等...)参数的类型,类似于 result_of

c++ - 在 C++11 中使用 "auto"推导出的 lambda 类型是什么?

c++ - 基于范围的for循环中的未命名循环变量?

c++ - 使用 std::mutex 复制类

c++ - 不匹配 'operator=='

c - 指针数组 *(*(string+i)+j)。 (这可能吗?)

c++ - 现在 C++ 中有官方的 TCHAR 类型吗?

C++ std::queue push pop 两个不同的对象获取第一个对象

c++ - 访问冲突循环和写入

C语言中的指针和数组