小编Gra*_*pes的帖子

正确使用智能指针和编程风格

这是思考智能指针和使用原始指针进行非所有权的正确方法吗?

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

这是使用智能指针和所有权的正确方法吗?

c++ c++11

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

std :: unique_ptr继承切片和析构函数

考虑以下功能完备的示例:

#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 列表与继承结合起来?

c++ c++11

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

迭代STL容器并删除/添加多个项目

我的代码中出现的最常见错误之一是在循环期间修改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)

c++ c++11

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

C++中的线程11:接近锁定防护的更好方法是什么?

在以下示例中:

工作线程向向量添加了一些东西:

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)

是否有更好的方法来锁定守卫?

c++ multithreading thread-safety c++11

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

LuaBridge回调(将lua函数传递给c ++)

如何使用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),但这些方法都没有正常工作.

c++ lua binding luabridge

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

在C++中移动向量的值

假设以下基本向量:

 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)

c++ stdvector

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

左边修剪一个没有内存副本的std :: vector

假设我们在内存中读取了一个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个字符.

那么有更好的方法吗?

c++ vector

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