我可以创建一个只能动态分配的结构吗? 在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 );
}