2017-08-03 79 views
-1

我有一个从数据容器类派生的类。构造函数不能初始化容器的所有内容,所以有必要调用另一个类成员函数(提供一些额外的数据)来完成初始化。该成员函数将布尔值设置为true,表明数据已准备好进行访问。有条件地从C++中的继承类访问基类

如果数据是班上的一员,我将它设置私人/保护,我想有一个访问,如:

mycontainer& get_data() { check_macro(ready, "Data not ready"); return data; } 

我怎么这样如果类是继承自mycontainer?我可以从mycontainer私下推导它,然后期望返回参考this将公开吗?

+0

你可以重构的构造,因此不会退出,直到对象被完全初始化? – NathanOliver

+0

首先你的非构造函数初始化有些腥意,其次你的最后一句话是非常荒谬的。如果你需要任何帮助,你将不得不提供比你更好的解释。 – snb

+0

@NathanOliver:这在我现在的情况下是可行的,我同意这是更好的风格。然而,我认为有些情况下,当它被声明时完全初始化对象是不合逻辑的,例如,存储的部分数据可能由声明时未知的非const成员计算。 – Joce

回答

1

请记住,当您从另一个类继承时,您的新类具有基类所有的成员。您只需以班级成员的身份直接访问它们即可。

在下面的例子中,派生类没有成员,但由于它来自“DataContainerClass”继承,它具有所有类的成员,从而它具有“整数”构件。

因此,无论您的数据容器基类有哪些成员,您只需访问它们,就好像它们是在您的类中定义的那样。当然,成员必须是可访问的。 (公共基类,例如)

class DataContainerClass 
{ 
    public std::vector<int> Ints; 
} 



class MyClass : public DataContainerClass 
{ 
} 

int main() 
{ 
    MyClass cls; 

    // Ints is visible as a member of 'MyClass', because 
    // MyClass inherits from DataContainerClass. 
    cls.Ints.push_back(1); 
    cls.Ints.push_back(2); 

} 
+0

谢谢。在你的例子中,如果我将'MyClass'更改为'class MyClass:private DataContainerClass',那么我需要添加一个访问器来返回'Ints',以便在'main'中使用它。我的问题是,如果我有'class MyClass:private std :: vector ',我可以定义一个基类'vector '的访问器吗? – Joce

+0

在这种情况下,您不需要访问器。使用将是 – ttemple

+0

如果您公开继承,则不需要访问者。有了私人继承,你会的。看到这个很好的讨论你想要做什么:https://stackoverflow.com/questions/4353203/thou-shalt-not-inherit-from-stdvector – ttemple