我正在学习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时间。
是否可以在没有实例的情况下声明变量?
答案 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_ptr
或std::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;
}
让我知道您的想法。