是否可以在运行时更改C++类的默认值?
Can a C++ class's default value be changed at runtime?
在C++中,是否可以更改一个类的默认值,以便将来由该类组成的所有对象都具有指定的值?
我正试图创建一个在运行时用户定义的类,该类的功能应该与同一父类的其他子类几乎相同,但我正在努力寻找一种方法,使两者都存在相同的格式构造函数。我认为,将正确的信息正确地传递到每个新对象的唯一方法是,要么在创建时总是对类类型进行不同的处理(总是将用户输入放入构造函数中),要么将创建时类的对象行为更改为默认定义的输入。
编辑:为了更好地解释问题并解决XY问题的可能性,以下是场景:
常规程序:我想让用户首先通过提供名称和定义它的行数来定义一个自定义形状。然后用户可以将三角形、正方形和自定义形状添加到他们的"购物车"中。每个自定义形状都与它们在开始时指定的形状相同,用户在程序过程中不会更改它。然后,程序可以返回一般信息,例如存在的特定类型的成员数量或购物车中的总行数。
有一个父类:
类形状
成员numLines,name;
有三个班是Shape的孩子:
类别三角形
overwrite numLines=3,name="triangle";
类userShape
覆盖的numline=????,name=????;
当我为cart创建与"shape"对象交互的方法时,我希望能够使用相同的代码来创建其他对象,而不需要以不同的方式对待userShape的构造函数。
从我收到的答案来看,静态类型似乎最适合默认值的用户设置,但我完全愿意用更好的方法来实现这样的东西。
仅仅因为你可以,并不意味着你应该。既然我已经解决了这个问题,下面是如何做到的:
#include <iostream>
struct C {
static int default_val;
C(int i = default_val) {
std::cout << i << 'n';
}
};
int C::default_val = 0;
int main() {
C c;
C::default_val = 1;
C c2;
return 0;
}
函数的默认参数不一定是常量表达式,它只需要在调用函数的每个地方都"可用"即可。静态变量就是这样。
它也不必在呼叫站点访问。因此,如果您希望类控制它,但不能从类外部对其进行修改,则可以将其设为私有。
我建议采用下一种模式:
- 运行您的应用程序
- 读取/加载配置
- 根据该配置为该对象创建工厂
- 在应用程序的整个生命周期中,使用工厂创建同一对象的更多实例
例如:
struct Object {
Object(int x, int y) : _x(x), _y(y) {}
int _x, _y;
};
struct DynamicFactory {
DynamicFactory(int x, int y) : _x(x), _y(y) {}
std::shared_ptr<Object> generate() { return std::make_shared<Object>(_x, _y); }
int _x, _y;
};
int main(){
// Load configuration
// Initialize dynamic factory using configuration
DynamicFactory factory(1, 3);
// Generate objects
auto obj1 = factory.generate();
auto obj2 = factory.generate();
return 0;
}
尝试使用静态成员,以便在对象之间共享这些成员。
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 具有默认值的引用获取函数
- 当给定默认值时,为什么此模板参数推导失败
- 从具有默认值的部分指定模板类继承时发生SWIG错误,具有不带默认值的正向声明
- 格式化浮点值:返回默认值
- 如何将数组部分初始化为某个默认值?
- asn1c 不会从 asn.1 模块中提取八位字节字符串的默认值
- 创建一个包含 c++ 默认值的环境文件
- C++(和 ROS) - 包含与前向声明引用,设置默认值和类型定义
- Makefile g++ 使用命令行中的 -D 变量进行编译,默认值
- Switch 语句(字符串)一直选择默认值,除非其为零
- 如何使用默认值将枚举声明为 extern
- 如何在提升程序选项中设置矢量<矢量>的默认值<string>
- 如何使用默认值为构造函数中的枚举赋值?
- 变量始终在函数中重置为默认值
- 如何在C++中提供模板化函数作为另一个函数的参数,默认值?
- 函数不返回默认值
- 具有公共范围与专用范围的默认值的C++的不同行为
- 在 c++ 中,如果我创建一个接受一个具有默认值的参数的构造函数 - 它会用作默认(空)构造函数吗?
- 实例化时结构字段中的默认值