Zwracanie referencji do struktury

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ą).

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".

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?

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 */
}
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.

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

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

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

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;

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