不用new,怎么调用构造函数??

flashboy 2004-07-20 10:08:32
现在碰到这么个问题:

我定义了个类,比如:
class CTest
{
public:
CTest();
~CTest();
public:
CString s;
}

我现在不使用new来构造,而是使用类似于:
CTest* test = (CTest*)malloc(sizeof(CTest));
这样CTest的构造函数与CString的构造函数都无法调用
test->CTest();//提示是错误的。
test->s.CString();//提示是错误的
由于没有执行构造函数,所以在执行 test->s = "hello"; 的时候会报错!

该怎么解决这个问题呢??
...全文
668 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
flashboy 2004-07-23
  • 打赏
  • 举报
回复
谢谢大家的意见,看样子placement new的确是最好的选择了!!接帖子了!!
jiajie828 2004-07-23
  • 打赏
  • 举报
回复
关注
lifeequation 2004-07-23
  • 打赏
  • 举报
回复
对象无非就是存在于stack内存和heap内存,如果你要在heap内分配对象,就得使用new或者是静态对象,new操作符他有两个基本的方面:1,首先分配sizeof(yourObject)的内存,2,然后在这块内存上调用ctor进行对象的初始化.如果你是使用stack内存的话,直接定义一个类对象就可以了,用不着new操作符,也照样调用ctor.
像你这种情况,我觉的你可以使用内存池策略可以解决的.
Caps77 2004-07-23
  • 打赏
  • 举报
回复
同意楼上的
关注
ringphone 2004-07-23
  • 打赏
  • 举报
回复
可以重载oprator new,这样:
class CTest
{
public:
CTest();
CTest(int i);
~CTest();

void* operator new(size_t,void* buf){return buf;}
public:
CString s;
}

char* lpbuf = (char*)malloc(sizeof(CTest));
CTest* test = new(lpbuf) CTest;

new仅返回malloc分配的内存首址,
这样既调用了构造函数,又把对象放置到了你malloc的那块内存,而且你还可以调用复制构造函数,即:CTest* test = new(lpbuf) CTest(1);

不过释放对象时不能用delete,因为内存是malloc的,所以必须显式调用析构函数:
test->CTest::~CTest();
pomelowu 2004-07-22
  • 打赏
  • 举报
回复
《精通MFC》里1.3.2.2部分的构造不错。
flashboy 2004-07-21
  • 打赏
  • 举报
回复
我想得去看看new的实现,他是怎么去调构造的??
pomelowu 2004-07-21
  • 打赏
  • 举报
回复
CTest test();

这样就能调用构造函数了
habao 2004-07-21
  • 打赏
  • 举报
回复
把某些初始化单独做到一个Init里面,别做到构造里面
flashboy 2004-07-21
  • 打赏
  • 举报
回复
不知道怎么回事情,在控制台程序下编译是正常的,但在MFC DIALOG下却无法编译
flashboy 2004-07-21
  • 打赏
  • 举报
回复
TO genvy(Paul) :

好象编译不过去啊:

:\MFC_TEST\MFC_TESTDlg.cpp(178) : error C2061: syntax error : identifier 'test'
E:\MFC_TEST\MFC_TESTDlg.cpp(181) : error C2143: syntax error : missing ';' before '}'。。。。。。。。。



genvy 2004-07-21
  • 打赏
  • 举报
回复
#include<new>

void* test = (void*)malloc(sizeof(CTest));
new(test) CTest();
flashboy 2004-07-21
  • 打赏
  • 举报
回复
我说明一下我问这个问题的用意,我现在在做一个服务器端的程序,有一个Class类数据需要动态创建,同时节点数可能很大 我想用VirtualAlloc在虚拟内存中创建,不想使用new。所以才会有这个问题。这个Class中有很多其他CLASS的对象成员。


to liu_feng_fly(笑看风云 搏击苍穹 衔日月) :
谢谢,placement new 怎么在VC中无法编译通过??

to phourm , newbibe(抵制日货) :
谢谢!不过在我的CTest中果引用了别人的类例如:CString时候,我就得去一个个找他们的初始化函数,例如CString的初始化函数是:init(),这种情况下比较麻烦,不过没有其他办法的时候也只能这样了。
Linux2001 2004-07-21
  • 打赏
  • 举报
回复
那你就显示调用构造函数好了
liu_feng_fly 2004-07-21
  • 打赏
  • 举报
回复
用placement new
void* test = (void*)malloc(sizeof(CTest));
new(test) CTest();
大脚板 2004-07-21
  • 打赏
  • 举报
回复
去看看深度探索c++对象模型,会有收获的
newbibe 2004-07-21
  • 打赏
  • 举报
回复
同意 phourm。

eg:
class CTest
{
public:
CTest()
{
init();
}

void init(){}

}

CTest* test = (CTest*)malloc(sizeof(CTest));

test->init();
Phourm 2004-07-21
  • 打赏
  • 举报
回复
再调用这个成员!
比如:
void Init()
{
...
}
Phourm 2004-07-21
  • 打赏
  • 举报
回复
写一个类的成员函数和构造函数功能一样,不过注意构造函数中的一些隐式调用
DoubleJiang 2004-07-21
  • 打赏
  • 举报
回复
RuntimeClass
加载更多回复(4)

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧