声明类的变量而不创建它的实例

Declare a variable of a class without creating an instance of it

本文关键字:创建 实例 变量 声明      更新时间:2023-10-16

我正在学习C++。

我想声明一个变量而不创建它的实例。

MyClass variable;
// More code
int main(int argc, char **argv)
{
   // More code
   variable = MyClass(0);
   // More code
}

如果我这样做,并且MyClass只有一个构造函数声明MyClass::MyClass(int value)它就会失败。

我需要将其设置为全局,因为我将在 CallBack 函数上使用它,并且可以将该变量作为参数传递。

而且,我不想在声明变量时创建类的实例,然后在使用构造函数时创建另一个实例。我想我在浪费资源和 CPU 时间。

是否可以在没有实例的情况下声明一个变量?

使用指针延迟实例化。首选智能指针而不是原始指针,这样您就不必担心手动内存管理。

#include <memory>
std::shared_ptr<MyClass> variable;
// More code
int main(int argc, char **argv)
{
   // More code
   variable = std::make_shared<MyClass>(0);
   // More code
}

是使用 std::unique_ptr 还是std::shared_ptr取决于您计划对指针执行的操作。

您可以使用

std::optional

#include <optional>
std::optional<MyClass> variable; // not initialized
int main() {
    if (variable) {
        // enters this if only when initialized
    }
    variable = MyClass(0);
    // Access the contained value:
    MyClass value = *variable;
    int member = variable->member;
}

std::optional类型在 C++17 中可用。如果您的项目被限制为旧版本,则始终可以使用 polyfill

我不确定,但似乎您已经创建了一个构造函数,例如:

MyClass(int v) : value(v) {}

而不是编写默认构造函数,它可能看起来像:

MyClass() {}

因此,编译器在编写以下内容时找不到实例化 MyClass 对象的构造函数:

MyClass variable;

简而言之,当您编写了其他构造函数但还想使用默认构造函数时,您必须显式编写默认构造函数。

而且你的问题有点模糊,当你像上面这样声明一个类的变量时,你确实在创建它的实例。即使这样做

variable = MyClass(0);

您正在创建 MyClass 的临时对象,然后使用赋值运算符将其分配给变量对象。

当你声明它时,你可以用现有的构造函数用一些临时值初始化变量。理想情况下,使用调试时可以轻松识别的值。

MyClass variable(-1);

尽管这样添加执行此操作的默认构造函数可能更有意义。

我想声明一个变量而不创建它的实例。

在您的代码中,您有:

MyClass variable; 

在全局命名空间中声明。这里的变量仍然是 MyClass 的一个实例;它只是具有与功能内不同的存储、链接和寿命。

至于在全局命名空间中声明它并在之后对其进行初始化这是我尝试过的,它似乎对我有用。我不确定这是否是你所追求的,但我认为这可能对你有用。

#include <iostream>
class MyClass {
private:
    int value_;
public:
    MyClass() : value_{ 0 } {}
    explicit MyClass(int value) : value_{ value } {}
    MyClass& operator()(int value) {
        value_ = value;
        return *this;
    }
    int value() const { return value_; }
};
MyClass myClass;
int main() {
    std::cout << myClass.value() << 'n';
    myClass = MyClass(2) << 'n';
    std::cout << myClass.value() << 'n';
    myClass(5);
    std::cout << myClass.value() << 'n';
    std::cout << myClass(8).value() << 'n';        
    return 0;
}

输出

0
2
5
8

让我知道你的想法。