Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.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++_Oop_Pointers_Struct_Dangling Pointer - Fatal编程技术网

我可以创建一个只能动态分配的结构吗? 在C++中,我能创建一个只能动态分配的结构吗?我想强制执行一种方法,以确保程序员不能静态分配此结构,因为这样做会导致指针悬空,因为我需要在其范围之外使用指针的内容。

我可以创建一个只能动态分配的结构吗? 在C++中,我能创建一个只能动态分配的结构吗?我想强制执行一种方法,以确保程序员不能静态分配此结构,因为这样做会导致指针悬空,因为我需要在其范围之外使用指针的内容。,c++,oop,pointers,struct,dangling-pointer,C++,Oop,Pointers,Struct,Dangling Pointer,您可以创建私有构造函数的结构,这样就没有人可以从中创建,然后创建一个friend函数,创建一个动态分配的对象并返回指向它的指针,如下所示 #include <iostream> struct A{ ~A() { std::cout << "\nA has been destructed"; } private: A(/*args*/) { std::cout << "\nA has been create

您可以创建私有构造函数的
结构
,这样就没有人可以从中创建,然后创建一个
friend
函数,创建一个动态分配的对象并返回指向它的指针,如下所示

#include <iostream>
struct A{
    ~A() {
        std::cout << "\nA has been destructed";
    }
private:
    A(/*args*/) {
        std::cout << "\nA has been created";
    }
    friend A* creatA(/*args*/);

};
A* creatA(/*args*/){
    return new A(/*args*/);
}

int main()
{
    A* ptr = creatA();
    delete ptr;

}
#包括
结构A{
~A(){

std::cout@asmmo已经解释过了,但我想用
模板
s提供类似的解决方案。据我所知,没有语言特性使类只能被动态分配。这意味着我们想要的行为应该被模仿。所以解决方案是让构造函数只对只动态分配类的函数

可能的实施:

#include <utility>

template<typename T, typename... Args>
inline T* create( Args&&... args )
{
    return new T { std::forward<Args>( args )... };
}

class foo
{
    private:
        foo() {}
        foo( int ) { }

        template<typename T, typename... Args>
        friend T* create( Args&&... );
};

class bar
{
    private:
        bar() {}
        bar( int ) { }

        template<typename T, typename... Args>
        friend T* create( Args&&... );
};

int main()
{
    auto f1 = create<foo>( 15 );
    auto f2 = create<foo>();
    auto b1 = create<bar>();
    auto b2 = create<bar>( 14 );
}
#包括
样板
内联T*创建(Args&&…Args)
{

返回新的t{sd::向前/< p>不允许他们自己构造这个结构。有一个名为MaMaxx()的函数,返回一个指向X的指针,类型与AuthMySysRead()和MaMuxUnQuess()的工作方式相同。(这将阻止它被实例化,除非是通过
友元
或成员函数)。然后创建动态创建实例的类的
静态
公共
成员函数。请记住,只有该类的成员或
朋友
才能销毁它。可以声明智能指针类型(例如
std::unique\u ptr
)作为
friend
s,他们可以在需要时销毁对象。@Peter你的意思是将构造函数设为私有吗?@code学徒否,因为只有一个析构函数,而可能有多个构造函数,所以更容易执行析构函数
#include <utility>

template<typename T, typename... Args>
inline T* create( Args&&... args )
{
    return new T { std::forward<Args>( args )... };
}

class foo
{
    private:
        foo() {}
        foo( int ) { }

        template<typename T, typename... Args>
        friend T* create( Args&&... );
};

class bar
{
    private:
        bar() {}
        bar( int ) { }

        template<typename T, typename... Args>
        friend T* create( Args&&... );
};

int main()
{
    auto f1 = create<foo>( 15 );
    auto f2 = create<foo>();
    auto b1 = create<bar>();
    auto b2 = create<bar>( 14 );
}