【问题标题】:Does it make sense to have a class without constructor?没有构造函数的类有意义吗?
【发布时间】:2018-06-12 18:50:10
【问题描述】:

我想知道如果派生类有一个没有构造函数的类是否有意义。如果没有,有没有办法以不同的方式做我想做的事?

我的情况如下: 我希望用户只使用派生类,但它们具有共同的数据成员和方法。

编辑:由于类存在默认构造函数,这意味着用户始终可以直接创建 Instrument 的实例,那么我该怎么做?

class instrument{
    public:
        double get_price();
        std::string get_udl();

    private:
        double m_price;
        std::string m_udl;

};

class stock : public instrument{
    public:
        double get_dividend();

    private:
        double m_dividend;
};

class option : public instrument{
    public:
        double get_strike();
    private:
        double m_strike;
};

【问题讨论】:

  • instrument 有一个隐式声明的默认构造函数。你不知道吗?
  • 不,我不知道,所以我不能阻止用户直接创建仪器实例?那么有没有办法以不同的方式做我想做的事?
  • 您如何设想stockinstrument 的私有成员设置值?
  • 通过在构造函数中添加计算价格或初始化的方法

标签: c++ class


【解决方案1】:

我希望用户只使用派生类,但它们具有共同的数据成员和方法

拥有您的默认(或任何其他)c'tor,但使用protected 访问权限声明它。现在只有派生类可以调用它。有效地使其仅在继承时可用。

class instrument{
    public:
        double get_price();
        std::string get_udl();

    protected:
        instrument() = default;

    private:
        double m_price;
        std::string m_udl;

};

这也避免了与抽象类相关的开销。如果您不需要多态性,则不应仅将其用于使类仅可用作基类。

【讨论】:

  • 您能否详细说明您对抽象类和多态性的最后想法?实际上可以在您的解决方案中使用多态性。
  • @Germán - 最后一句话并不是说不能将instrument 抽象化。也就是说,不应该将其抽象为 just 以使其无法自行实例化。多态性带来成本。而且我认为这个简单的用例并不值得。
  • 我同意你关于费用的看法,并且只在必要时使用它。我显然更喜欢你的解决方案而不是抽象类一。但我从您的评论中了解到,抽象类比这个解决方案带来更多的开销。这就是我看不到的。
  • @Germán - 一个抽象类意味着必须添加运行时多态性支持(回想一下,vptrvtable 仅在贴花第一个虚函数时创建)。我所说的成本是对象大小。
  • 我现在明白了。谢谢!
【解决方案2】:

想过抽象类吗?

抽象类是被声明为抽象的类——它可能包含也可能不包含抽象方法。抽象类不能被实例化,但可以被子类化。

这不是你要找的吗?

【讨论】:

  • 我相信这就是答案,here 是一个带有实现示例的帖子。
  • 我很确定引用的是 Java 文档。 C++ 没有抽象关键字。
  • @Zebrafish 很好,也许应该用一个松散的概念定义来编辑答案。
  • 您可以使用以下语法为任何 C++ 成员方法创建类抽象:virtual void foobar(void) = 0; 但请注意,这将迫使您在派生自抽象基类的每个单独类中实现此功能。
  • (downvote) 这是从 Java 文档中剪切和粘贴的。
【解决方案3】:

当没有定义默认构造函数时,编译器会自动为你生成一个,对基本类型的成员什么都不做,为结构/类类型的成员调用默认构造函数。

所以结论是,没有any构造函数的类是没有意义的,因为每当你定义该类的实例时,你必须调用至少一个( more 可能会调用 deligate 构造)。

【讨论】:

  • 只有当没有用户声明的构造函数(默认或其他)时,编译器才会为你生成一个默认构造函数。
【解决方案4】:

是的!绝对是有道理的。因为当用户创建derivedclassinstance时,首先parent类的constructor会在derivedclassconstructor中被调用。即使没有您明确调用它。并且 parent 类的 default constructor 将被调用,即使你没有创建一个。默认情况下

public constructor with no parameter is present in every class
if it has no overridden constructor.

是的,在创建derived class instance 之后,父类的所有公共成员都将出现在derived class 中。

【讨论】:

  • 你自相矛盾:你没有构造函数,但你从派生类调用它?
  • 我没有反驳。如果您不编写任何类的构造函数,我想告诉您什么。将有一个始终可用的公共默认构造函数,编译器将自己写入 .class 文件中。
  • 这将在执行时被调用。
  • 你是认真地绕过这里的所有项目并投反对票吗?
  • 什么意思?我想说点什么。
猜你喜欢
  • 1970-01-01
  • 2014-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-26
  • 1970-01-01
  • 1970-01-01
  • 2012-03-05
相关资源
最近更新 更多