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

时间:2019-07-15 19:42:27

标签: c++

我正在学习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时间。

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

5 个答案:

答案 0 :(得分:4)

您可以为此使用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

答案 1 :(得分:4)

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

#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_ptrstd::shared_ptr取决于您打算如何使用指针。

答案 2 :(得分:1)

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

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

,并且未编写默认的构造函数,看起来像:

MyClass() {}

因此,当您编写时,编译器找不到用于实例化MyClass对象的构造函数:

MyClass variable;

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

您的问题有点含糊,当您声明上述类的变量时,实际上是在创建它的实例。即使在做

variable = MyClass(0);

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

答案 3 :(得分:1)

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

MyClass variable(-1);

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

答案 4 :(得分:0)

  

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

在您的代码中,您拥有:

static void Main(string[] args)
{
    string full_path = @"D:\steam\steamapps\common\Call of Duty Black Ops III\xanim_export\elfenliedtopfan5_anims\pubg\m1911";

    var dir_1 = System.IO.Path.GetDirectoryName(full_path);
    var dir_2 = System.IO.Path.GetDirectoryName(dir_1);
    var common = System.IO.Path.GetDirectoryName(dir_2);

    var specific = full_path.Substring(common.Length+1);
    Console.WriteLine(specific);
    // "elfenliedtopfan5_anims\pubg\m1911"
}

在全局名称空间中声明。这里的变量仍然是MyClass的实例;它与功能内部的存储,链接和生存期不同。

关于在全局名称空间中声明它并随后对其进行初始化 这是我尝试过的方法,它似乎对我有用。我不确定这是否适合您,但是我认为这可能对您有用。

MyClass variable; 

输出

#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;
}

让我知道您的想法。