• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

cpp referencje funkcja

Aruba Cloud - Virtual Private Server VPS
0 głosów
291 wizyt
pytanie zadane 13 marca 2020 w C i C++ przez edwardkraweznik Dyskutant (9,930 p.)

Witam:

mam taką klasę:

class Cfg
{
public:
std::string load(std::string cfgval, std::string cfgfile);
};

teraz przykładowo w mainie:

Cfg cfg;
    cfg.load("ppp123");

ale nieraz chciałbym użyć zmiennej i wtedy wypadałoby skorzystać z referencji

Czy jest jakiś sposób aby zadeklarować taką funkcje w taki sposób aby gdy jako argument podam "jakis string"; kobiowała ona normalnie zmienną, a gdy jako argument użyję zmiennej aby korzystała ona z referencji ?

Aktualnie zrobiłem to tak, że funkcja po prostu kopiuje zmienną(działa ale może można inaczej)

1 odpowiedź

0 głosów
odpowiedź 13 marca 2020 przez RafalS VIP (122,820 p.)
wybrane 13 marca 2020 przez edwardkraweznik
 
Najlepsza

Szukasz r-value reference. Jest o tym masa materiałów w dowolnym języku, więc nie będę omawiał. Zapodam tylko małe demo:

#include <iostream>

void fun(const std::string &value)
{
    std::cout << "Referencja" << std::endl;
}

void fun(std::string &&value)
{
    std::cout << "Referencja do r-wartosci" << std::endl;
}

int main()
{
    fun("abc"); // Referencja do r-wartosci
    const std::string value = "abc";
    fun(value); // Referencja
}

EDIT: wystarczy zwykła stała referencja: https://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/

komentarz 13 marca 2020 przez edwardkraweznik Dyskutant (9,930 p.)
edycja 13 marca 2020 przez edwardkraweznik

ok ale:

jeśli przekazuję 2 wartości jako zmienną lub jako "" działa jak trzeba...

ale jeśli chciałbym przekazać tak:

#ifndef cfg_h
#define cfg_h

#include <string>

class Cfg
{
public:
    std::string load(std::string &cfgval, std::string &cfgfile);
    std::string load(std::string &&cfgval, std::string &&cfgfile);
};

#endif
    Cfg cfg;
    std::string ppp = "ppp";
    cfg.load(ppp, "ppp123");

??

nie mogę zakładać, że pierwsza wartość to zmienna czy "" (nie wiem tego co w przyszłości wykorzystam)

mamy 4 kombinacje więc 4 funkcje tworzyć ?

komentarz 13 marca 2020 przez RafalS VIP (122,820 p.)
Jestem głupi :D Przecież zwykła stała referencja wystarczy. W przypadku r-wartosci po prostu przedłuża życie obiektu.
komentarz 13 marca 2020 przez edwardkraweznik Dyskutant (9,930 p.)
edycja 13 marca 2020 przez edwardkraweznik
mam taki błąd:

main.cpp: In function ‘int main()’:
main.cpp:13:27: error: cannot bind rvalue reference of type ‘std::__cxx11::string&& {aka std::__cxx11::basic_string<char>&&}’ to lvalue of type ‘std::__cxx11::string {aka std::__cxx11::basic_string<char>}’
     cfg.load(ppp, "ppp123");

chodzi o to, że potrzebuję funkcji gdzie jako argument podam ("ppp", zmienna) albo (zmienna, zmienna) albo ("ppp","123") i nie wiem jak ją kiedyś wykorzystam. musi mieć kilka tych wariantów...
komentarz 13 marca 2020 przez RafalS VIP (122,820 p.)
Pokaż kod. Obstawiam, że brakuje Ci const'a.
komentarz 13 marca 2020 przez edwardkraweznik Dyskutant (9,930 p.)
#include "cfg.h"

/*std::string Cfg::load(std::string &cfgval, std::string &cfgfile)
{
    
    
    
    
    
    
}
*/

std::string Cfg::load(std::string &&cfgval, std::string &&cfgfile)
{
    
    
    
    
    
    
}
#ifndef cfg_h
#define cfg_h

#include <string>

class Cfg
{
public:
//    std::string load(std::string &cfgval, std::string &cfgfile);
    std::string load(std::string &&cfgval, std::string &&cfgfile);
};

#endif

 

komentarz 13 marca 2020 przez edwardkraweznik Dyskutant (9,930 p.)
edycja 13 marca 2020 przez edwardkraweznik
no tak brakowało tego consta...

weź jeszcze mi wyjaśnij o co w tym chodzi, dlaczego to ma być stałą ?

i jeszcze nie kumam co && robi ? przedłuża życie obiektu czyli jak ? kiedy się powinno stosować ?
komentarz 13 marca 2020 przez RafalS VIP (122,820 p.)

Musi to być stała, bo nie można mieć mutowalnej referencji do wartości tymczasowej.

i jeszcze nie kumam co && robi

to nie jest takie proste, żeby wyjaśnić jednym komentarzem. Jest w internecie masa materiałów o r-value reference. Ale tak w najwiekszym skrócie, to && pozwala odróżnić zwykłą referencję od referencji do obiektu tymczasowego (kategorii wartości jest dużo więcej).

komentarz 13 marca 2020 przez tkz Nałogowiec (42,020 p.)

W przypadku r-wartosci po prostu przedłuża życie obiektu.

W jaki sposób przedłuża?

komentarz 13 marca 2020 przez edwardkraweznik Dyskutant (9,930 p.)
ok tx za pomoc, mniej/więcej kumam, resztę doczytam

Podobne pytania

0 głosów
2 odpowiedzi 4,113 wizyt
pytanie zadane 22 maja 2015 w C i C++ przez Bondrusiek Maniak (61,440 p.)
0 głosów
1 odpowiedź 679 wizyt
pytanie zadane 28 kwietnia 2020 w C i C++ przez Adrian Maj Nowicjusz (160 p.)
0 głosów
2 odpowiedzi 1,098 wizyt
pytanie zadane 28 stycznia 2019 w C i C++ przez Michał_Warmuz Mądrala (5,830 p.)

93,329 zapytań

142,323 odpowiedzi

322,400 komentarzy

62,662 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...