相关疑难解决方法(0)

c ++中的多态性,父类向量中的类型丢失

我有一个类A,它是类B和C的父类.还有一个类X,它是Y和Z的父类.

class A {};
class B : public A {};
class C : public A {};


class X
{
    void foo(A) { std:: cout << "A"; }
};

class Y : public X
{
    void foo(B) {std::cout << "B"; }
};

class Z : public X
{
    void foo(c) {std<<cout <<"C"; }
};

int main()
{
    B b;
    C c;

    Y y;
    Z z;

    y.foo(b);//prints B // b is a B, and Y::foo takes a B, hence print B
    y.foo(c);//prints …
Run Code Online (Sandbox Code Playgroud)

c++ oop polymorphism

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

同步push_back和std :: thread

我的代码

void build(std::vector<RKD <DivisionSpace> >& roots, ...) {
  try {
    // using a local lock_guard to lock mtx guarantees unlocking on destruction / exception:
    std::lock_guard<std::mutex> lck (mtx);
    roots.push_back(RKD<DivisionSpace>(...));
  }
  catch (const std::bad_alloc&) {
    std::cout << "[exception caught when constructing tree]\n";
    return;
  }
}
Run Code Online (Sandbox Code Playgroud)

现在,实际工作应该连续进行,而不是并行进行.

构造函数RKD可以与其他构造函数并行运行RKD.然而,推回物体std::Vector是一个关键部分,对吗?

我要构建的对象的数量是已知的.在实践中它将在[2,16]范围内.理论上它可以是任何正数.

此外,我对它们将被插入容器的顺序并不感兴趣.

所以我可以这样做:

RKD tree = RKD(...);
mutex_lock(...);
roots.push_back(tree);
Run Code Online (Sandbox Code Playgroud)

然而,这意味着复制,不是吗?

我应该怎么做才能使我的代码并行?


由于这个答案,我决定使用锁(而不仅仅是互斥锁).

c++ multithreading synchronization vector c++11

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

我应该总是在C++ 11中使用智能指针

从c ++ 11开始,我可以在不创建和删除原始指针的情况下编写代码.但这是正确的方法 - 我应该总是使用智能指针(共享,独特或弱)或者是否有我应该自己删除对象的情况?

c++ shared-ptr c++11

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

Smartpointers等效

对于此代码,C++中有与智能指针相同的编码?

在External.cpp中:

class ExampleClass {...};

ExampleClass* function()
{
  ExampleClass *ptr = new ExampleClass();
  ptr->doSomething();
  return ptr;
}
Run Code Online (Sandbox Code Playgroud)

在Another.cpp中我想做这样的事情,怎么做?:

ExampleClass *ptr2 = function();
Run Code Online (Sandbox Code Playgroud)

c++ oop smart-pointers

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

如何清除动态分配的内存,这是在堆中?

请查看以下代码

#include <iostream>

using namespace std;

class Memory
{
private:
    int *memory;

public:
    Memory()
    {
        memory = new int[3];

        for(int i=0;i<3;i++)
        {
            memory[i] = i;
            cout << memory[i] << endl;
        }
    }

    ~Memory()
    {
        delete[] memory;
    }
};

int main()
{
    cout << "Running" << endl;

    Memory m;
    // do I have to invoke ~Memory() ?

    int *secondMemory = new int[5];
    //How to clear the memory of 'secondMemory' ?

    system("pause");
    return 0;


}
Run Code Online (Sandbox Code Playgroud)

在这里,我已经清除memory了类的析构函数中动态分配的数组的内存.但我的问题是

  1. 我必须调用~Memory()吗?
  2. 如何清除'secondMemory'的记忆?

这些问题在代码的适当位置作为注释询问.请帮忙!

编辑 …

c++ pointers destructor visual-studio-2010

-3
推荐指数
1
解决办法
2万
查看次数