【问题标题】:initializing an arbitrary-size array of pointers in a constructor [duplicate]在构造函数中初始化任意大小的指针数组
【发布时间】:2014-08-02 11:41:19
【问题描述】:

在我正在处理的项目中,我需要创建一个类,其中包含指向同一类的其他对象的指针数组。我目前在初始化这个数组时遇到了麻烦。 示例:

class MrClass{

    MrClass* otherInstances[];

public:

    MrClass(MrClass* x[]){
        otherInstances = x;
    }

}

这个数组的大小必须任意,因为要传递的类的实例数是在编译时定义的,而且它必须是指针,因为类的多个实例必须能够访问相同的对象。

【问题讨论】:

标签: c++


【解决方案1】:

正确的解决方案

使用std::vector<MrClass *>std::array<MrClass *>。或者更好,std::vector<std::shared_ptr<MrClass>>

class MrClass{

    std::vector<std::shared_ptr<MrClass>> otherInstances;

public:

    MrClass(std::vector<std::shared_ptr<MrClass>> const & x)
        : otherInstances(x)
    {

    }
}

辅助解决方案

如果您真的需要一个数组(并且您真的知道自己在做什么),请执行以下操作:

class MrClass{

    MrClass ** otherInstances;
    int otherInstancesCount;

public:

    MrClass(MrClass ** x, int count){

        otherInstances = x;
        otherInstancesCount = count;
    }
}

【讨论】:

  • 有趣的是,这两种解决方案的语义并不相同。他的代码似乎暗示了数组的深层副本(但我认为我们不能确定),std::vector 确实如此,但不是您的第二个解决方案。
  • 指向std::vector 元素的指针有什么问题?或者更好的是,一个迭代器?
  • 首先,这与数组有何不同?以什么方式可以更改向量以使指针/迭代器无效,而不是数组不能?关于第二点,如果这是一个问题,那么在构造数组元素之前如何阻止线程创建指向数组元素的指针? std::vector 几乎被设计成在几乎所有情况下都可以替代数组。
  • @supereater14 请记住,std::vector 在内部使用数组(可能不是字面意思,但同样的规则适用)。因此,如果您使用数组,您将遇到与使用 std::vector 时完全相同的问题,除了您必须手动完成所有操作而不是使用方便的对象。
  • @supereater14 它适用于std::vector,就像它适用于 C 样式数组一样。当然,前提是你不对向量做任何你不能对数组做的事情。
【解决方案2】:

任意大小的数组是用 C++ 编写的std::vector。所以 你会有:

class MrClass
{
    std::vector<MrClass*> otherInstances;
public:
    MrClass( std::vector<MrClass*> const& initialValues )
        : otherInstances( initialValues )
    {
    }
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-03
    • 1970-01-01
    • 2015-10-09
    • 1970-01-01
    • 1970-01-01
    • 2020-08-06
    相关资源
    最近更新 更多