2016-09-29 3 views
0

Ich schrieb eine Funktion, um die Vereinigung von zwei Mengen zu berechnen.C++ - String Array Parameter für SetUnion Funktion

Ich renne in mehrere Kompilierungsfehler und ich glaube, das liegt teilweise daran, wie ich das StringUnion Array gemacht und erklärt habe, aber nichts, was ich tue, funktioniert so weit.

Dies ist meine Header-Datei.

#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 

Und das ist meine Implementierung meiner SetUnion Funktion.

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} 
    } 
} 

Fehler:

|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&)' 

Insert und finden Arbeit als gedacht, und ich war in der Lage Einsatz zu verwenden und Funktionen innerhalb meiner entfernen Funktion und einige andere finden, also warum kann ich sie hier nicht benutzen?

+1

Initialisiere 'StringUnion' wie folgt:' StringSet StringUnion (arrSize); ' – Leon

Antwort

1

In Ihrer Linie

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

Die RHS verwendet die C++ 14 construct that takes an std::size_t, and returns an std::unique_ptr<std::string> internally pointing to an array.

Die LHS ist jedoch ein StringSet Objekt.

Sie haben keinen Konstruktor definiert, der einen solchen Typ verwendet, es ist also ein Problem.

Wenn Sie Ihren Code betrachten, hat StringSet einen std::unique_ptr<std::string> Member, so dass Sie einen ctor hinzufügen könnten, der ein solches Objekt nimmt, und das Member daraus initialisiert. Es ist jedoch unklar, was der Nutzen eines solchen Ctor wäre, wie Sie bereits ein Ctor

StringSet(int capacity); 

haben, die bereits im Wesentlichen das gleiche tut.

Wie Leon schreibt, Sie sollten nur Sie

StringSet StringUnion(arrSize); 
1

Die Fehler haben anstelle der Linie diese benutzen bietet von Ihrem Compiler scheinen ziemlich klar. Lass es uns überprüfen.

  • Umwandlung von std::make_unique ... zu nicht-skalare Typ StringSet angefordert

Es ist wegen der Definition der Funktion std::make_unique, die returns einem std::unique_ptr<T>. Aber Sie versuchen, es einem Wert des Typs StringSet zuzuweisen. Es gibt keinen Konstruktor oder Operator zum Erstellen einer StringSet aus einer std::unique_ptr, so beschwert sich der Compiler, dass er das nicht tun kann.

  • Fehler: keine Anpassungsfunktion für Aufruf 'StringSet::find(StringSet&)'

Ihre Klasse StringSet hat eine operator[], die einen Verweis auf eine auto s = Array2[i];StringSet kehrt so ist vom Typ StringSet.Aber Ihre Funktionen find und insert fragen nach einem std::string. Da es keinen Konstruktor gibt, der eine implizite Konvertierung von StringSet zu std::string liefern kann, beschwert sich der Compiler.

+0

Also, indem ich den Operator [] meiner .h-Datei ändere, um stattdessen eine Zeichenkette zurückzugeben, sollte das etwas ändern? Wenn es sich um eine Referenz handelt, sollte der String-Wert zurückgegeben werden. – TigerCode

+0

Ja, das hat funktioniert. :) Vielen Dank! – TigerCode