繁体   English   中英

可以像我们在 Java 中那样构造 object 来代替 c++ 中的参数吗?

[英]Can an object be constructed in place of an argument in c++ like we do in Java?

在 java 中,这样的事情是可能的(显示为示例)

new Thread(new Runnable() {
    /*.....code.......*/
});

我们在 object 构造函数(线程类)的参数中提供了就地构造和定义的 object( Runnable() )。 我们可以在 c++ 中做类似的事情吗?

我想在我的代码中做的是

void put(int key, int value) {
    store.insert(store.begin(), vector<int> {{key, value}});
}
/**
type(store) = vector<vector<int>>
*/

并避免类似的事情

void put(int key, int value) {
    vector<int> temp{key, value};
    store.insert(store.begin(), temp);
}

首先感谢大家在评论中的帮助和建议。 有什么东西在我脑海里响起,我想我设法找到了答案。 这有效

void put(int key, int value) {
    store.insert(store.begin(), vector<int>({key, value}));
}

说明: vector<int>()是我提供值列表{key, value}来构造向量的构造函数。

除了大家共享的知识。 您可能想查看有关为什么此代码有效的解释

要回答您的第一个问题:您的 Java 代码与可运行文件创建一个匿名 class 与自定义构造函数,类似的东西在 C++ 中不存在(据我所知)。

但是,没有它,C++ 也能正常工作。 可以为线程提供 lambda,如下所示:

thread t([](){
    std::cout << "hi from thread" << std::endl;
});

对于您的另一个问题:向量可以从初始化列表构造,这意味着这些事情是有效的:

vector<int> list_1(4,5);    // take care!! list is 5,5,5,5!
vector<int> list_2{4,5};    // list_2 is 4,5
vector<int> list_3 = {4,5}; // list_3 is 4,5
list_1 = {1,2,3};           // list_1 is now 1,2,3

// all the above are using so called initializer lists

vector<vector<int>> store;
store.insert(store.begin(), {1,3});  // store is {{1,3}}
store.insert(store.begin(), {1,3,3});// store is {{1,3},{1,3,3}}
store = {{4},{7,8},{1,2,3}};         // store is {{4},{7,8},{1,2,3}}

struct KV{int key; int value;};
vector<KV> store2{{1,5},{7,8}};      // store has two KVs,{1,5} and {7,8}
store2.insert(store2.begin(), {3,3});// ... and now also {3,3}

// note:creating a KV by doing KV x{4,5} is called
// uniform initialization. 
// it's the same syntax as list initializers, but they are different 
// things! 

Java 可以定义一个没有名称的类(并实例化它)称为匿名 class。 C++ 不能这样做,您问题中的示例 C++ 代码与您的 java 代码相比是不同的。 您必须在 C++ 中明确定义结构或 class

暂无
暂无

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

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