2015-11-13 15 views
5

Używam C++ tylko przez około miesiąc i zastanawiałem się, czy możliwe jest stworzenie własnych niestandardowych funkcji dla czegoś takiego jak ciąg. Na przykład, aby znaleźć rozmiar ciągu znaków, robisz stringname.size(). Ale gdybym chciał wykonać funkcję podobną do stringname.customfunction(), mógłbym zdecydować, co robi customfunction(). Chcę to zrobić, więc mogę utworzyć funkcję .toLower(), która konwertuje cały ciąg na niższy. Przepraszam, jeśli to jest dziwne pytanie, ale jakakolwiek pomoc byłaby ogromnie doceniona.Tworzenie niestandardowych funkcji dla ciągów znaków w C++

Odpowiedz

2

Państwo bezpośrednio nie może, ale powinien być w stanie naśladować to przez dziedziczenie z std::string (lub basic_string<char>):

class mystring : public std::string 
{ 
public: 
    void customfunction() { /* ... */ } 
}; 

Uwaga: Jednak robienie tego jest złym pomysłem. Oprócz tego link, o którym wspomina @Cheers and hth. - Alf, Herb Sutter omawia zbytnie wide interface of std::string, a poszerzenie go jeszcze bardziej jest złym pomysłem.

+0

** - 1 ** Pochodzenie z 'std :: string' w celu poszerzenia i tak już rozbudowanego interfejsu jest powszechnie uważane za Bad Practice ™. Właściwe wykonywanie wyprowadzeń jest nietrywialne, np. trzeba mieć konstruktorów w prawo (łatwiej teraz z dziedziczeniem konstruktora, ale nadal), podczas gdy prosta funkcja wsparcia jest trywialna. Zwykle potwierdzam tylko niepoprawne technicznie odpowiedzi, ale ta jest naprawdę zła dla początkujących. –

+0

SO był bardzo slooooow tutaj przez chwilę, ale tutaj jest link do więcej informacji: (http://stackoverflow.com/questions/6006860/why-should-one-not-derive-from-c-std-string-class). Przyjęta i mocno przegłosowana odpowiedź jest niezła - nie jest niczym niezwykłym w przypadku SO - ale istnieją dobre punkty. –

+0

Nie powiedziałem, że to najlepsza praktyka - po prostu przedstawiłem to jako sposób na zrobienie tego. Gdzie pracuję mamy 6 różnych klas ciągów, z których dwa są w domu. Zaktualizuję odpowiedź, aby zauważyć, że jest to zły pomysł. –

4

Tak można tworzyć funkcje niestandardowe, ale nie bezpośrednio jako funkcje składowe istniejącej klasy.

Najprostszym i najlepszym sposobem jest po prostu tworzenie funkcji wolnostojących.

Oznacza to, że nazwiesz to jako customfunction(s).

+0

więc zamiast stringname.customfunction() preferowanym sposobem jest customfunction (ciąg a). W porządku, myślę, że teraz rozumiem. –

3

Możesz to osiągnąć, tworząc własną klasę ciągów, ale tak jak podjąłem, masz na myśli wywołanie czegoś takiego jak np. "THE String".toLower() jak w python na przykład. To jest faktycznie niemożliwe do usunięcia w C++, o ile wiem.

Po raz kolejny twoja najlepsza szansa to zrobić własną klasę, dzięki czemu możesz zadzwonić coś jak MyString("THE String").toLower(). Lub po prostu stworzyć TOLOWER funkcję, która pobiera ciąg i zwraca ciąg toLower("THE String")

1

Może to być nieco zaawansowane i wysoce pogardzane, ale można zmienić rzeczywiste pliki źródłowe. Sugeruję, że tego NIE robisz.

Powinieneś po prostu wykonać prostą funkcję void toLower(std::string str);, która przekonwertowałaby ją dla ciebie. (Można nazwać tę funkcję z toLower(str);.)

Powiązane problemy