2016-09-29 2 views
0

J'ai écrit une fonction pour calculer l'union de deux ensembles.C++ - String Array Parameter pour la fonction SetUnion

Je rencontre plusieurs erreurs de compilation et je pense que c'est en partie dû à la façon dont j'ai créé le tableau StringUnion et que je l'ai déclaré mais rien de ce que je fais ne fonctionne jusqu'à maintenant.

Ceci est mon fichier d'en-tête.

#ifndef StringSet_header 
#define StringSet_header 
#include <memory> 
#include <string> 

using std::string; 
using std::unique_ptr; 
using std::make_unique; 

class StringSet{ 
public: 
    //create an empty set 
    StringSet() = default; 
    StringSet(int capacity); 

    //copy a set 
    StringSet(const StringSet &); 

    StringSet& operator[](const int); 

    //Insert a string to the set 
    bool insert(string); 

    //Remove a string from the set 
    bool remove(string); 

    //Test whether a string is in the set 
    int find(string) const; 

    //Get the size of the set 
    int size() const; 

    //get string at position i 
    string get(int i) const; 

    //Return the set union of the set and another StringSet 
    StringSet setunion(const StringSet&) const; 

    //Return the intersection of the set and another StringSet 
    StringSet intersection(const StringSet&) const; 

    //Return the set diffference of the set and another StringSet 
    StringSet difference(const StringSet&) const; 

    //prevent default copy assignment 
    StringSet& operator=(const StringSet&) = delete; 

    int NOT_FOUND = -1; 
    static constexpr int def_capacity {4}; 
private: 
    int arrSize {def_capacity}; 
    int currentSize {0}; 
    unique_ptr<string[]> arr {make_unique<string[]>(def_capacity)}; 

}; 

#endif 

Et ceci est ma mise en œuvre de ma fonction SetUnion.

StringSet StringSet::setunion(const StringSet &Array2) const 
{ 
    StringSet StringUnion = make_unique<string[]>(arrSize); 

    if (currentSize > 0) 
    { 
     for (auto i=0; i < currentSize; i++) 
     { 
      auto s = arr[i]; 
      StringUnion.insert(s); 
     } 
     for (auto i=0; i < Array2.currentSize; i++) 
     { 
      auto s = Array2[i]; 
      if (StringUnion.find(s) == NOT_FOUND) 
      { 
       StringUnion.insert(s); 
      } 
     } 
    } 
    else  
    { 
     auto result = StringSet(); 
     return result;   //return empty StringSet} 
    } 
} 

Erreurs:

|error: conversion from 'std::_MakeUniq<std::basic_string<char> []>::__array {aka std::unique_ptr<std::basic_string<char> []>}' to non-scalar type 'StringSet' requested| 

error: passing 'const StringSet' as 'this' argument discards qualifiers [-fpermissive] 

error: no matching function for call to 'StringSet::find(StringSet&)' 

error: no matching function for call to 'StringSet::insert(StringSet&)' 

Insérer et trouver du travail comme prévu à et j'ai pu utiliser insert et trouver des fonctions au sein de ma fonction de suppression et quelques autres, alors pourquoi je ne peux pas les utiliser ici?

+1

Initialisez 'StringUnion' comme suit:' StringSet StringUnion (arrSize); ' – Leon

Répondre

1

Dans votre

StringSet StringUnion = make_unique<string[]>(arrSize); 

L'ERS utilise le C++ 14 construct that takes an std::size_t, and returns an std::unique_ptr<std::string> internally pointing to an array.

Le LHS, cependant, est un objet StringSet.

Vous n'avez pas défini de constructeur prenant un tel type, c'est donc un problème.

En regardant votre code, StringSet a un membre std::unique_ptr<std::string>, donc vous pouvez ajouter un ctor prenant un tel objet, et en initialisant le membre. Cependant, on ne sait pas quel serait l'avantage d'un tel cteur, comme vous avez déjà un cteur

StringSet(int capacity); 

qui fait déjà essentiellement le même.

Comme l'écrit Leon, vous devez simplement utiliser celui-ci au lieu de la ligne que vous avez

StringSet StringUnion(arrSize); 
1

Les erreurs fournit par votre compilateur semble assez clair. Vérifions-les.

  • conversion de std::make_unique ... type non scalaire StringSet demandé

Il est à cause de la définition de la fonction std::make_unique qui returns un std::unique_ptr<T>. Mais vous essayez de l'affecter à une valeur de type StringSet. Il n'y a aucun constructeur ou opérateur pour créer un StringSet à partir d'un std::unique_ptr, donc le compilateur se plaint qu'il ne peut pas faire cela.

  • erreur: aucune fonction de mise en correspondance pour l'appel à 'StringSet::find(StringSet&)'

Votre classe StringSet a une operator[] qui retourne une référence sur une StringSet si auto s = Array2[i]; est de type StringSet.Mais vos fonctions find et insert demandent un std::string. Comme il n'y a aucun constructeur qui peut fournir une conversion implicite de StringSet à std::string, le compilateur se plaint.

+0

Donc, en modifiant l'opérateur de mon fichier .h [] pour retourner une chaîne à la place cela devrait corriger les choses? Si c'est une référence, il suffit d'indiquer la valeur de la chaîne. – TigerCode

+0

Oui, cela a fonctionné. :) Je vous remercie! – TigerCode