C++多次向类构造函数传参不生效问题如何解决
问题原因分析
你遇到的报错本质是同一作用域下的变量重复定义错误,和Rectangle类的构造函数本身没有关联:
C++语法规定,同一个作用域内不允许声明两个名称完全相同的变量,你在main函数的全局作用域里两次定义了名为rect的Rectangle类对象,编译器识别到重名变量后会直接抛出编译错误,所以第二次定义看起来没有生效。
可行解决方案
根据使用场景可以选择以下三种常用方案:
- 方案1:为第二个Rectangle对象设置不同的变量名,是最常用的实现方式
#include<iostream> #include<string> using namespace std; class Rectangle { public: Rectangle(int length, int breadth) { cout << "Area = " << length * breadth << endl; } }; int main() { Rectangle rect(4,5); Rectangle rect2(5,8); // 修改变量名避免重名 system ("pause"); return 0; }
- 方案2:如果不需要同时保留两个对象,可以通过花括号限定第一个对象的生命周期,让它在第二个对象定义前自动销毁
int main() { { Rectangle rect(4,5); } // 第一个rect在此处离开作用域,自动销毁 Rectangle rect(5,8); system ("pause"); return 0; }
- 方案3:如果需要复用同一个变量名更新对象参数,可以给Rectangle类补充默认构造函数和参数设置成员函数,先创建对象再修改参数
class Rectangle { private: int length; int breadth; public: // 补充默认构造函数 Rectangle() = default; Rectangle(int l, int b):length(l),breadth(b) { cout << "Area = " << length * breadth << endl; } // 补充参数设置成员函数 void setParam(int l, int b){ length = l; breadth = b; cout << "Area = " << length * breadth << endl; } }; int main() { Rectangle rect(4,5); rect.setParam(5,8); // 复用现有对象更新参数,不需要重复定义 system ("pause"); return 0; }
内容的提问来源于stack exchange,提问作者Vikram Mehta
相关产品推荐
相关产品推荐

