向列表中添加临时对象,不需要动态内存分配



我正在为嵌入式平台编写代码,因此我不能使用正常的new操作符。

现在我想向列表中添加任意对象,就像这样。

tp.add(DerivedA("David")); 
tp.add(DerivedB("Max"));
tp.add(DerivedC("Thomas"));

出于代码重复的原因,我不想这样写:

DerivedA david("David");
tp.add(david); 
...

一个解决方案,但不是很漂亮的风格是这样的:

tp.add(new (myalloc(sizeof(DerivedB))) DerivedB("John")); 
// using placement-new works

现在我尝试添加一个临时对象,通过指针传递:

tp.add(&DerivedA("David")); 

理论上这可以工作,但是编译器抱怨(有充分的理由)传递一个指针到一个临时对象(-fpermissive)。

是否有一种干净的方法来做我想做的事?

下面是一个完整的例子:

#include <iostream>
using namespace std;
class Base // base class
{
public:
    Base();
    int size;
    char name[100];
};
class Derived:public Base
{
public:
    Derived(char* name);
};
class ThirdParty
{
public:
    void add(Base* obj);
    void addTemp(Base* tempObj);
    Base* list[10];
    int index;
};

void* myalloc(int size){
    void* p;
    // ...
    // allocate memory in a static memory pool
    // ...
    return p;
}
void memcpy(void* to, void* from, int size){
}

int main()
{
    ThirdParty tp;
    // The ugly style:
    tp.add(new (myalloc(sizeof(Derived))) Derived("John")); // using placement-new works
    // The beauty style (compiler complains here):
    tp.addTemp(&Derived("David")); // create temporary object here, which is copied and added to the list
    tp.addTemp(&Derived("Max"));
    tp.addTemp(&Derived("Thomas"));
    return 0;
}

Base::Base()
{
    size = sizeof(Base);
}
Derived::Derived(char *name)
{
    size = sizeof(Derived); // make size of this object available for a base-pointer
}
void ThirdParty::add(Base *obj)
{
    list[index++] = obj;
}
void ThirdParty::addTemp(Base* tempObj)
{
    Base* newObj = (Base*) myalloc(tempObj->size); // let third party allocate memory
    memcpy(newObj, tempObj, tempObj->size); // copy the temporary object
    list[index++] = newObj;
}

如果您使用c++ 11,您可以编写一个转发函数来为您完成这项工作:

template <typename T, typename... Args>
T* make (Args&&... args) {
    return new (myalloc(sizeof(T))) T { std::forward<Args>(args)... };   
}

然后像这样添加一个对象到列表中:

tp.add(make<Derived>("John"));

我现在首选的解决方案是以下宏:

#define m(x) new (myalloc(sizeof(x))) x

现在我可以用下面的代码添加一个新对象:

tp.add(m(Derived("Isabella")));

你能不能重写new来使用myalloc ?如果你不想全局这样做,你当然可以对Base

这样做

相关内容

  • 没有找到相关文章

最新更新