C++ C++;成员变量初始化,但首先在其中执行一些工作
我有以下课程:C++ C++;成员变量初始化,但首先在其中执行一些工作,c++,class,object,C++,Class,Object,我有以下课程: class MyClass { public: MyClass(string something); ~MyClass(); private: some_namespace::some_class_name my_variable_name; }; 使用以下构造函数定义: MyClass::MyClass(string path) { string other = "jwrhkfg"; my_va
class MyClass {
public:
MyClass(string something);
~MyClass();
private:
some_namespace::some_class_name my_variable_name;
};
使用以下构造函数定义:
MyClass::MyClass(string path) {
string other = "jwrhkfg";
my_variable_name = some_namespace::some_class_name(path+other)
}
我正在尝试将我的变量\u name
初始化为依赖于路径的内容。我知道我可以使用初始值设定项列表:
MyClass::MyClass(string path) : my_variable_name(path+other) {}
但是如果我需要在路径
字符串上进行大量处理,然后初始化我的变量名
,该怎么办?如果我需要这样做怎么办:
MyClass::MyClass(string path) {
string other = "jwrhkfg";
if (path="site.com") {
other = "oritrot";
} else {
other = "hsghkr";
}
my_variable_name = some_namespace::some_class_name(path+other)
}
如果
s出现在初始值设定项列表中,我无法将其放入
我认为上面的代码可以工作,因为我只声明了名称my_variable\u name
,但没有定义它,所以我可以在构造函数中执行,但当我执行时:
MyClass my_object = MyClass("some_string");
我知道一些类的名称没有构造函数(因为默认构造函数有一个参数,在这里它试图初始化,即使我没有初始化它,只是声明了一个参数。将您的成员改为智能指针:
class MyClass {
public:
MyClass(string something);
~MyClass();
private:
std::unique_ptr<some_namespace::some_class_name> my_variable_name;
};
MyClass:MyClass(string path) {
string other = "jwrhkfg";
my_variable_name = std::make_unique<some_namespace::some_class_name>(path+other);
}
class-MyClass{
公众:
MyClass(字符串);
~MyClass();
私人:
std::唯一的\u ptr我的\u变量\u名称;
};
MyClass:MyClass(字符串路径){
字符串other=“jwrhkfg”;
my_variable_name=std::使_唯一(路径+其他);
}
我无法将这些ifs放入初始化列表中
您可以使用函数确定值,并在初始化列表中使用该值:
string MyClass::getOther(string path) {
if (path == "site.com") {
return "oritrot";
}
return "hsghkr";
}
MyClass::MyClass(string path) : my_variable_name(path + getOther(path)) {
}
三元条件也适用于您的简单情况:
MyClass::MyClass(string path)
: my_variable_name(path + (path == "site.com")?"oritrot":"hsghkr") {
}
此外,如果您不想创建一个单独的函数仅用于初始化列表,可以使用lambdas:
MyClass::MyClass(std::string path)
: my_variable_name(
[&]() -> some_namespace::some_class_name
{
// do work here and return desired value
string other = "jwrhkfg";
if (path="site.com") {
other = "oritrot";
} else {
other = "hsghkr";
}
return some_namespace::some_class_name(path+other);
}() /*call lambda immediately*/ )
{}
虽然这是事实,但在这种情况下可以使用三元表达式(正如user0042所指出的),使用lambda的方法更通用,并且可以适用于任何复杂的初始化情况。为什么它适用于对象“unique\u ptr”但不是针对我的对象类型?有什么区别吗?unique\u ptr
是围绕some\u namespace::some\u class\u name*
的包装器。它是默认构造函数,用nullptr
初始化它。MyClass my\u对象的创建不会调用unique\u ptr的构造函数而不带参数吗?我明白。默认构造函数不带参数参数将被调用。如果某个类的名字有一个没有参数的构造函数,它也会工作。很好。但是为什么C++会自动启动我声明的所有对象?它与java是如此不同……当代码> MyClass < /COD>将死亡时,智能指针将自动释放分配的内存,因此你不必编写<代码>删除MyOx变量名。
在析构函数中。此外,默认情况下,它会初始化指向nullptr
的内部指针。这不太容易出错,因为在手动执行所有这些操作时,您可能会忘记初始化指针(最终导致指向垃圾内存的指针),或者忘记删除它(最终导致内存泄漏).你完全没有理解a的意思。请阅读链接文章。