我对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++的新手,我遇到了以下问题:
想象一下,您有一个创建新对象并返回此对象的函数.这样做的最佳方法是什么?我找到了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保留功能范围时会被破坏.
我正在尝试拆分包含地图的邮件.根据我的教程,我必须使用自定义服务来实现实际的拆分
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)消息中设置的一些标题值来不同地路由消息.是否可以在拆分期间为每条消息添加不同的标头值?
我有以下三个文件:
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: 这个问题很相似,但答案并没有解决我的问题.