导航
  • 主页
  • VC综合技术
  • 互联网技术
  • MFC AppLauncher
  • .NET 技术
  • 界面
  • 进程
  • 算法
  • 硬件/系统
  • 数据库
  • VC++技术资源

“error C2533: 构造函数不能有返回类型”,怎么回事?

sleepingboy 2002-12-17 02:22:44
VC.NET下

error C2533: 构造函数不能有返回类型

把函数里的代码注释掉也没用。

class RSBase
{
public:
RSBase(void);
virtual ~RSBase(void);

int m_nTopLeftX;
int m_nTopLeftY;
int m_nLength;

bool m_bMoveLeft;
bool m_bMoveRight;
bool m_bMoveDown;
bool m_bDeformation;

int m_nDeformCount;
RSArr **m_pDefaultRS;
RSArr *m_pCurrentRS;
};

class RSLeftL :
public RSBase
{
public:
RSLeftL(void);
~RSLeftL(void);

static const int m_nCount = 4;
};

RSLeftL::RSLeftL(void)
{ //这里是出现错误的行
m_nTopLeftX = 4;
m_nTopLeftY = 2;
m_nLength = 3;

m_bMoveLeft = false;
m_bMoveRight = false;
m_bMoveDown = false;
m_bDeformation = false;

m_nDeformCount = 0;

int init[4][3][3] = {
{0, 2, 0, 0, 2, 0, 0, 2, 2},
{0, 0, 2, 2, 2, 2, 0, 0, 0},
{2, 2, 0, 0, 2, 0, 0, 2, 0},
{0, 0, 0, 2, 2, 2, 2, 0, 0}
};

m_pDefaultRS = new RSArr*[m_nCount];
for(int i = 0; i < m_nCount; i++)
{
m_pDefaultRS[i] = new RSArr(m_nLength);
m_pDefaultRS[i]->Init(&init[i][0][0]);
}

m_pCurrentRS = m_pDefaultRS[0];
}
...全文
1863 点赞 收藏 21
写回复
21 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
sleepingboy 2002-12-17
难道我要留起这100分?
回复
cbc 2002-12-17
sleepingboy(狼神·固力)

呵呵,何必在这种问题上劳神那,
只要能解决问题不就行了
回复
sleepingboy 2002-12-17
我快疯掉了。

用一堆一模一样的代码覆盖上去

什么问题都没有。

难道这就是传说中vs.net 2003要修正的1000多个bug之一?!
回复
dupenf 2002-12-17
怪!怪!怪! 一个好来,一个坏。。。。。。。。。。
回复
sleepingboy 2002-12-17
我拿出昨天备份的代码

这一部分跟今天的没有改变啊

编译成功

~~~~>.<~~~~
回复
sleepingboy 2002-12-17
我新建一个项目

像joycenter(快乐之源)那样

把有关RSArr类的代码去掉再编译

也没有出错

但在原来的项目里,把这些代码注释掉后,问题依旧。
回复
cbc 2002-12-17
CaptainIII(山上人)
基类中析构函数已经声明为析构
所以派生类中析构函数也必然是虚函数
virtual关键字可加可不加

现在怀疑楼主得vc编译器有问题
回复
sleepingboy 2002-12-17
把析构函数的错误改正后

问题依旧-_-;
回复
joycenter 2002-12-17
我用VC编怎么没有错?
/**h文件**/

class RSBase
{
public:
RSBase();
virtual ~RSBase();

int m_nTopLeftX;
int m_nTopLeftY;
int m_nLength;

bool m_bMoveLeft;
bool m_bMoveRight;
bool m_bMoveDown;
bool m_bDeformation;

int m_nDeformCount;

};

class RSLeftL : public RSBase
{
public:
RSLeftL();
~RSLeftL();

static const int m_nCount;// = 4;
};

//c++规定构造函数和析构函数是没有返回的

/****另外一个cpp文件***/

#include "stdafx.h"
#include "FileChanger.h"
#include "test1.h"


const int RSLeftL::m_nCount = 4;
RSLeftL::RSLeftL()
{ //这里是出现错误的行
m_nTopLeftX = 4;
m_nTopLeftY = 2;
m_nLength = 3;

m_bMoveLeft = false;
m_bMoveRight = false;
m_bMoveDown = false;
m_bDeformation = false;

m_nDeformCount = 0;


}
回复
CaptainIII 2002-12-17
class RSLeftL :
public RSBase
{
public:
RSLeftL(void);
virtual ~RSLeftL(void);//<-!!!

static const int m_nCount = 4;
};

你的析构函数要“虚”,原因翻书吧
回复
cbc 2002-12-17
呵呵,可能编译器问题
1.restart VC
2.restart pc
2.reinstall VC
3.reinstall os
回复
sleepingboy 2002-12-17
(void)改为()没用。一样的意思。
cbc(逍遥子)的回复:
X( void ) { ... }; // OK, no return type declared

我的代码中,并没有返回类型类型啊。
难道是编译器的bug?
回复
zhou80bin 2002-12-17
class RSBase
{
public:
RSBase();
virtual ~RSBase(void);

int m_nTopLeftX;
int m_nTopLeftY;
int m_nLength;

bool m_bMoveLeft;
bool m_bMoveRight;
bool m_bMoveDown;
bool m_bDeformation;

int m_nDeformCount;
RSArr **m_pDefaultRS;
RSArr *m_pCurrentRS;
};

class RSLeftL :
public RSBase
{
public:
RSLeftL(void);
~RSLeftL(void);

static const int m_nCount = 4;
};

RSLeftL::RSLeftL()
{ //这里是出现错误的行
m_nTopLeftX = 4;
m_nTopLeftY = 2;
m_nLength = 3;

m_bMoveLeft = false;
m_bMoveRight = false;
m_bMoveDown = false;
m_bDeformation = false;

m_nDeformCount = 0;

int init[4][3][3] = {
{0, 2, 0, 0, 2, 0, 0, 2, 2},
{0, 0, 2, 2, 2, 2, 0, 0, 0},
{2, 2, 0, 0, 2, 0, 0, 2, 0},
{0, 0, 0, 2, 2, 2, 2, 0, 0}
};

m_pDefaultRS = new RSArr*[m_nCount];
for(int i = 0; i < m_nCount; i++)
{
m_pDefaultRS[i] = new RSArr(m_nLength);
m_pDefaultRS[i]->Init(&init[i][0][0]);
}

m_pCurrentRS = m_pDefaultRS[0];
}
c++规定构造函数和析构函数是没有返回的
回复
hnyyy 2002-12-17
下面一段话可供参考:

除了名字外,构造函数与析构函数的另一个特别之处是没有返回值类型,这与返回值类型为void的函数不同。构造函数与析构函数的使命非常明确,就象出生与死亡,光溜溜地来光溜溜地去。如果它们有返回值类型,那么编译器将不知所措。为了防止节外生枝,干脆规定没有返回值类型。(以上典故参考了文献[Eekel, p55-p56])
回复
denis95 2002-12-17
在函数声明的时候可以指定参数为void,但是实现的时候不能

改成这样就行了

class RSLeftL :
public RSBase
{
public:
RSLeftL(void);//!!!ok
~RSLeftL(void);

static const int m_nCount = 4;
};

RSLeftL::RSLeftL()// !!!void not allowed here
{ //这里是出现错误的行
m_nTopLeftX = 4;
m_nTopLeftY = 2;
}
回复
ruihuahan 2002-12-17
同意楼上
回复
kangcau 2002-12-17
构造函数和析构函数没有返回值类型,从面向对象的角度上说,构造或者析够对象的时候不需要返回任何东西!
回复
cbc 2002-12-17
构造函数没有返回类型
回复
cbc 2002-12-17
Compiler Error C2533
'identifier' : constructors not allowed a return type

The specified constructor was declared with a return type.

A constructor does not return a value and has no return type. A return type of void is not allowed.

The following is an example of this error.

class X
{
public:
void X( void ) { ... }; // error, return type declared
X( void ) { ... }; // OK, no return type declared
};

回复
sinqi 2002-12-17
同意楼上的意见,将(void)改为()试一下。
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告

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