2017-10-10 75 views
3

在C++中,是否可以更改类的默认值,以便所有由该类构成的未来对象都具有指定的值?在运行时可以更改C++类的默认值吗?

我想在运行时创建一个用户定义的类,该类应该与同一父类的其他子类几乎完全相同,但我正在努力通过两种方式使用相同的格式构造函数。我认为将正确的信息正确地分配给每个新对象的唯一方法是,在创建时始终以不同的方式处理类类型(始终将用户输入放入构造函数中),或者将类的对象行为更改为默认为定义的输入。

编辑:为了更好地解释这个问题,并解决了XY问题可能这里的情景:

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

有一个父类:

类形状

构件numLines,名称;

三个类形状的小孩:

类三角

覆盖numLines = 3,名字= “三角形”;

...

类userShape

覆盖numline = ????,名字= ????;

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

从我收到的答案来看,静态类型似乎最适合用户设置的默认值,但我完全开放以更好的方式来实现这样的事情。

+3

“我想在C++中创建一个在运行时由用户定义的类”?怎么样? – AndyG

+0

默认值不能改变,但你说的是不同的......你可以给你一个关于你如何使用它的代码示例吗? – lorro

+0

听起来像你想利用一些静态成员。 – Ron

回答

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

默认参数的函数不必是常量表达式,它只是为“可用”在每个地方的功能调用。而一个静态变量就是这样。

它也不必在呼叫站点可以访问。所以如果你想让班级去控制班级,但是班级以外的班级不能修改班级,你可以把它变成私人的。

0

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

+3

小心解释多一点,写一个例子? –

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; 
} 
相关问题