相关疑难解决方法(0)

1730
推荐指数
11
解决办法
54万
查看次数

对象的std :: vector应该使用指针,引用还是什么?

假设我们有一些类,比如说class Apple,想要存储一个std::vector包含的类Apple.

向量是否应包含指针,引用或普通对象?

std::vector<Apple*> vector; // Definitely won't copy the Apple on lookup, 
    // but I would prefer not to use pointers if I don't have to
std::vector<Apple&> vector; // Seems circuitous?
std::vector<Apple> vector; // I don't know if this copies the Apple on each lookup
Run Code Online (Sandbox Code Playgroud)

我的目标是在打电话时这样做

Apple& a = vector[4];
Run Code Online (Sandbox Code Playgroud)

Apple不会被复制.

我已经使用C++超过一年了,我一直在努力解决这个问题.是否有一个简单的解释为什么这三种方法中的一种是最佳实践?

c++ stl

22
推荐指数
2
解决办法
1020
查看次数

为什么一个物体在被推入容器时会失去其多态性?

child从中派生的对象base

class base
{
    public:
    virtual int get() const { return 0;}
    ~virtual base(){}
    };

    class child : public base
    {
    public:
    virtual int get() const override { return 1; }
};
Run Code Online (Sandbox Code Playgroud)

当加入容器时切成薄片,例如

std::vector<base> bases;
bases.push_back(child());
Run Code Online (Sandbox Code Playgroud)

并且下面的代码返回0

bases.at(0).get();
Run Code Online (Sandbox Code Playgroud)

即使push_back的签名是:

void push_back( const T& value );
void push_back( T && value );
Run Code Online (Sandbox Code Playgroud)

这不应该招致切片的对象.

例如,下面的代码导致bad_cast

dynamic_cast<child &>(bases.at(0))
Run Code Online (Sandbox Code Playgroud)

而与基地的孩子打电话则表现出多态行为

void toto(base const & e)
{
    std::cout << e.get() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

这意味着对象不再是一个孩子; 切片在哪里?实际发生了什么?

是否有可能设置basechild应对放置在容器中并且对象不会失去其多态性?

这是一个基本原理问题,并且已经知道一个对象被复制了,所以请不要建议指针/ shared_ptr,因为这已在其他地方得到解决.

c++ polymorphism

1
推荐指数
1
解决办法
105
查看次数

标签 统计

c++ ×3

c++-faq ×1

c++11 ×1

pointers ×1

polymorphism ×1

smart-pointers ×1

stl ×1