gpt4 book ai didi

c++ - 如何转发声明在命名空间中的类

转载 作者:太空宇宙 更新时间:2023-11-04 12:37:31 24 4
gpt4 key购买 nike

我正在尝试在头文件中使用前向声明来减少使用的 #include 的数量,从而减少用户包含我的头文件时的依赖性。

但是,我无法转发声明使用 namespace 的位置。请参见下面的示例。

文件a.hpp:

#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:

#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:

#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:

#include "consumer.hpp"
#include "a.hpp"

consumer::consumer(const char* const text) : a_(text) {}

void consumer::chat() const {
a_.talk();
}

测试文件main.cpp:

#include "consumer.hpp"

int main() {
consumer c("My message");
c.chat();
return 0;
}

更新:

这是我使用下面的答案精心设计的工作代码。

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

最佳答案

在命名空间 ns1 中转发声明类类型 a:

namespace ns1
{
class a;
}

在多级命名空间中转发声明一个类型:

namespace ns1
{
namespace ns2
{
//....
namespace nsN
{
class a;
}
//....
}
}

您正在使用 a consumer 的成员,这意味着它需要具体类型,您的前向声明不适用于这种情况。

关于c++ - 如何转发声明在命名空间中的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55760266/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com