如何在初始化列表中初始化结构体?

norains 2010-03-23 02:21:35
嗯,简单点来说,我有个定义了个结构体:

struct Point
{
int x;
int y;
};


然后我这有个类:
class CTest
{
public:
CTest():
m_iCount(0), //将m_iCount初始化为0
m_Point() //这里应该怎么写,对于结构体?
{}

private:
int m_iCount;
Point m_Point;
};

如果m_Point为静态变量还好说,可以在外部这么写:
Point CTest::m_Point = {10,20};

只不过这是成员变量,就不能这么写了。


不知道各位大侠有啥好办法?
...全文
1274 25 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
tsh185 2010-03-23
  • 打赏
  • 举报
回复
把结构体看着是个类 然后是 嵌套类 就行了 呵呵
axx1611 2010-03-23
  • 打赏
  • 举报
回复
C++的瑕弊,没办法,我也经常想如果支持就好了。。。
其实从效率上讲,写在构造函数里:
A::A()
{
m_x.x = 0;
m_x.y = 0;
}
一样的,就是难看加麻烦。。。
Julykey 2010-03-23
  • 打赏
  • 举报
回复
各种难,坐等高手
yyg990441 2010-03-23
  • 打赏
  • 举报
回复
可以这样写

struct Point
{
int x;
int y;
};

class CTest
{
public:
CTest():m_iCount(0),m_Point(defaultPoint){}
private:
int m_iCount;
Point m_Point;
const static Point defaultPoint;
};

const CTest::Point defaultPoint={1,2};
品茶 2010-03-23
  • 打赏
  • 举报
回复
类申明

class CTest
{
public:
CTest(Point point = NULL);

private:
int m_iCount;
Point m_Point;
};

类定义

class CTest
{
public:
CTest(Point point):
m_iCount(0), //将m_iCount初始化为0
m_Point(point) //这里应该怎么写,对于结构体?
{}

private:
int m_iCount;
Point m_Point;
};
norains 2010-03-23
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 taodm 的回复:]
所以啊,你这次是犯洁癖了。
在系统边界处,必然要存在很多所谓美观度、精简度不够的代码的。
mfc、wx等库就是做掉封装这个“垃圾活”的,你又不肯直接拿来用。
[/Quote]


呵呵,更像是走火入魔了。。
norains 2010-03-23
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 taodm 的回复:]
所以啊,你这次是犯洁癖了。
在系统边界处,必然要存在很多所谓美观度、精简度不够的代码的。
mfc、wx等库就是做掉封装这个“垃圾活”的,你又不肯直接拿来用。
[/Quote]

我比较喜欢追求代码的优雅。。。其实相关的初始化,我完全可以在构造函数中完成,不必执着于初始化列表,但这样子,代码会比较突兀。。。看得不爽。。。。。

至于MFC这个东东嘛,我更觉得它是添加了不少垃圾。。。特别是那些看着不爽的宏,,我实在不能忍受代码有这些存在。。

另外。。。这个类的初始化。。貌似和MFC沾边不上。。。MFC也无法解决这个初始化列表的问题。。。?
羽盛 2010-03-23
  • 打赏
  • 举报
回复
还真想不出什么办法来
taodm 2010-03-23
  • 打赏
  • 举报
回复
所以啊,你这次是犯洁癖了。
在系统边界处,必然要存在很多所谓美观度、精简度不够的代码的。
mfc、wx等库就是做掉封装这个“垃圾活”的,你又不肯直接拿来用。
norains 2010-03-23
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 taodm 的回复:]
真追求完美你就该包装那个point类。
[/Quote]

Windows下类似于POINT,RECT,SIZE不下百余个,总不能每个都继承一个遍吧。。?何况。。。WinCE和WinXP在某些类上还有些许区别,那就更不止百余个了。。。。。

并且。。。重载构造函数,就没有了隐性转换,换句话来说就无法使用“="了

比如:
POINT ptA,ptB;

ptA = ptB; //如果重载了构造函数,令其有多个实参,那么这代码就会报错,因为没有隐性转换
taodm 2010-03-23
  • 打赏
  • 举报
回复
真追求完美你就该包装那个point类。
norains 2010-03-23
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 selooloo 的回复:]
如果结构体里有构造函数
CTest():m_iCount(0){}这样就可以调用结构默认构造函数了

或者
CTest():m_iCount(0)
{m_Point.x=0,m_Point.y=0;}

LZ一定要初始化列表初始化?
[/Quote]

嗯。。。。。为追求完美。。。所以追求初始化列表。。。
norains 2010-03-23
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 taodm 的回复:]
那个太复杂了,得抠标准来获得答案。
而知道这个答案对你编程也没有帮助。
[/Quote]

这还真说错了。。如果我能在初始化列表中初始化结构体,那么我代码无论是从美观度还是从精简度,都能有提升。。。。
selooloo 2010-03-23
  • 打赏
  • 举报
回复
如果结构体里有构造函数
CTest():m_iCount(0){}这样就可以调用结构默认构造函数了

或者
CTest():m_iCount(0)
{m_Point.x=0,m_Point.y=0;}

LZ一定要初始化列表初始化?
canyingwushang 2010-03-23
  • 打赏
  • 举报
回复
[Quote]
class CTest
{
public:
CTest(const Point &point):
m_iCount(0),m_Point(point)
{}
[/Quote]
改一下CTest构造函数也行。在主函数先声明初始化一个Point对象,然后传到CTest的构造函数中。
linyongzuo 2010-03-23
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;

struct a
{
int i;
int j;
};

class b
{
public:
b();
private:
struct a m_i;
};

b::b()
: m_i()
{
}

void main()
{

b xxx;
}
系统会默认初始化i,j 为0...调试
taodm 2010-03-23
  • 打赏
  • 举报
回复
那个太复杂了,得抠标准来获得答案。
而知道这个答案对你编程也没有帮助。
norains 2010-03-23
  • 打赏
  • 举报
回复
换句话来说,在初始化列表是无法初始化结构体了。。。?
taodm 2010-03-23
  • 打赏
  • 举报
回复
那就没必要好奇初始化列表。
ssdx 2010-03-23
  • 打赏
  • 举报
回复
那就自己写个类继承Point,然后写其构造函数。
加载更多回复(5)

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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