【问题标题】:How do I instantiate a class without an implicit/explicit constructor?如何在没有隐式/显式构造函数的情况下实例化一个类?
【发布时间】:2021-12-16 03:58:49
【问题描述】:

编辑。这是我在 stackoverflow 中的第一个问题 :) 非常感谢您的回答。但似乎我没有清楚地澄清问题。我将使用完整代码打开新问题。

有人可以帮助理解这段代码吗?

我有 Foo 类,它没有构造函数,它的所有方法都是虚拟的。
我只有标题。

class Bar;
class USER_API IFoo
{
public:

    virtual ~IFoo() {}

    virtual uint32_t GetWidth() const = 0;
    // more virtual methods...
};

class USER_API Foo
    : public IFoo
{
public:
    virtual Bar *GetBar() = 0;
};

它没有构造函数,所以我不能使用auto ptrFoo = new Foo 方法。
这是否意味着Foo 类没有隐式/显式构造函数?

如果是,如何防止调用默认构造函数?
我知道的唯一方法是使构造函数成为受保护的成员。但是在这个头文件中没有声明 c'tor。

我可以从下面的Bar 类中的GetFoo() 方法获取Foo 实例的指针。

class Foo;
class USER_API Bar
{
public:
    Bar();
    virtual ~Bar();

    Foo *GetFoo();
    const Foo *GetFoo() const;
}

我很好奇,Bar.cpp 如何创建并拥有 Foo 的实例?
我猜是 Bar.cpp 有一个继承自 Foo 的类。

任何提示将不胜感激..

【问题讨论】:

  • 除非您明确声明或删除它们,否则IFooFoo 都将具有默认构造函数。它将隐式生成以默认初始化任何成员或基(如果没有成员或基,则不执行任何操作)。你不能初始化你的类,因为它们都有纯虚函数(如果派生类是可实例化的,则派生类必须覆盖的虚函数)。要禁止生成默认构造函数,请在 C++11 中执行 IFoo() = delete(对于 IFoo 类)或(在 C++11 之前)声明 IFoo() 私有但不要定义它。
  • 它没有构造函数它有一个构造函数。

标签: c++ class constructor


【解决方案1】:

Foo 确实有一个隐式构造函数,因为它既没有显式定义也没有显式删除。

您可以通过编写来保护隐式(默认)构造函数。

 protected:
    Foo() = default;

【讨论】:

  • 首先,感谢您的快速回复。但这是某个库的标题。而且我找不到受保护的Foo() = default; 构造函数整个标题..
  • @JaeMinKim:如果不是你的代码,并且你不能更改Foo,那么你不能阻止Foo::Foo()被调用。
【解决方案2】:

一般来说,如果你不想实例化一个类,你需要将它的构造函数设为私有。因此,没有人能够调用它并因此创建它的实例。 为了创建一个实例,您需要定义一个调用私有构造函数的静态成员函数(因为类的成员函数可以访问私有成员)。

另一个选项是抽象类,就像你的类IFoo。抽象类不能被实例化,尽管有时会声明构造函数受保护:

class Base_class {
  public:
    virtual ~Base_class() = 0;
  protected:
    Base_class() {}
};

在您的情况下, Foo 不是抽象的,并且未声明其构造函数,因此它具有默认构造函数并且可以实例化。 如果您无权访问 Foo,则无法修改此行为

【讨论】:

  • 谢谢,但没有声明构造函数。起初,我猜应该有一个默认构造函数。但new Foo; 因“没有适当的默认构造函数”而失败。我不明白这怎么可能..
猜你喜欢
  • 2013-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多