繁体   English   中英

C++ 使用构造函数同时创建一个带有数组的 object

[英]C++ Create an object with array simultaneously with the constructor

因此,我一直在探索如何使用我制作的自定义模板 class 创建动态数组。

#include <iostream>
#include <vector>

//HOW TO SET CLASS INTO DYNAMICAL ARRAY WITH VECTOR


//CREATE A CLASS
class User{
    std::string name;
public:
    User(){
    }
    User(std::string name){
        this->name = name;
    }
    void set_name(std::string name){
        this->name = name;
    }
    std::string get_name(){
        return name;
    }
};

int main(){
    //SET A NORMAL ARRAY THAT CAN CONTAIN AN OBJECT
    User user[1];

    //DO WHATEVER WITH THE USER[0] TO SET EVERYTHING THAT LATER WILL BE PUT IN VECTOR
    user[0].set_name("Meilianto");
    std::cout << "user[0]: " << user[0].get_name() << std::endl;

    //CREATE A DYNAMICAL ARRAY WHICH IS VECTOR
    std::vector<User> vuser;

    //PUSHBACK TO THE VECTOR AS "FIRST ELEMENT" BY PUTTING "USER[0]" AS AN ARGUMENT
    vuser.push_back(user[0]);
    std::cout << "vuser[0]: " << vuser[0].get_name() << std::endl;

    //YOU CAN "MODIFIED" THE "USER[0]" AND ADD AGAIN AS THE "SECOND ELEMENT" OF VECTOR
    user[0].set_name("Meilianto1");
    vuser.push_back(user[0]);
    std::cout << "vuser[1]: " << vuser[1].get_name() << std::endl;

    //YOU CAN EVEN "MODIFIED" THE "FIRST ELEMENT" BY CALLING THE "METHOD" OF IT
    vuser[0].set_name("Hantu");
    std::cout << "vuser[0]: " << vuser[0].get_name() << std::endl;

    //THE QUESTION HERE, CAN I DECLARE ARRAY TOGETHER WITH THE CONSTRUCTOR?
    User user1[1]("Bebek");
    
    //AND AFTER THAT I CAN ADD THAT OBJECT STRAIGHT AWAY TO VECTOR WITHOUT ASSIGNING ALL THE 
    //MEMBERS ONE BY ONE

    return 0;
}

如果您在我的代码中阅读了我的评论,我想要做的是,如果我在创建 object 时立即构建而不是一一分配所有成员,这可能会更快,这将花费更多代码。 我想如果将来会有一个object,成员很多,需要一一分配。 它不会有效率。

编辑:我将用户用户 [0] 编辑为用户用户 [1],谢谢

如果您使用的是现代标准 C++,那么您可以这样做

std::vector<User> vuser {
 {"Meilianto1"}, 
 {"Hantu"},
 {"Bebek"}
};

其中每对带有字符串的内括号调用User构造函数,而外括号对使用一系列User调用std::vector<User>构造函数

这里的问题是,我可以和构造函数一起声明数组吗?

 User user1[1]("Bebek");

您可以为此使用 列表初始化,对于 arrays 以及向量:

User users[] { std::string("Herbert"), std::string("Anton") };
std::vector<User> vusers { std::string("Herbert"), std::string("Anton") };

我可以将 OBJECT 直接添加到向量,而不需要一个一个地分配所有成员吗

您可以使用先前定义的数组的元素初始化向量,如下所示:

std::vector<User> v2users(std::cbegin(users), std::cend(users));

顺便说一句:注意User user[0]; 在您的代码中定义了一个没有元素的数组,即大小为 0,这很少有意义。 访问user[0]会导致未定义的行为

的,你可以!

User users[]{ User{ "one" }, User{ "two" } };

// Construct vector from iterator-pair:
std::vector<User> users_vector{ std::cbegin(users), std::cend(users) }; 

您可以使用emplace_back方法或push_back和临时 object 来添加向量。 例如;

vuser.emplace_back("Meilianto1"); // 1 
vuser.push_back(User{"Meilianto1"}); // 2

第一个将 arguments 传递给构造函数。 第二个将变量移动到向量。 老实说,会有复制省略,这就是为什么没有移动或复制的原因。 只是它会构造变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM