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的意思。请阅读链接文章。