簡體   English   中英

C ++重載:運算符的重載=

[英]c++ overloading: overload of operator =

我有一些問題,而運算符=的重載。 我的代碼是

#include <stdlib.h>
#include <iostream>


const std::size_t DIM = 10;


template <typename T>

class rowvec
  {
    private:
      T* m_pnt;
      std::size_t m_dim;

    public:
      rowvec();
      rowvec(std::size_t);
      ~rowvec();

      rowvec<T>& operator=(const rowvec<T>& x);

      T* pnt();
  };


template <typename T>
rowvec<T>::rowvec()
  {
    m_dim = DIM;
    m_pnt = (T*) calloc (DIM ,sizeof(T));
  }


template <typename T>
rowvec<T>::rowvec(std::size_t n)
  {
    m_dim = n;
    m_pnt = (T*) calloc(m_dim,sizeof(T));
  }


template <typename T>
rowvec<T>::~rowvec()
      {free(m_pnt);}


template <typename T>
rowvec<T>& rowvec<T>::operator=(const rowvec<T> &x)
  {
    std::cout << "hello" << std::endl;
    if (this != &x)
      {
        free (m_pnt);
        this->m_dim=x.m_dim;
        m_pnt = (T*) calloc (m_dim,sizeof(T));
        for (int i=0; i!=m_dim; i++)
          *(m_pnt+i)=*(x.m_pnt+i);
      }
    return *this;
  }


template <typename T>
T* rowvec<T>::pnt()
  {return m_pnt;}  




int main()
  {
    rowvec<int> k(3);

    rowvec<int> c=k;

    std::cout << "ok" << std::endl;

    return 0;
  } 

沒有編譯錯誤,但是運行時的結果是:

ok
*** Error in `./blog': double free or corruption (fasttop): 0x0000000001a5e010 ***

如果我以這種方式更改代碼:

int main()
  {
    rowvec<int> k(3);

    rowvec<int> c;

    c=k;

    std::cout << "ok" << std::endl;

    return 0;
  }

一切都很好(輸出是)

hello
hello
ok

有沒有辦法允許像“ rowvec c = k;”這樣的聲明?

即使其中有=rowvec<int> c=k; 是復制初始化,並使用復制構造函數而不是復制分配運算符。

由於您的類沒有定義一個,因此將使用僅執行成員級復制的默認類。 那只會復制指針,這會導致雙精度釋放,因為ck的析構函數都將在同一指針上調用free()

給您的類一個適當的復制構造函數(進行深復制),然后應該刪除雙重刪除。

另外,您正在使用C ++。 不要使用calloc / free 使用newdelete

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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