可以在运行时更改C ++类的默认值吗?

时间:2017-10-10 13:41:10

标签: c++

在C ++中是否可以更改类的默认值,以便将来由该类组成的所有对象都具有指定的值?

我正在尝试创建一个在运行时用户定义的类,它应该与同一父类的其他子函数几乎完全相同,但是我正在努力想要在两者之间存在相同的格式构造函数。我能想到将正确信息正确地汇集到每个新对象的唯一方法是在创建时始终对类类型进行不同的处理(始终将用户输入放入构造函数中)或者让创建时类的对象行为更改为默认为定义的输入。

编辑:为了更好地解释问题并解决XY问题的可能性,方案如下:

一般计划: 我想让用户首先通过提供名称和定义它的行数来定义自定义形状。然后,用户可以将三角形,正方形和自定义形状添加到其“购物车”中。每个自定义形状与它们在开始时指定的形状相同,用户在程序期间不会更改它。然后,程序可以返回一般信息,例如存在的特定类型的成员数量或购物车中的总行数。

有一个父类:

班级形状

成员numLines,name;

三个班是Shape的孩子:

Class Triangle

覆盖numLines = 3,name =“triangle”;

...

类userShape

覆盖numline = ????,name = ????;

当我为购物车创建与“形状”对象交互的方法时,我希望能够在整个板上创建相同的代码来创建其他对象,而不是需要以不同方式处理userShape的构造函数。

根据我收到的答案,静态类型似乎最适合默认值的用户设置,但我完全愿意采用更好的方法来实现这样的事情。

3 个答案:

答案 0 :(得分:6)

仅仅因为你可以,并不意味着你应该。既然我已经解决了这个问题,那就是:

#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;
}

函数的默认参数不必是常量表达式,只需在调用函数的每个位置都“可用”。而静态变量就是这样。

也不必在呼叫站点访问它。因此,如果您希望类控制它,但不能从类外部对其进行修改,则可以将其设置为私有。

答案 1 :(得分:2)

我建议遵循下一个模式:

  • 运行您的应用程序
  • 读取/加载配置
  • 从该配置为该对象创建工厂
  • 使用工厂在应用程序的生命周期内创建同一对象的更多实例

例如:

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;
}

答案 2 :(得分:0)

尝试使用静态成员,以便在对象之间共享它们。