![](/img/trans.png)
[英]C++: How to make std::vector<T> static for all instances of every T of a templated class?
[英]How to access a std::vector data from a templated class in C++
我正在嘗試實現一個模板類,該模板類具有一個來自標准庫的矢量容器作為成員。 該類的目的是創建一個供我個人使用的線性代數類。
假定該類具有一個構造函數,該構造函數初始化僅填充零和[]
運算符的兩次重載以填充數據的向量。
該代碼如下所示:
#include <vector>
#include <iostream>
template<class T>class LinAlg
{
private:
std::vector<T> mVector;
int mSize;
public:
LinAlg(int size);
T & operator[](int i);
T const & operator[] (int i)const;
};
template<class T> LinAlg<T>::LinAlg(int size)
{
mSize = size;
std::vector<T> mVector;
for (int i=0; i<mSize; i++)
{
mVector.push_back(0);
}
}
template<class T> T & LinAlg<T>::operator[](int i)
{
return mVector[i];
}
template<class T> T const& LinAlg<T>::operator[](int i)const
{
return mVector[i];
}
int main()
{
LinAlg<double> vec(2);
vec[0] = 1.0;
vec[1] = 1.0;
for(int i=0; i<2; i++)
{
std::cout << vec[i] << '\n';
}
return 0;
}
顯然,代碼可以正確編譯,但是main函數沒有輸出。 問題似乎出在運營商的負擔過重,我在不同的論壇上都讀過書,但我一直找不到解決方案。
任何幫助表示贊賞。
在構造函數中,您要聲明一個局部變量mVector
,該變量隱藏具有相同名稱的類成員。 因此,您正在填充局部變量,而不是類成員。 您需要刪除局部變量:
template<class T> LinAlg<T>::LinAlg(int size)
{
mSize = size;
for (int i=0; i<mSize; i++)
{
mVector.push_back(0);
}
}
話雖如此,您根本不需要循環,因為std::vector
有一個resize()
方法可以用值填充向量:
template<class T> LinAlg<T>::LinAlg(int size)
{
mSize = size;
mVector.resize(size); // <-- will set new elements to 0 by default
}
或者,您可以改用向量自己的構造函數,這樣做的作用相同:
template<class T> LinAlg<T>::LinAlg(int size)
: mVector(size) // <-- will set elements to 0 by default
{
mSize = size;
}
無論哪種方式, mSize
成員都是多余的,因為std::vector
具有自己的size()
方法,您可以在需要時使用它。
在
template<class T> LinAlg<T>::LinAlg(int size)
{
mSize = size;
std::vector<T> mVector; // <- oops
for (int i=0; i<mSize; i++)
{
mVector.push_back(0);
}
}
std::vector<T> mVector;
定義一個新變量mVector
,該變量mVector
成員變量mVector
。 本地mVector
有效地替換了成員mVector
並進行了初始化,加載了0並在構造函數結束時被丟棄。 成員mVector
的默認值初始化為零,從而在以后嘗試訪問您認為已存儲的值時引起問題。
相反,你可以
template<class T> LinAlg<T>::LinAlg(int size)
{
mSize = size;
// std::vector<T> mVector; <- remove this
for (int i=0; i<mSize; i++)
{
mVector.push_back(0);
}
}
但是std::vector
具有一個可以為您完成此工作的構造函數,默認為初始化size
元素,您可以在成員初始化器列表中加以利用
template<class T> LinAlg<T>::LinAlg(int size):
mVector(size), mSize(size)
{
}
此外,由於std::vector
知道其長度,因此您可以刪除mSize
成員並將其使用替換為mVector.size()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.