c++ - 在类构造函数中设置 std::vector

标签 c++ constructor new-operator stdvector

我正在设计一个具有 std::vector<int> 的类作为实例变量。我正在使用 std::vector因为我需要在运行时设置它的大小。以下是我的代码的相关部分:

my_class.h:

#include <vector>
using std::vector;
class MyClass {
    int size;
    vector<int> vec;
}

my_class.cc:

#include "my_class.h"
using std::vector
MyClass::MyClass(int m_size) : size(m_size) {
     vec = new vector<int>(size,0);
}

当我尝试编译时,我收到以下错误消息:

g++ -c -Wall my_class.cc -o my_class.o

my_class.cc: In constructor ‘MyClass::MyClass(int):

  my_class.cc:4 error: no match for ‘operator=’ in ‘((MyClass*)this)->My_Class::vec = ((*(const allocator_type*)(& std::allocator<int>())), (operator new(24u), (<statement>, ((std::vector<int>*)<anonymous>))))’

make: *** [my_class.o] Error 1

但是,当我将违规行更改为:

vector<int> temp(size,0);
vec = temp;

它现在可以顺利编译,我得到了所需的行为,并且可以访问我的 vector

vec[i]  // i having been defined as an int yada yada yada

这个解决方法没问题,但我想了解它为什么有效并且第一种方法失败了。提前致谢。

最佳答案

只要做:

MyClass::MyClass(int m_size) : size(m_size), vec(m_size, 0)

你似乎已经知道初始化列表,为什么不直接在那里初始化 vector 呢?

vec = new vector<int>(size,0);

是非法的,因为 new 返回一个指针,而在您的情况下 vec 是一个对象。

您的第二个选择:

vector<int> temp(size,0);
vec = temp;

虽然它可以编译,但做额外的工作没有任何好处。当你完成分配时,两个 vector 已经被构建并被丢弃。

关于c++ - 在类构造函数中设置 std::vector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11415469/

相关文章:

c++ - 仅将图像的一个区域转换为灰度

c++ - 使用 OpenCV 读取文件夹中的有序图像序列

C#单向链表实现

c++ - 尝试包装和覆盖全局运算符 new 时的递归调用

c++ - 重载 new 和 delete C++ 以跟踪内存分配

c++ - 如何创建三维动态数组

c++ - Qt,内存的动态分配

c++ - 初始化 shared_ptr 成员变量,new vs make_shared?

c++ - 如何在 C++ 中为矩阵类型构建构造函数

c# - 如何通过反射将枚举值传递给类的构造函数?