Espacios de nombres en C++ | Conjunto 4 (Sobrecarga e intercambio de datos en diferentes espacios de nombres)

Requisito previo: 
 

En este artículo, discutiremos el concepto de intercambio de datos entre diferentes espacios de nombres, cómo acceder y sobrecargar operadores estándar para trabajar con clases definidas por el usuario dentro de espacios de nombres definidos por el usuario y su implementación. 
En C++ , podemos crear clases dentro de diferentes espacios de nombres y el alcance de esas clases se limita al espacio de nombres en el que se crean. Por lo tanto, debemos acceder a esas clases usando el operador de resolución de alcance (::) .
A continuación se muestra la implementación para comprender la declaración de clases dentro de un espacio de nombres y la inicialización de objetos en el programa:
 

CPP

// C++ program to illustrate the basics
// of classes inside namespaces
#include <iostream>
#include <string>
 
// Declaration of namespace
namespace GeeksforGeeks {
 
// Output string
std::string out = "This is not from (GeeksforGeeks::string) class!";
 
// Class inside GeeksforGeeks namespace
class string {
private:
    std::string s = "Hello! ";
 
public:
    // Make string
    string(const std::string& str)
    {
        s += str;
    }
 
    // Function to get string
    std::string get_str()
    {
        return s;
    }
};
};
 
// Driver Code
int main()
{
    std::cout << GeeksforGeeks::out
              << std::endl;
 
    // Create an object of string class
    // of Test namespace
    GeeksforGeeks::string str("From namespace Test!");
 
    // Print the string
    std::cout << str.get_str()
              << std::endl;
    return 0;
}
Producción: 

This is not from (GeeksforGeeks::string) class!
Hello! From namespace Test!

 

En el programa anterior, podemos ver claramente que el alcance de la clase ‘string’ dentro del espacio de nombres GeeksforGeeks estaba solo dentro del espacio de nombres y la clase fue inicializada por el constructor parametrizado que también cambió la string privada ‘s’ de la string de Clase dentro del espacio de nombres Prueba .
El siguiente programa es la ilustración de los conceptos de sobrecarga de operadores con diferentes objetos de clase de espacio de nombres como parámetros y acceso e intercambio de datos de un espacio de nombres a otro espacio de nombres :
 

CPP

// C++ program to show overloading and
// accessing from different namespaces
#include <iostream>
#include <string>
 
// Declare namespace test_space1
namespace test_space1 {
 
const std::string const_prefix = "(test_space1::string) ";
 
// String class
class string {
private:
    std::string str = "";
 
    // Private default constructor
    string();
 
public:
    // Public parameterized constructor
    string(const std::string& s)
        : str(const_prefix + s)
    {
    }
 
    // Get string function
    std::string get_str() const
    {
        return str;
    }
};
};
 
// Declare namespace test_space2
namespace test_space2 {
 
const std::string const_prefix = "(test_space2::string) ";
class string {
private:
    std::string str = "";
    const std::string check_scope = "test_space2!";
    string();
 
public:
    // Public parameterized constructor
    string(const std::string& s)
        : str(const_prefix + s)
    {
    }
 
    std::string get_str() const
    {
        return str;
    }
    std::string getScopestr() const
    {
        return check_scope;
    }
};
};
 
// Declare namespace test_space3
namespace test_space3 {
 
// Object from another namespace
// (test_space2 in this case!)
const std::string const_prefix = "(test_space3::string) from both nmspaces test_space3 & ";
 
// Class inside namespace test_space3
class string {
    std::string str = "";
    string();
 
public:
    string(const test_space2::string& s)
        : str(const_prefix + s.getScopestr())
    {
    }
 
    // Access function from test_space2
    // and adding a private string of
    // test_space2:: string to str of
    // test_space3
    std::string get_str() const
    {
        return str;
    }
};
};
 
// Overloading << operator for test_space1
std::ostream& operator<<(std::ostream& os,
                         const test_space1::string& s1)
{
    os << s1.get_str();
    return os;
}
 
// Overloading << operator for test_space2
std::ostream& operator<<(std::ostream& os,
                         const test_space2::string& s2)
{
    os << s2.get_str();
    return os;
}
 
// Overloading << operator for test_space3
std::ostream& operator<<(std::ostream& os,
                         const test_space3::string& s3)
{
    os << s3.get_str();
    return os;
}
 
// Driver Code
int main()
{
 
    // String str
    const std::string str("This is a standard string");
 
    // Print the string str
    std::cout << str << std::endl;
 
    const std::string sample1("This is a test_space1 namespace string");
 
    // Declare a test_space1 namespace
    // string class object
    const test_space1::string s2(sample1);
    std::cout << s2 << std::endl;
 
    // Print test_space1 string
    const std::string sample2("This is a test_space2 namespace string");
 
    // std string
    test_space2::string s3(sample2);
 
    // Declare a test_space2 namespace
    // string class object
    std::cout << s3 << std::endl;
 
    // Print test_space2 string
    test_space3::string s4(s3);
 
    // Print string s4
    std::cout << s4 << std::endl;
    return 0;
}
Producción: 

This is a standard string
(test_space1::string) This is a test_space1 namespace string
(test_space2::string) This is a test_space2 namespace string
(test_space3::string) Accessing from both namespaces test_space3 and test_space2!

 

Explicación: 
 

  1. En el programa anterior, hemos creado tres espacios de nombres: test_space1, test_space2 y test_space3 .
  2. Todos estos espacios de nombres tienen una string de clase común en ellos. Hemos creado sus respectivos objetos s2, s3 y s4 que toman diferentes parámetros durante la inicialización.
  3. El espacio de nombres test_space 3 se usa para acceder a los miembros de la clase desde dentro de la clase de string del espacio de nombres test_space2 y, por lo tanto, el constructor de test_space3::string es diferente de los otros dos constructores de clases.
  4. Entonces, podemos acceder a los datos de test_space2 y usarlos en test_space3 . Esto muestra la Accesibilidad y el Intercambio de Datos entre diferentes Namespaces y sus Clases.

Publicación traducida automáticamente

Artículo escrito por kaushik_C y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *