Zwracanie referencji do struktury

2018-12-05 14:53
0

C++

Potrzebuję przekazać strukturę przez referencję do różnych przestrzeni nazw i funkcji.
Kompletnie już nie wiem jak zrobić tą referencję i gdzie ją zainicjować :/ przeczytałam co mogłam ale nie znalazłam wystarczającej odpowiedzi, albo po prostu jej nie rozumiem.

Proszę o pomoc

struct struktura
{
    struct & ref_s = struktura;   // czy to powinno być w ogóle w ten sposób i tutaj?
    string nazwa;
    int wartosc = 10;
    int wartosc_druga;
};

Czy może powinnam zrobić

struktura & ref_s = struktura; /

i umieścić inicjację w każdej z przestrzeni nazw / funkcji? Chociaż zainicjować referencję można tylko raz (w sensie tą konkretną).

edytowany 3x, ostatnio: Sandra, 2018-12-05 14:54

Pozostało 580 znaków

2018-12-05 14:59
2

Pole struktury to zmienna. To co jej próbujesz przypisać to typ.
Typy w C++ w zasadzie istnieją tylko podczas kompilacji (nie ma meta danych/refleksji). Jedynym wyjątkiem jest polimorfizm i typeid ale jego funkcjonalność jest bardzo ograniczona.

Może opisz jaką funkcjonalność chcesz zrealizować, a nie jak ja chciałabyś zrealizować, wówczas przedstawimy alternatywy (właściwe rozwiązanie).

Na obecną chwilę mogę ci tylko powiedzieć: "szablony".


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: MarekR22, 2018-12-05 15:00

Pozostało 580 znaków

2018-12-05 15:00
kq
0

Referencję możesz mieć do obiektu, nie do klasy (struktury). Choć to technicznie możliwe, nie ma sensu umieszczać referencji do struktury wewnątrz jej definicji.

Czy masz jakiś konkretny problem, który chcesz rozwiązać, czy to zabawa z językiem?


Pozostało 580 znaków

2018-12-05 15:04
1

Czy chodzi Ci o zwykłe zadeklarowanie argumentów funkcji, jako referencje? To jest właśnie pass by reference:

struct my_struct {
int value;
};

void f(struct my_struct& arg){
    /* doing stuff with arg */
}

Pozostało 580 znaków

2018-12-05 15:11
0

Mam zrobić referencje do struktury tak, aby można było ją przekazać do funkcji znajdującej się w przestrzeni nazw 1 i 2.

Generalnie wartości ze struktury mają być używane w kilku funkcjach w tych przestrzeniach nazw (funkcje mają nazywać się tak samo i robić to samo w obu przestrzeniach nazw), ich wartość ma się zmieniać zależnie od liczby podanej przez użytkownika.

Niestety nie ma to żadnej funkcjonalności "logicznej", że tak powiem. Miało to niby ułatwić zrozumienie jak działa referencja. No cóż mi nie pomogło.

Pozostało 580 znaków

2018-12-05 15:16
kq
2

Bo to jest zadanie typu "jak rozumiesz jak działa referencja, to pomoże zrozumieć jak działa referencja".

namespace ns1
{
struct x { int val; };
void set_42(x& ref) {
    ref.val = 42;
}

namespace ns2
{
struct x { int val; };
void set_0(ns1::x& ref) {
    ref.val = 0;
}

void set_1(x& ref) {
    ref.val = 1;
}
}

int main()
{
    ns1::x x{1337};
    std::cout << x.val << '\n';
    ns1::set_42(x);
    std::cout << x.val << '\n';
    ns2::set_0(x);
    std::cout << x.val << '\n';
    //ns2::set_1(x); // ERROR
}

(pisane z palca)

Może o coś takiego chodzi, ale nie jestem pewien


edytowany 1x, ostatnio: kq, 2018-12-05 15:16

Pozostało 580 znaków

2018-12-05 15:21
0

Tutaj zadeklarowałeś struktury w poszczególnych przestrzeniach nazw, a w moim przypadku struktura ma być zadeklarowana poza nimi i odnosić się do obu przez zakres

Pozostało 580 znaków

2018-12-05 15:21
2

Może tak jak powyżej, albo tak(liczba podana przez użytkownika to u mnie parametr funkcji)?

#include <iostream>

struct my_struct {
int value;
};

namespace space1{
    void f(struct my_struct& arg, int par){
        arg.value = par;
    }
}

namespace space2{
    void f(struct my_struct& arg, int par){
        arg.value = par;
    }
}
int main() {
    struct my_struct a_struct;
    space1::f(a_struct, 1);
    std::cout <<a_struct.value << "\n";
    space2::f(a_struct, 42); 
    std::cout <<a_struct.value << "\n";
    return 0;
}

A już miałem pisać że to będzie do zrobienia przez czytelnika ;​) - kq 2018-12-05 15:21
Tutaj chyba będzie najtrafniej zaraz sprawdzę u siebie co mi wyjdzie dziękuję - Sandra 2018-12-05 15:22

Pozostało 580 znaków

2018-12-05 16:40
0

A więc tak:

  1. Czy da się przekazać jakoś tą strukturę do samej przestrzeni nazw żeby już nie załączać jej do każdej funkcji?
  2. Argumenty wejściowe dla funkcji są podawane w funkcji main. Tam są wywołania funkcji dla funkcji z przestrzeni nazw, a co za tym idzie jeśli przekazuje strukturę przez referencję na każdą z funkcji to mam za mało argumentów na jej wywołanie :/
struct struktura
{
    string nazwa;
    int wartosc = 10;
    int wartosc_druga;
};

 namespace 1
 {
  struktura struktura_2;
 }
        namespace 2
        {
            struktura struktura_1;

            int dodaj(int plus)
            {

                if (plus >= 1 )
                {
                    struktura_1.wartosc++;
                    struktura_1.wartosc_druga++;

                    2::struktura_2.wartosc--;
                }
                return 0;
            }
            int odejmij(int minus)
            {

                if (minus > 5)
                {
                    struktura_1.wartosc_druga--;

                }
                return 0;
            }
        }

                                namespace 2
                                {

                                    int dodaj(int plus)
                                    {

                                        if (plus >= 2 )
                                        {
                                            struktura_2.wartosc++;
                                            struktura_2.wartosc_druga++;

                                            1::struktura_1.wartosc--;
                                        }
                                        return 0;
                                    }
                                    int odejmij(int minus)
                                    {

                                        if (minus > 3)
                                        {
                                            struktura_2.wartosc_druga--;

                                        }
                                        return 0;
                                    }   
                                }

int main()
{
int wybor,ilosc;
char wybor2;
int plus,minus;

    od_nowa:
    do
    {
                    cout << " " << endl;
                    cout << "[1] 1" << " " << "[2] 2" << " " <<endl;

                    cin >> wybor;
                    switch(wybor)
                    {
                                case 1:

                                cout << "[a] dodaj" << " " << "[b] odejmij" << " " << endl;
                                cin >> wybor2;

                                            switch(wybor2)
                                            {
                                            case 'a':
                                                cout << "Podaj wartosc do dodania" << endl;
                                                cin >> plus;
                                           ....... //poprostu reszta instrukcji

    return 0;
}

Pozostało 580 znaków

2018-12-05 16:51
0

To ci się kompiluje?
Przestrzeń nazw raczej nie może zaczynać się od cyfry

using costam::inneCos::Struktura;
// albo
using NowaNazwa = costam::inneCos::Struktura;

Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: MarekR22, 2018-12-05 16:52
zrobiłam na szybko prostszą wersję bo generalnie program jest dłuższy i ma więcej odniesień, ale reszta działa nie idzie mi tylko właśnie zmiana na referencję tutaj. Dotąd było przekazywane normalnie przez wartość i bez struktury, a teraz ma być zmienione i nie wiem jak to zrobić. Tylko ten moment - Sandra 2018-12-05 16:53

Pozostało 580 znaków

Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0