fen*_*rbb 24 c++ constructor new-operator stdvector
我正在设计一个具有std::vector<int>实例变量的类.我正在使用a,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);
}
Run Code Online (Sandbox Code Playgroud)
当我尝试编译时,我收到以下错误消息:
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
Run Code Online (Sandbox Code Playgroud)
但是,当我将违规行更改为:
vector<int> temp(size,0);
vec = temp;
Run Code Online (Sandbox Code Playgroud)
它现在编译没有故障,我得到了所需的行为,并可以访问我的矢量
vec[i] // i having been defined as an int yada yada yada
Run Code Online (Sandbox Code Playgroud)
这种解决方法是可以的,但我想了解它的工作原理,第一种方法失败.提前致谢.
Luc*_*ore 33
做就是了:
MyClass::MyClass(int m_size) : size(m_size), vec(m_size, 0)
Run Code Online (Sandbox Code Playgroud)
您似乎已经了解初始化列表,为什么不直接初始化向量?
vec = new vector<int>(size,0);
Run Code Online (Sandbox Code Playgroud)
是非法的,因为new返回一个指针,在你的情况下vec是一个对象.
你的第二个选择:
vector<int> temp(size,0);
vec = temp;
Run Code Online (Sandbox Code Playgroud)
虽然它编译,但额外的工作没有收获.到达分配时,已经构建了两个向量,然后将其丢弃.
Bal*_*arq 12
vector的使用在你的课堂上是合法的,问题在于你如何初始化它:
#include <vector>
class MyClass {
public:
MyClass(int m_size);
// ... more things...
private:
int size;
vector<int> vec;
}
Run Code Online (Sandbox Code Playgroud)
您正在指定一个指向新矢量对象的指针,就好像此矢量对象未初始化一样.
vec = new vector<int>(size,0);
Run Code Online (Sandbox Code Playgroud)
如果你真的希望这个工作,那么你应该将你的vec对象声明为:
vector<int> * vec;
Run Code Online (Sandbox Code Playgroud)
并且不要忘记添加析构函数:
MyClass::~MyClass {
delete vec;
}
Run Code Online (Sandbox Code Playgroud)
丢弃new粒子时为什么会起作用?因为您正在创建一个新对象vector,并覆盖您的类中的对象(但这并不能保证原始对象被正确消除).
你实际上不需要这样做.vector当你到达MyClass的构造函数时,你的对象已经被初始化(它的默认构造函数被调用).如果您只是想确保为size项目保留内存:
MyClass::MyClass(int m_size): size(m_size) {
vec.reserve( size );
}
Run Code Online (Sandbox Code Playgroud)
如果你想让你的矢量有size元素,那么:
MyClass::MyClass(int m_size): size(m_size), vec(m_size, 0)
{}
Run Code Online (Sandbox Code Playgroud)
最后,正如其中一位评论者指出的那样,一旦构建了载体,实际上并不需要大小.所以你可以摆脱size成员:
class MyClass {
public:
MyClass(int m_size): vec(m_size, 0)
{}
unsigned int getSize() const
{ return vec.size(); }
// ... more things...
private:
vector<int> vec;
}
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助.
| 归档时间: |
|
| 查看次数: |
66836 次 |
| 最近记录: |