簡體   English   中英

如何從C ++中的模板化類訪問std :: vector數據

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM