我可以创建一个只能动态分配的结构吗?
Can I create a struct that can only be dynamically allocated?
在 C++ 中,我可以创建一个只能动态分配的结构吗?我想强制执行一种方法来确保程序员不能静态分配此结构,因为这样做会导致悬空指针,因为我需要在其范围之外使用指针的内容。
您可以创建一个 struct
私有构造函数,这样就没有人可以从中创建,然后创建一个 friend
函数来创建动态分配的对象和 returns 指向的指针它,如下。
#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;
}
使用智能指针和@Peter 建议会更好
#include <iostream>
#include <memory>
struct A{
A(/*args*/) {
std::cout << "\nA has been created";
}
friend std::default_delete<A>;
private:
~A() {
std::cout << "\nA has been destructed";
}
};
int main()
{
std::unique_ptr<A> ptr = std::make_unique<A>(/*Args*/);
}
@asmmo 已经解释过了,但我想用 template
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 );
}
在 C++ 中,我可以创建一个只能动态分配的结构吗?我想强制执行一种方法来确保程序员不能静态分配此结构,因为这样做会导致悬空指针,因为我需要在其范围之外使用指针的内容。
您可以创建一个 struct
私有构造函数,这样就没有人可以从中创建,然后创建一个 friend
函数来创建动态分配的对象和 returns 指向的指针它,如下。
#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;
}
使用智能指针和@Peter 建议会更好
#include <iostream>
#include <memory>
struct A{
A(/*args*/) {
std::cout << "\nA has been created";
}
friend std::default_delete<A>;
private:
~A() {
std::cout << "\nA has been destructed";
}
};
int main()
{
std::unique_ptr<A> ptr = std::make_unique<A>(/*Args*/);
}
@asmmo 已经解释过了,但我想用 template
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 );
}