Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从外部类继承的嵌套私有类的正确模式 我试图在C++中实现一个模式,其中嵌套的私有类继承外部类,而私有类通过外部抽象类中的静态工厂方法实例化。_C++_Factory_Inner Classes - Fatal编程技术网

从外部类继承的嵌套私有类的正确模式 我试图在C++中实现一个模式,其中嵌套的私有类继承外部类,而私有类通过外部抽象类中的静态工厂方法实例化。

从外部类继承的嵌套私有类的正确模式 我试图在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

我现在有这段代码,可以编译,但我不确定我是否正确地编译了

Search.h:

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并试图将实现作为参数传递,而是希望基本上不可能这样做。只传递抽象类型,创建实例的唯一方法是通过工厂方法。如果需要的话,以后可以很容易地创建替代实现。