矢量&lt; unique_ptr <t>&gt;作为基类成员</t>

时间:2014-06-11 21:12:54

标签: c++ inheritance vector polymorphism derived-class

我有三个班级:

Class Something
{...}

Class A
{
public:
    A();
    virtual ~A() = 0; //have also tried this as non-abstract

    std::vector< unique_ptr<Something> > somethings; //have tried this just as std::vector<Something*> as well
};

class B : public A
{
    B();
    ...
}

如果我遗漏了std :: vector&lt;的声明东西*&gt;有些东西,来自B级...然后我的编译器告诉我,班级'B'没有任何名为'somethings'的字段。

因此,如果我重新添加它,我会尝试像这样引用它

A *a = new B();

for(auto it = a->somethings.begin(); it != a->somethings.end(); it++)
{
     Draw((*it)->image,(*it)->x, (*it)->y, NULL, (*it)->angle);
}

它说a-> somethings是空的......即使我从B本身打印告诉我有多少&#39; somethings&#39;有,它准确报告计数。这是导致我删除std :: vector&lt; unique_ptr&gt;出头;从B级开始,因为我怀疑它是以某种方式获得A的向量,即使它是抽象的。

奖金:如果我去B * b = new B(),这一切都有效;当我添加父类A并使B继承它时,它就破产了。

2 个答案:

答案 0 :(得分:3)

从注释中的链接代码,问题是您正在尝试直接在派生类中初始化基类字段。您不能这样做(并且尝试没有任何意义)因为基类字段由基类构造函数初始化。如果要初始化字段(而不是分配给它),则需要在基类构造函数中执行此操作:

class Base {
public:
    std::vector<float> fVec;
    Base(std::vector<float> v) : fVec(v) { }
};

class Derived : public Base {
public:
    Derived(std::vector<float> v) : Base(v) {
        :

请注意,您在上面显示的代码与您链接的代码完全不同且无关 - 您应该发布与您的问题相关的代码,而不是无关的无关代码。

答案 1 :(得分:0)

我不确定这是否会对您有所帮助,但我对您的coliru.stacked-crooked示例进行了一些小改动,如下所示:

#include <vector>

class Base
{
public:
    std::vector<float> fVec;
};

class Derived : public Base
{
public:
    Derived(std::vector<float> v) // : fVec(v)
    {
        fVec = v;
    }
};
int main() {}

注意我从构造函数初始化列表中注释掉fVec并将其分配给构造函数的主体。这里的问题是,在您输入Base构造函数正文的左括号之前,您的Derived对象尚未完全创建。

要解决此问题,您可以向Base对象添加一个构造函数,该构造函数接受一个向量,然后将其分配给您的对象,或多或少是Chris所说的。

上述两个示例都适用于我,但我没有完整的代码,因此无法确定他们是否能解决您的所有问题。无论如何,我以为我会采取行动。

你可能知道所有关于矢量的副本,并且应该将它们作为常量引用传递,但这是另一个问题。