[英]Setup std::vector in class constructor with different values for element constructor
[英]Setup std::vector in class constructor
我正在設計一個將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;
它現在可以順利編譯,我得到了所需的行為,並且可以訪問我的向量
vec[i] // i having been defined as an int yada yada yada
這種解決方法沒問題,但我想了解它為什么有效而第一種方法失敗。 提前致謝。
做就是了:
MyClass::MyClass(int m_size) : size(m_size), vec(m_size, 0)
您似乎已經了解初始化列表,為什么不直接在那里初始化向量?
vec = new vector<int>(size,0);
是非法的,因為new
返回一個指針,而在您的情況下vec
是一個對象。
你的第二個選擇:
vector<int> temp(size,0);
vec = temp;
盡管它可以編譯,但做額外的工作卻沒有任何收獲。 當你完成任務時,兩個向量已經被構建並隨后被丟棄。
在你的班級中使用 vector 是合法的,問題是你如何初始化它:
#include <vector>
class MyClass {
public:
MyClass(int m_size);
// ... more things...
private:
int size;
vector<int> vec;
}
您正在分配一個指向新向量對象的指針,就好像該向量對象未初始化一樣。
vec = new vector<int>(size,0);
如果你真的想讓它工作,那么你應該將你的vec
對象聲明為:
vector<int> * vec;
並且不要忘記添加一個析構函數:
MyClass::~MyClass {
delete vec;
}
為什么當你放下new
粒子時它會起作用? 因為您正在創建一個新的對象vector
,並覆蓋您班級中的對象(但是,這並不能保證正確消除原始對象)。
你實際上不需要這樣做。 當您到達 MyClass 的構造函數時,您的vector
對象已經初始化(調用了它的默認構造函數)。 如果您只想確保為size
項目保留內存:
MyClass::MyClass(int m_size): size(m_size) {
vec.reserve( size );
}
如果您希望您的矢量具有size
元素,則:
MyClass::MyClass(int m_size): size(m_size), vec(m_size, 0)
{}
最后,正如一位評論者指出的那樣,一旦構建了向量,實際上就不需要大小了。 所以你可以擺脫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;
}
希望這可以幫助。
#include <vector>
#include <iostream>
#include <string>
#include <typeinfo>
using std::cout;
using std::endl;
using std::string;
using std::vector;
using std::to_string;
class Parse
{
private:
string m_str;
vector<string> m_vec;
public:
// Constructor with all defaults (1 of 4 constructors)
Parse(){
cout << "\ncreating class with all default values\n";
m_str = "";
m_vec.push_back("");
}
// Constructor with all cases used
Parse (string &tmp_str,
vector<string> tmp_vec):
m_str (tmp_str),
m_vec (tmp_vec)
{
cout << "Your vector contains " + to_string(m_str.size()) + " arguments\n";
}
// Constructor with other contents given but not vector
Parse (string &tmp_str):
m_str (tmp_str)
{
m_vec.push_back("");
}
// Constructor with only Vector given but not other contents
Parse (vector<string> tmp_vec):
m_vec (tmp_vec)
{
m_str = "";
}
string get_str_var(){return m_str;}
void classed_print_vector_strings()
{
for (string i : m_vec){ cout << i << " \n";}
}
};
// rm ./class_vector; g++ class_vector.cpp -o class_vector -std=c++17; ./class_vector arg1 arg2 arg3
int main(int argc, char *argv[])
{
// turn **argv to a vector
vector<string> args(argv, argv + argc);
// iterate from argv through argv+argc
// initialize with default arguments.
Parse tracker1;
// initalize with all used arguments
Parse tracker2(args[0], args);
// initalize with only the vector
Parse tracker3(args);
// initalzie without the vector, but with another arg
Parse tracker4(args[0]);
cout << "\nTracker 1 ---------------------\n";
tracker1.classed_print_vector_strings();
cout << "\nTracker 2 ---------------------\n";
tracker2.classed_print_vector_strings();
cout << "\nTracker 3 ---------------------\n";
tracker3.classed_print_vector_strings();
cout << "\nTracker 4 ---------------------\n";
tracker4.classed_print_vector_strings();
return 0;
}
rm ./class_vector; g++ class_vector.cpp -o class_vector -std=c++17; ./class_vector arg1 arg2 arg3
這將向您展示如何創建一個類,該類將為您提供使用或不使用向量以及存在和/或不存在其他參數來初始化類的選項。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.