2017-10-18 1 views
0

J'écris une classe de modèle avec le paramètre non typeClasse de modèle C++ avec paramètre non-type: comment surcharger l'opérateur assign?

class Test 
{ 
public: 
    Test() { std::cout << "Test::Test()" << std::endl; } 

    Test(Test const&) { std::cout << "Test::Test(Test const&)" << std::endl; } 

    ~Test() { std::cout << "Test::~Test()" << std::endl; } 

    Test& operator=(Test const&) 
    { 
      std::cout << "Test& Test::operator=(Test const&)" << std::endl; 
      return *this; 
    } 

    void print() const { std::cout << "Test::print() const" << std::endl; } 
    void print() { std::cout << "Test::print()" << std::endl; } 
}; 

Au-dessus est mon "test" classe pour tester ma classe de modèle et

template <typename T, unsigned int n> 
class Array 
{ 
private: 
    T* value; 
public: 
    Array() { 
     this->value = new T[n]; 
    } 

    ~Array() { 
     delete[] this->value; 
    } 

    Array* operator=(const Array* arr) 
    { 
     this->value = arr->value; 
     return this->value; 
    } 

    T& operator[](int a) { 
     return this->value[a]; 
    } 

    unsigned int size() 
    { 
     return n; 
    } 
}; 

Au-dessus est ma classe de modèle avec non type paramètre.

int main(int, char*[]) 
{ 
/*first*/ Array<Test, 3> arr_1; 

/*second*/ Array<Test, 3> arr_3 = arr_1; 

return 0; 
} 

Dans mon fichier main.cpp,

Je fais l'objet de test de classe 3 fois avec le premier,

et je veux surcharger l'opérateur assign faire le second.

J'ai essayé avec

Array* operator=(const Array* arr) 
{ 
    this->value = arr->value; 
    return this->value; 
} 

mais ça segfaults »après avoir appelé la destructor infiniment.

Je voudrais savoir comment puis-je écrire la surcharge de l'opérateur assign dans ce cas.

Merci!

+0

Généralement, un opérateur d'affectation prend une * référence * pour un objet du même type, pas un pointeur * *. Était-ce intentionnel? – templatetypedef

+0

'Array arr_3 = arr_1;' utilise un constructeur de copie, pas un opérateur d'affectation de copie. Dans tous les cas, 'Array' ne met pas explicitement en oeuvre non plus; les deux sont implicitement définis. –

+0

@templatetypedef, j'ai essayé avec Array & operator = (const Array & arr) mais cela n'a pas changé le résultat. Peut-être que je n'implique pas correctement la méthode. –

Répondre

1

Pour mettre en œuvre une copie, vous avez besoin quelque chose comme ceci:

// Copy constructor. When you write Array b = a, the compiler actually calls this, not operator= 
Array(const Array& src) 
{ 
    this->value = new T[ n ]; 
    std::copy_n(src.value, n, value); 
} 
Array& operator=(const Array& src) 
{ 
    // No need for new[], operator= is called after the object is already constructed. 
    std::copy_n(src.value, n, value); 
    return *this; 
} 

Cependant, vous ne devriez pas réinventer la roue. Il existe déjà des classes de modèles décentes dans la bibliothèque standard C++. Si vos baies sont petites (par exemple 3), utilisez std::array<Test, 3>. Si vos tableaux sont volumineux et que vous voulez les garder hors de la pile, vous pouvez utiliser std::unique_ptr<std::array<Test, 3>> ou std::vector<Test>

+0

Merci beaucoup pour votre réponse! –