C++类含struct数据成员时如何定义构造函数?
解决C++类中私有struct成员的构造函数初始化问题
你遇到的问题核心在于构造函数初始化列表只能直接初始化类的一级成员,无法跳过成员结构体直接初始化它的子成员。你的cordinate是circle类的直接成员(类型为内部私有center结构体),所以得先初始化这个cordinate对象本身,而非直接给它的xcord/ycord赋值。
下面给你两种简洁可行的解决方案:
方案1:给内部结构体center添加构造函数
给嵌套的center结构体编写构造函数,这样就能在circle的构造函数初始化列表里直接用参数初始化cordinate成员:
#include <iostream> #include <cmath> using namespace std; class circle { private: struct center { int xcord; int ycord; // 给center添加带参构造函数 center(int x, int y) : xcord(x), ycord(y) {} // 必须显式写出无参构造函数,否则自定义构造会覆盖默认构造 center() : xcord(0), ycord(0) {} }; struct center cordinate; float radius; public: circle() { cordinate.xcord=0; cordinate.ycord=0; radius=0; }; // 直接用构造函数初始化cordinate成员 circle(int x, int y, float r) : cordinate(x, y), radius(r) {}; void showdata() { cout<<"Center(x,y) = ("<<cordinate.xcord<<","<<cordinate.ycord<<")"<<endl; cout<<"Radius = "<<radius<<endl; } }; int main() { circle c1; c1.showdata(); // 测试带参构造函数 circle c2(3, 4, 5.0f); c2.showdata(); }
方案2:使用C++11及以后的聚合初始化
如果不想给center额外写构造函数,可以利用C++11引入的聚合初始化特性,在初始化列表里用大括号直接初始化cordinate:
#include <iostream> #include <cmath> using namespace std; class circle { private: struct center { int xcord; int ycord; }; struct center cordinate; float radius; public: circle() { cordinate.xcord=0; cordinate.ycord=0; radius=0; }; // 用聚合初始化语法直接初始化cordinate circle(int x, int y, float r) : cordinate{x, y}, radius(r) {}; void showdata() { cout<<"Center(x,y) = ("<<cordinate.xcord<<","<<cordinate.ycord<<")"<<endl; cout<<"Radius = "<<radius<<endl; } }; int main() { circle c1; c1.showdata(); circle c2(1, 2, 3.5f); c2.showdata(); }
为什么你之前的写法无效?
你尝试的几种写法都存在逻辑错误:
cordinate.xcord(x):初始化列表只能操作circle的直接成员cordinate,不能跳过它直接访问子成员xcordcenter.xcord(x)或center.cordinate.xcord(x):center是结构体类型名,不是具体对象,无法通过类型名直接访问成员变量
另外,如果你想简化代码,也可以像无参构造函数那样,在构造函数体内直接给cordinate.xcord和cordinate.ycord赋值,但初始化列表的方式更符合C++初始化规范,也能避免默认构造后再赋值的额外开销。
内容的提问来源于stack exchange,提问作者user13898916
相关产品推荐
相关产品推荐

