c++ - para - manual de programacion android pdf
Cómo reenviar declara una clase que está en un espacio de nombres (1)
Estoy tratando de usar las declaraciones de reenvío en los archivos de encabezado para reducir los #incluidos utilizados y por lo tanto reducir las dependencias donde los usuarios incluyen mi archivo de encabezado.
Sin embargo, no puedo reenviar decalre donde se usan los espacios de nombres. Vea el ejemplo a continuación.
a.hpp file:
#ifndef __A_HPP__
#define __A_HPP__
namespace ns1 {
class a {
public:
a(const char* const msg);
void talk() const;
private:
const char* const msg_;
};
}
#endif //__A_HPP__
a.cpp file:
#include <iostream>
#include "a.hpp"
using namespace ns1;
a::a(const char* const msg) : msg_(msg) {}
void a::talk() const {
std::cout << msg_ << std::endl;
}
consumer.hpp file:
#ifndef __CONSUMER_HPP__
#define __CONSUMER_HPP__
// How can I forward declare a class which uses a namespace
//doing this below results in error C2653: ''ns1'' : is not a class or namespace name
// Works with no namespace or if I use using namespace ns1 in header file
// but I am trying to reduce any dependencies in this header file
class ns1::a;
class consumer
{
public:
consumer(const char* const text) : a_(text) {}
void chat() const;
private:
a& a_;
};
#endif // __CONSUMER_HPP__
consumer.cpp implementation file:
#include "consumer.hpp"
#include "a.hpp"
consumer::consumer(const char* const text) : a_(text) {}
void consumer::chat() const {
a_.talk();
}
test - main.cpp file:
#include "consumer.hpp"
int main() {
consumer c("My message");
c.chat();
return 0;
}
ACTUALIZAR:
Aquí está mi código de trabajo muy artificial usando la respuesta a continuación.
a.hpp:
#ifndef A_HPP__
#define A_HPP__
#include <string>
namespace ns1 {
class a {
public:
void set_message(const std::string& msg);
void talk() const;
private:
std::string msg_;
};
} //namespace
#endif //A_HPP__
a.cpp:
#include <iostream>
#include "a.hpp"
void ns1::a::set_message(const std::string& msg) {
msg_ = msg;
}
void ns1::a::talk() const {
std::cout << msg_ << std::endl;
}
consumer.hpp:
#ifndef CONSUMER_HPP__
#define CONSUMER_HPP__
namespace ns1
{
class a;
}
class consumer
{
public:
consumer(const char* text);
~consumer();
void chat() const;
private:
ns1::a* a_;
};
#endif // CONSUMER_HPP__
consumer.cpp:
#include "a.hpp"
#include "consumer.hpp"
consumer::consumer(const char* text) {
a_ = new ns1::a;
a_->set_message(text);
}
consumer::~consumer() {
delete a_;
}
void consumer::chat() const {
a_->talk();
}
main.cpp:
#include "consumer.hpp"
int main() {
consumer c("My message");
c.chat();
return 0;
}
Para reenviar declarar clase de clase a
en un espacio de nombres ns1
:
namespace ns1
{
class a;
}
Para reenviar declare un tipo en múltiples niveles de espacios de nombres:
namespace ns1
{
namespace ns2
{
//....
namespace nsN
{
class a;
}
//....
}
}
Está utilizando a
miembro de un consumer
que significa que necesita un tipo concreto, su declaración hacia adelante no funcionará en este caso.