为什么不能如下设置接口类的成员变量

发布于 2024-08-23 01:59:48 字数 617 浏览 4 评论 0原文

所以我有一个接口类

class interfaceClass
{
 public:   
    virtual void func1( void ) = 0;
    virtual void func2( void ) = 0;

protected:
    int m_interfaceVar;
}

和一个继承它的类。 为什么我不能如下设置接口类的成员变量。

class inhertitedClass : public interfaceClass
{
   inheritedClass(int getInt): m_interfaceVar(getInt){};
   ~inheritedClass(){};
}

我必须这样做,

class inhertitedClass : public interfaceClass
{
   inheritedClass(int getInt){ m_interfaceVar = getInt;}
   ~inheritedClass(){};
}

如果这是一个愚蠢的问题,我很抱歉,但有一天晚上我刚刚遇到它,当时我正在将抽象类切换为接口类(回到抽象类)。

So i have a interface class

class interfaceClass
{
 public:   
    virtual void func1( void ) = 0;
    virtual void func2( void ) = 0;

protected:
    int m_interfaceVar;
}

and a class that inherits from it.
Why can't i set the member variable of the interface class as follows.

class inhertitedClass : public interfaceClass
{
   inheritedClass(int getInt): m_interfaceVar(getInt){};
   ~inheritedClass(){};
}

and i have to do it like this

class inhertitedClass : public interfaceClass
{
   inheritedClass(int getInt){ m_interfaceVar = getInt;}
   ~inheritedClass(){};
}

I'm sorry if this is a dumb question, but i just ran in to it the other night while i was switching my abstract class into an interface class (the back to an abstract class).

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

思慕 2024-08-30 01:59:48

构造函数中的初始值设定项列表可以首先指定基类的构造函数。通过剥夺 interfaceClass 的(受保护的)构造函数(显然应该),你就切断了这条生命线。

因此,添加受保护的构造函数,例如:

class interfaceClass
{
 public:   
    virtual void func1( void ) = 0;
    virtual void func2( void ) = 0;

protected:
    int m_interfaceVar;
    interfaceClass(int x) { m_interfaceVar=x; }
}

然后然后您可以以正确的方式做事,即

class inhertitedClass : public interfaceClass
{
   inheritedClass(int getInt): interfaceClass(getInt){};
   ~inheritedClass(){};
}

The initializer list in a constructor can specify the ctor for the base classes first and foremost. By depriving interfaceClass of a (protected) constructor (which it obviously should have) you've cut off that lifeline.

So add that protected ctor, e.g.:

class interfaceClass
{
 public:   
    virtual void func1( void ) = 0;
    virtual void func2( void ) = 0;

protected:
    int m_interfaceVar;
    interfaceClass(int x) { m_interfaceVar=x; }
}

and then you can do things the right way, namely

class inhertitedClass : public interfaceClass
{
   inheritedClass(int getInt): interfaceClass(getInt){};
   ~inheritedClass(){};
}
勿忘心安 2024-08-30 01:59:48

inheritedClass到达其初始化列表时,m_interfaceVar已经被初始化。您无法对其进行第二次初始化。

您的选择是向 interfaceClass 提供一个初始化 m_interfaceVar 的构造函数,或者只是将其分配到 inheritedClass 构造函数的主体中:

 interfaceClass(int getInt) : interfaceVar(getInt){}
 ...
 inheritedClass(int getInt) : interfaceClass(getInt)
 {
 }

或者

 inheritedClass(int getInt)
 {
    m_interfaceVar = getInt;
 }

By the time inheritedClass gets to it's initializer list, m_interfaceVar has already been initialized. You can't initialize it a second time.

Your options are to provide a constructor to interfaceClass that initializes m_interfaceVar, or just assign it in the body of inheritedClasss constructor:

 interfaceClass(int getInt) : interfaceVar(getInt){}
 ...
 inheritedClass(int getInt) : interfaceClass(getInt)
 {
 }

or

 inheritedClass(int getInt)
 {
    m_interfaceVar = getInt;
 }
丶视觉 2024-08-30 01:59:48

试试这样:

class interfaceClass
{
public:   
    virtual void func1( void ) = 0;
    virtual void func2( void ) = 0;

protected:
    // Ctor - called from derived classes
    interfaceClass(int interfaceVar)
        : m_interfaceVar(interfaceVar){};

    int m_interfaceVar;
}

class inhertitedClass : public interfaceClass
{
   inheritedClass(int getInt)
       : interfaceClass(getInt){}; // Pass to base class ctor

   ~inheritedClass(){};
}

...事实上,如果您interfaceClass创建受保护或私有构造函数,编译器会默默地为您和用户创建一个将能够创建接口的实例(您确实希望它是一个抽象基类,对吧?)

Try it like this:

class interfaceClass
{
public:   
    virtual void func1( void ) = 0;
    virtual void func2( void ) = 0;

protected:
    // Ctor - called from derived classes
    interfaceClass(int interfaceVar)
        : m_interfaceVar(interfaceVar){};

    int m_interfaceVar;
}

class inhertitedClass : public interfaceClass
{
   inheritedClass(int getInt)
       : interfaceClass(getInt){}; // Pass to base class ctor

   ~inheritedClass(){};
}

...in fact, if you don't create a protected or private constructor for interfaceClass, the compiler will silently create one for you, and users will be able to create instances of your interface (you did want it to be an abstract base class, right?)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文