C++不可破坏类
C++ Non-destructible classes
C++中有没有任何方法可以在函数中创建类,然后防止它被破坏?像
class someclass {
public:
int x;
someclass() { x = 0; };
}
someclass::x;
然后在某个地方
someclass * somefunction()
{
someclass somecl ();
return &somecl;
}
所以我们调用函数"somefunction",并获取指向类的指针以供以后使用。只要程序运行/它被其他函数破坏,我就需要它存在。有没有什么方法可以做到这一点,而不将其存储在数组或向量中?
我不确定您正在寻找的是一种只定义一次对象的方法,每次都返回一个指向同一对象的指针,还是创建一个每次都返回新构建对象的工厂函数。如果是第二个,请查看以前的答案。如果是第一个,请检查static
变量。例如,您可以编写
someclass * somefunction()
{
static someclass somecl ();
return &somecl;
}
这样可以确保somecl
在函数最初运行时只定义一次,并且在程序退出之前一直有效。(有关static
变量清理顺序的更精确描述,请参阅此处。(
是的,您必须在堆上分配内存,然后在完成后delete
分配内存。
someclass * somefunction()
{
return new someclass();
}
int main()
{
someclass * myclass = somefunction();
// do stuff with myclass
delete myclass;
return 0;
}
someclass * somefunction()
{
return new somecl ();
}
你非常接近:(
您可以在堆而不是堆栈上创建它:
someclass * somefunction()
{
return new someclass();
}
您可能还想考虑在智能指针中返回它,以明确地转移所有权并控制其生存期。
我不太确定你在做什么,我可以想象两种不同的用例,你想让一个类坚不可摧。
案例1:辛格尔顿
实现这一点的惯用方法是使用在访问器函数中声明的类的静态实例:
class Foo {
public:
static Foo& globalFoo();
private:
Foo() {};
~Foo() {};
};
Foo& Foo::globalFoo() {
static Foo myFoo;
return myFoo;
}
int main() {
Foo& myFoo = Foo::globalFoo();
}
这样,其他代码就不可能构造或销毁Foo
的任何实例,它只能使用globalFoo()
函数提供的一个实例。
案例2:包装分配/解除分配
如果你只想通过某些静态函数强制分配/解除分配,你只需要使构造函数和析构函数都是私有的(就像在singleton的情况下一样(,并将静态函数添加到用于分配/解除的接口:
class Foo {
public:
static Foo* makeFoo();
static void destroyFoo(Foo* aFoo);
private:
Foo() {};
~Foo() {};
};
Foo* Foo::makeFoo() {
return new Foo();
}
void Foo::destroyFoo(Foo* aFoo) {
delete aFoo;
}
int main() {
Foo* myFoo = Foo::makeFoo();
Foo::destroyFoo(myFoo);
}
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 内置函数可查看CPP中的成员变量
- 可组合的lambda/std::函数与std::可选
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- 使用gcc从静态链接的文件中查找可选符号
- 构建可组合有向图(扫描仪生成器的汤普森构造算法)
- 对于结构,表达式必须是可修改的ivalue
- 使外部项目可用于find_package CMake
- 将寄存器设计成可由C和C++访问的外设的最佳实践
- C++Union/Struct位域的实现和可移植性
- 看起来is_nothrow_constructible_v()在MSVC中被破坏了,我错了吗
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 当字段可以为null时,如何使用C++接口在Avro中写入数据
- 在调用其析构函数之前,是否有任何实际理由检查某些东西是否可破坏?
- 可破坏的网格块会导致奇怪的碰撞
- 标准::互斥体是微不足道的可破坏的
- 什么时候可以安全地重复使用来自微不足道的可破坏对象的内存而不进行洗涤
- C++11通过引用捕获的lambdas一般是可破坏的
- 为什么异常总是在具有可破坏堆栈对象的非叶函数中产生开销
- C/C++ 中的可破坏命名作用域