我正在使用Qt 4.5,所以做C ++。我有一个这样的课程
class CClass1
{
private:
struct stModelDetails
{
QString name;
QString code;
..... // only variables and no functions over here
};
QList<stModelDetails> m_ModelDetailsList;
public:
QList<stModelDetails> getModelDetailsList();
...
};
在此我有一些功能将填充m_ModelDetailsList;
我有另一个班级说CClassStructureUsage
,我将调用getModelDetailsList()
函数。现在我的需要是我必须遍历QList并从每个name
获取code
,stModelDetails
。
现在问题是包含CClass1的头文件它无法识别CClassStructureUsage
中的stModelDetails类型。当我通过
QList<stModelDetails> ModelList = obj->getModelInformationList();
它说stModelDetails
:未声明的标识符。
我如何才能从结构中获取值?我在这做错了吗?
答案 0 :(得分:4)
由于struct stModelDetails
是private
,因此从课堂外看不到。您应该在课程的public
部分声明它:
class CClass1
{
private:
QList<stModelDetails> m_ModelDetailsList;
public:
struct stModelDetails
{
QString name;
QString code;
..... // only variables and no functions over here
};
QList<stModelDetails> getModelDetailsList();
...
};
答案 1 :(得分:4)
您需要使用完全限定名称CClass1::stModelDetails
。现在它会告诉你它是私人的:))
答案 2 :(得分:2)
您已经就如何直接攻击问题提出了一些建议。不过,我会建议您回过头来考虑一下您要在这里完成的工作。首先,您已经说过只有真的想要每个name
项目的stModelDetails
成员。基于此,我首先更改函数以仅返回:
QList<QString> GetModelDetailNames();
或者,很可能:
QVector<QString> GetModelDetailNames();
前者有几点好处。首先,它减少了您需要复制的数据量。其次,它使客户端代码不必了解更多CClass1的实现细节。后者保留了这些优点,并添加了一些自己的优点,主要是在你没有指出你想要使用链表的任何理由的情况下避免链表的开销(这样的理由真的很不寻常)。
另一种方法是找出外部代码需要访问大量CClass1内部数据的原因,以及CClass1直接提供该服务而不是需要访问其数据的外部代码是否有意义。 / p>
答案 3 :(得分:0)
问题在于您将stModelDetails
声明为私有类。将它放在公共部分应该可以解决您的问题。
答案 4 :(得分:0)
有两个问题: 1.已经提到过,您需要将stModelDetails移动到类的公共部分。 2.因为它是嵌套的,所以在类之外它的正确名称是CClass1 :: stModelDetails。
如果你真的需要从外部访问它,你可能想要考虑它是否应该是CClass1的成员,或者它应该是一个独立的类或结构。我通常只使用嵌套的类/结构,因为它们是我班级的实现细节。