从外部类继承的嵌套私有类的正确模式 我试图在C++中实现一个模式,其中嵌套的私有类继承外部类,而私有类通过外部抽象类中的静态工厂方法实例化。
我现在有这段代码,可以编译,但我不确定我是否正确地编译了 Search.h:从外部类继承的嵌套私有类的正确模式 我试图在C++中实现一个模式,其中嵌套的私有类继承外部类,而私有类通过外部抽象类中的静态工厂方法实例化。,c++,factory,inner-classes,C++,Factory,Inner Classes,我现在有这段代码,可以编译,但我不确定我是否正确地编译了 Search.h: namespace ns_4thex { class Search { private: class Implementation; public: static Search & create(); virtual int doIt() = 0; }; class Search::I
namespace ns_4thex {
class Search {
private:
class Implementation;
public:
static Search & create();
virtual int doIt() = 0;
};
class Search::Implementation: public Search {
int doIt();
};
}
Search.cpp:
#include "Search.h"
using namespace ns_4thex;
Search & Search::create() {
return *(new Search::Implementation());
}
int Search::Implementation::doIt() {
return 0;
}
思考?您的示例可能存在内存泄漏。工厂模式应该返回指针类型而不是引用类型。使用它的调用者可以释放分配的内存
Search* Search::create() {
return new Search::Implementation();
}
您的示例可能存在内存泄漏。工厂模式应该返回指针类型而不是引用类型。使用它的调用者可以释放分配的内存
Search* Search::create() {
return new Search::Implementation();
}
静态工厂方法始终返回指针类型。因此,<代码>创建<代码>函数应该在现代C++中返回指针或智能指针。 宣言:
static std::unique_ptr create();
定义:
std::unique\u ptr Search::create(){
返回std::make_unique();
}
完整的代码可能如下所示:
#包括
名称空间ns_4thex{
类搜索{
私人:
课堂实施;
公众:
静态std::unique_ptr create();
虚拟int doIt()=0;
};
类搜索::实现:公共搜索{
int doIt();
};
std::unique_ptr Search::create(){
返回std::make_unique();
}
int Search::Implementation::doIt(){return 0;}
}//名称空间ns\u 4thex
静态工厂方法始终返回指针类型。因此,<代码>创建<代码>函数应该在现代C++中返回指针或智能指针。
宣言:
static std::unique_ptr create();
定义:
std::unique\u ptr Search::create(){
返回std::make_unique();
}
完整的代码可能如下所示:
#包括
名称空间ns_4thex{
类搜索{
私人:
课堂实施;
公众:
静态std::unique_ptr create();
虚拟int doIt()=0;
};
类搜索::实现:公共搜索{
int doIt();
};
std::unique_ptr Search::create(){
返回std::make_unique();
}
int Search::Implementation::doIt(){return 0;}
}//名称空间ns\u 4thex
非常确定return*(newsearch::Implementation())代码>将导致大量内存leaks@AlbertoSinigaglia当引用不再需要时,调用delete不是消费者的责任吗?这看起来像是您正在尝试创建pimpl
模式,还需要学习@MooingDuck谢谢您提供了有用的指针。是的,pimpl模式似乎是一项有趣的研究。我以前在C++中使用过类似于20年前的程序,现在我决定让certified.pretty确信<代码>返回*(新的搜索::实现());代码>将导致大量内存leaks@AlbertoSinigaglia当引用不再需要时,调用delete不是消费者的责任吗?这看起来像是您正在尝试创建pimpl
模式,还需要学习@MooingDuck谢谢您提供了有用的指针。是的,pimpl模式似乎是一项有趣的研究。我以前在C++中使用过类似于20年前的程序,现在我决定要获得认证。最好使用<代码> MaxIOxION/Obj>并返回<代码> UNQuijpPTR 以使所有权变得干净。因此,如果你的评论是回答的话,你就不能用操作符(&)@ PraveRigy Pujuin的地址在引用上调用删除。我会让它成为这个问题的公认答案。@4您代码中的模式似乎很有趣,这是我第一次看到这种设计,您能分享一些用例场景吗?@prehistoricpenguin这是我在C#中使用的模式。我不想使用new并试图将实现作为参数传递,而是希望基本上不可能这样做。只传递抽象类型,创建实例的唯一方法是通过工厂方法。如果需要,可以在以后轻松创建替代实现。最好使用make_unique
并返回unique_ptr
以清除所有权。因此,如果您将注释作为一个答案,则不能使用操作员(&)@prehistoricpenguin的地址对引用调用delete,我会让它成为这个问题的公认答案。@4您代码中的模式似乎很有趣,这是我第一次看到这种设计,您能分享一些用例场景吗?@prehistoricpenguin这是我在C#中使用的模式。我不想使用new并试图将实现作为参数传递,而是希望基本上不可能这样做。只传递抽象类型,创建实例的唯一方法是通过工厂方法。如果需要的话,以后可以很容易地创建替代实现。