如何在不创建实例的情况下调用类方法
How to call a class method without creating an instance
在Java
中,您可以调用类方法而不使用类的实例创建变量,并且仍然可以调用该类方法:
new Database().GetSomeValuesOutOfSomeTableJava();
如果我尝试对C++
执行相同的操作,则会出现错误:
new Database()->GetSomeValuesOutOfSomeTableCpp();
我做错了吗?我怎样才能达到相同的结果?
new Database().GetSomeValuesOutOfSomeTableJava();
这确实会创建一个实例(注意new
);然后它放弃它供垃圾回收器清理。
在C++中,您可以创建一个临时对象,而无需new
:
Database().GetSomeValuesOutOfSomeTableCpp();
这将执行与 Java 示例相同的操作,只是临时将在此语句末尾确定性地销毁。
你是否应该创建这样的临时是另一回事。
你会这样做:
(new Database())->GetSomeValuesOutOfSomeTableCpp();
但是你会泄漏内存,所以这是一个非常糟糕的主意。另外,请注意,这(在 C++ 和 Java 中)确实会创建一个新实例。它只是一个未存储在变量中的新实例。
更好的版本可能是这样的:
{
Database temporary;
temporary.GetSomeValuesOutOfSomeTableCpp();
}
使用 RAII 初始化并正确销毁临时,并使用范围来确保它存在的时间不会超过您希望的时间,并搞砸以后的任何范围。
或者,正如Mike Seymour所指出的,你可以这样做:
Database().GetSomeValuesOutOfSomeTableCpp();
这也将避免内存泄漏。
相关文章:
- 如果 std::vector::clear() 不是静态的,如何在没有实例的情况下调用它?
- C++ - 如何在不调用其属性的情况下调用类?
- C++ 在不释放内存的情况下调用析构函数
- Python在不引用类名的情况下调用类函数
- 为什么在这种情况下调用非常量右值移动构造函数?
- 是否可以在没有显式专用化的情况下调用可变参数模板函数?
- 使用按引用调用时,不能在没有对象的情况下调用成员函数 const
- 您可以在不调用构造函数的情况下调用攻击器吗?
- 命名空间:不能在没有对象的情况下调用成员函数
- 哪些语言将在没有显式桥接的情况下调用C++
- 如何在不重新索引顶点的情况下调用"boost::remove_vertex"?
- C :在没有对象实例的情况下调用非静态成员函数
- 在不实例化的情况下调用不同派生类的虚拟方法
- C 如何在没有错误的情况下调用void函数
- 在MSVC上的数组初始化期间,destructor在不复制或移动构造方的情况下调用
- 在不指定实例化的情况下调用类模板的静态方法的方法
- 为什么INVOKE总是取消引用数据成员,而不是在可能的情况下调用
- 是否可以在不实例化派生类的情况下调用该类的虚拟函数
- 无法在没有对象的情况下调用成员函数(尽管我相信我确实初始化了它)
- 为什么在没有赋值运算符的情况下调用转换构造函数