2010-02-25 44 views
2

所以我有一个接口类为什么我不能设置的接口类的成员变量如下

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(){}; 
} 

对不起,如果这是一个愚蠢的问题,但我只是跑在它的晚上,而我是我的切换抽象类到一个接口类(回到抽象类)。

+0

可我甚至有一个接口类变量?我写了一篇已经太久了。 – Craig 2010-02-25 06:07:37

+0

你正在尝试访问的变量上发生了什么错误 – rerun 2010-02-25 06:11:52

+0

初始化错误。 – Craig 2010-02-25 06:13:31

回答

6

构造函数中的初始化器列表可以首先指定基类的ctor。通过剥夺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(){}; 
} 
6

inheritedClass到达初始化列表时,m_interfaceVar已经被初始化。你不能再次初始化它。

你的选择是提供一个构造函数interfaceClass初始化m_interfaceVar,或者只是给它分配在inheritedClass构造函数体:

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

inheritedClass(int getInt) 
{ 
    m_interfaceVar = getInt; 
} 
+0

我认为接口类不应该有构造函数? – Craig 2010-02-25 06:13:06

+2

C++中没有什么特别的抽象类,只是你不能直接创建一个实例。事实上,如果你不提供构造函数,编译器会为你填充一些。 – Eclipse 2010-02-25 06:15:51

+1

@Craig:一个接口不应该直接实例化,所以它不应该有一个* public *构造函数。 – 2010-02-25 06:21:35

0

试试这样说:

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创建一个受保护的或私有的构造函数,编译器会为你自动创建一个,用户将能够创建你的接口实例(你确实希望它是一个抽象基类,对吗?)

+2

无论如何,用户将无法创建接口的实例:纯虚拟方法使类为抽象类,并且不能实例化抽象类。将构造函数放在public或protected中实际上并没有什么区别。 – 2010-02-25 09:13:24

+0

哎呀,你是对的。 – 2012-08-17 22:09:49

相关问题