这是思考智能指针和使用原始指针进行非所有权的正确方法吗?
class DisplayObject {
DisplayObject* Parent;
};
class DisplayObjectContainer: public DisplayObject {
std::vector<DisplayObject*> Children;
};
class Stage {
std::vector<std::unique_ptr<DisplayObject>> DisplayObjects;
};
Run Code Online (Sandbox Code Playgroud)
使用
make_unique<DisplayObject>
或创建项目
make_unique<DisplayObjectContainer>
Stage将拥有所有DisplayObject类,但是会有一个DisplayObjectContainer指向Stage拥有的对象的原始指针.
DisplayObject也将有一个家长(可以nullptr).
当我将项目添加到vector(DisplayObjects.back().get())并大量使用时,我也使用Stage的DisplayObjects并获取指向它的对象的指针std::move
这是使用智能指针和所有权的正确方法吗?
考虑以下功能完备的示例:
#include <iostream>
#include <memory>
class A {
public:
A() {
std::cout << "A() \n";
}
~A() {
std::cout << "~A \n";
}
};
class B:public A {
public:
B() {
std::cout << "B() \n";
}
~B() {
std::cout << "~B() \n";
}
};
int main() {
std::cout << "Output: \n";
{
std::unique_ptr<A> TestB(new B());
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是:
Output:
A()
B()
~A
Run Code Online (Sandbox Code Playgroud)
有没有办法B用这样的继承来调用析构函数?我不知道unique_ptrs也有切片问题.当然我可以使用std::unique_ptr<B>但我希望有一个std::vector<std::unique_ptr<A>>并添加继承的项目.
有没有办法将std::unique_ptrs 列表与继承结合起来?
我的代码中出现的最常见错误之一是在循环期间修改STL容器.
在循环执行期间删除或添加元素,因此我经常遇到超出范围的异常.
我的for循环通常看起来像这样:
for (auto& Item : Items) { // Will not work when Items container is modified
//... loop logic
}
Run Code Online (Sandbox Code Playgroud)
当可以删除多个项目时,我使用这个怪物:
for (int Index=Items.size()-1;Index<=0;Index--) {
if (Index<Items.size()) { //Because multiple items can be removed in a single loop
//... loop logic
}
}
Run Code Online (Sandbox Code Playgroud)
这看起来很糟糕,这让我觉得使用第二个选项感觉很糟糕.可以删除多个项目的原因是由于事件,单个事件可以删除任意数量的元素.
下面是一些伪代码来说明何时发生这种情况:
// for each button in vector<button> {
// process button events
// event adds more buttons to vector<button>
// *ERROR* vector<button> is modified during loop.
// }
Run Code Online (Sandbox Code Playgroud)
在另一个示例中,想象一个包含以下项的向量:
// 0 1 2 3 …Run Code Online (Sandbox Code Playgroud) 在以下示例中:
工作线程向向量添加了一些东西:
std::lock_guard<std::mutex> guard(UI::GetInstance().my_mutex);
UI::GetInstance().my_vector.push_back(new_value);
Run Code Online (Sandbox Code Playgroud)
UI Thread检查列表:
while (true) {
std::lock_guard<std::mutex> guard(my_mutex);
//perform my_vector operations and clear at the end
my_vector.clear();
}
Run Code Online (Sandbox Code Playgroud)
我不喜欢锁定每次迭代,有没有更好的方法呢?我希望设置一些像这样的标志,但我不确定bool是否是线程安全的:
工作线程向向量添加了一些东西:
std::lock_guard<std::mutex> guard(UI::GetInstance().my_mutex);
UI::GetInstance().my_vector.push_back(new_value);
UI::GetInstance().my_vector_changed=true; // set a flag
Run Code Online (Sandbox Code Playgroud)
UI Thread检查列表:
while (true) {
if (my_vector_changed) { // only lock on changes
std::lock_guard<std::mutex> guard(my_mutex);
//perform my_vector operations and clear at the end
UI::GetInstance().my_vector.clear();
my_vector_changed=false;
}
}
Run Code Online (Sandbox Code Playgroud)
是否有更好的方法来锁定守卫?
如何使用Luabridge(1.0.2)将函数从LUA传递给C++
local Callback=function()
print("Inside Callback function!");
end
Run Code Online (Sandbox Code Playgroud)
然后将该回调传递给c ++:
self.Background:On("Click",Callback)
Run Code Online (Sandbox Code Playgroud)
"Click"是const std :: string&,但是如何将Callback定义为函数?我尝试了一些方法(void*,std :: function),但这些方法都没有正常工作.
假设以下基本向量:
std::vector<int> numbers;
numbers.push_back(0);
numbers.push_back(1);
numbers.push_back(2);
numbers.push_back(3);
Run Code Online (Sandbox Code Playgroud)
在0和1之间插入6个新数字的有效方法是什么?
这是我现在的方法,但我觉得它效率不高:
for (int new_number=0;new_number<6;new_number++) {
numbers.emplace(numbers.begin()+1+new_number,new_number);
}
Run Code Online (Sandbox Code Playgroud)
我不喜欢这种方法的原因是数字1-3必须被移动6次.有没有办法将这些数字移动一次而不是6次?然后我可以使用这个循环:
for (int new_number=0;new_number<6;new_number++) {
numbers[new_number+1]=new_number;
}
Run Code Online (Sandbox Code Playgroud)
这是我想要完成的:
转移前的矢量:
0 1 2 3
Run Code Online (Sandbox Code Playgroud)
转移后的矢量:
0 X X X X X X 1 2 3
Run Code Online (Sandbox Code Playgroud) 假设我们在内存中读取了一个100MB的大文件:
std::vector<unsigned char> paddedName = { '0', '0', '0', 'T', 'O', 'M'/*... 100MB+ of data ... */ };
Run Code Online (Sandbox Code Playgroud)
如何删除前三个字符并使用填充数据创建一个新向量,同时丢弃旧的向量数据?
这是复制操作的样子:
std::vector<unsigned char> unpaddedName(paddedName.begin() + 3, paddedName.end());
Run Code Online (Sandbox Code Playgroud)
但我们显然不想复制100MB内存只是为了从头开始擦除3个字符.
那么有更好的方法吗?