小编Enn*_*eon的帖子

C++ 11构造函数(大括号)的区别

我对C++很陌生并观察到,以下代码行的行为不同

MyClass c1;
c1.do_work() //works
MyClass c2();
c2.do_work() //compiler error c2228: left side is not a class, structure, or union.
MyClass c3{};
c3.do_work() //works
Run Code Online (Sandbox Code Playgroud)

头文件为

class MyClass {
public:
    MyClass();
    void do_work();
};
Run Code Online (Sandbox Code Playgroud)

你能解释一下,创建对象的三种方式之间的区别是什么?为什么第二种方式会产生编译错误?

c++ constructor most-vexing-parse c++11

4
推荐指数
2
解决办法
378
查看次数

返回C++对象 - 最佳实践

我是C++的新手,我遇到了以下问题:

想象一下,您有一个创建新对象并返回此对象的函数.这样做的最佳方法是什么?我找到了3种不同的解决方案.

解决方案1使用复制构造函数

MyClass getMyClass() {
    MyClass obj;
    //work with obj, set values...
    return obj;
}
Run Code Online (Sandbox Code Playgroud)

据我所知,你创建一个新对象,复制该对象,销毁第一个对象并返回复制的对象.所以我创建了两个对象,但我只需要一个.是对的吗?

解决方案2在堆上创建对象并使用指针

MyClass* getMyClass() {
    MyClass* obj = new MyClass();
    //work with obj, set values...
    return obj;
}
Run Code Online (Sandbox Code Playgroud)

这似乎是最糟糕的解决方案,您必须自己进行内存管理.

解决方案3将对象作为参数传递

MyClass getMyClass(MyClass& obj) {
    //work with obj, set values...
    return obj;
}
Run Code Online (Sandbox Code Playgroud)

您可以创建默认对象并在函数中设置所有值.

我也很想使用unique_ptr<MyCLass>但是存在同样的问题,即在unique_ptr保留功能范围时会被破坏.

c++ oop

3
推荐指数
1
解决办法
2241
查看次数

Camel Splitter:根据正文添加单个标题

我正在尝试拆分包含地图的邮件.根据我的教程,我必须使用自定义服务来实现实际的拆分

public class CustomService {
  public List split(Map map) {
    return map.values();
  }
}

//route ...
.split().method(CustomService.class, "split")
   .choice()
   //...
.end()
Run Code Online (Sandbox Code Playgroud)

到目前为止,一切正常.但是,现在我想根据我想在split(Map)消息中设置的一些标题值来不同地路由消息.是否可以在拆分期间为每条消息添加不同的标头值?

java apache-camel

3
推荐指数
1
解决办法
4271
查看次数

C++ 11:使用成员函数和对象启动对象中的线程

我有以下三个文件:

MyClass.h

class MyClass {
private:
    std::thread* thread = NULL;
    void run();
public:
    ~MyClass();
    void start();
}
Run Code Online (Sandbox Code Playgroud)

MyClass.cpp

MyClass:~MyClass() {
    if (thread != NULL)
        thread -> join();
}

void MyClass::run() {
    //do stuff
}

void MyClass::start() {
    thread = &std::thread (&MyClass::run, this);
}
Run Code Online (Sandbox Code Playgroud)

Main.cpp的

int main() {
    MyClass obj{};
    obj.start();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我运行此代码时,我总是得到R6010 - abort() has been called,我不知道为什么abort()被调用.当我在main函数中创建线程时,它可以工作,但出于设计原因,我想启动它MyClass.这有一种方法可以启动线程MyClass吗?

PS: 这个问题很相似,但答案并没有解决我的问题.

c++ multithreading c++11

1
推荐指数
1
解决办法
2863
查看次数