C++ Can';t在C+中创建私有方法+;返回指向私有嵌套类的指针
这一个不想编译:C++ Can';t在C+中创建私有方法+;返回指向私有嵌套类的指针,c++,C++,这一个不想编译: class MainClass { public: ... private: class NestedClass { //Line 39 ... }; class NestedClass * getNestedClassFor(int i); }; 编者说: 错误:“类MainClass::NestedClass”是私有的 但是,如果我将NestedClass公开,它就会工作 为什么不起作用?我不是在通过公共方法导出
class MainClass
{
public:
...
private:
class NestedClass
{ //Line 39
...
};
class NestedClass * getNestedClassFor(int i);
};
编者说:
错误:“类MainClass::NestedClass”是私有的
但是,如果我将NestedClass公开
,它就会工作
为什么不起作用?我不是在通过公共方法导出嵌套类吗?它只是一个私有方法,返回指向私有类的指针。有什么想法吗
谢谢
更新
固定了半柱。他们不是问题所在。也不是在NestedClass前面编写class
以下是错误消息:
MainClass.h:在函数“MainClass::NestedClass*getNestedClassFor(inti)”中:
MainClass.h:39:错误:“class MainClass::NestedClass”是私有的
MainClass.cpp:49:错误:在此上下文中
下面是.cpp文件中也有抱怨的部分:
class MainClass::NestedClass * getNestedClassFor(int i) //Line 49
{
return NULL;
}
你为什么要这么做?你不应该把私人物品暴露给外部客户。这就是封装的全部要点。如果需要从外部访问,请将其公开。一个错误是:(事实上,这不是一个错误,只是一个时髦的错误,请参见下面的评论) 应仅为:
NestedClass * getNestedClassFor(int i);
另一个是:当您声明一个嵌套类时,您应该用“;”完成声明
可能还有其他错误
为什么不起作用?我不是在通过公共方法导出嵌套类吗?它只是一个私有方法,返回指向私有类的指针。有什么想法吗
编译器的信息非常清楚。您正在返回指向私有嵌套类的指针。该函数的调用方需要知道该类的结构,但是由于该类是私有的,因此禁止获取该结构。您应该私有类的一些属性和方法,而不是类本身。即使如此,如果您将所有属性和方法都设置为私有,那么这个类将没有用例
你到底想达到什么目的?这可以编译并运行良好:
class A {
private:
class B {
public:
B() {};
};
B *b;
B *getB();
public:
A();
};
A::A()
{
b = getB();
}
A::B* A::getB()
{
A::B *tmp = new A::B();
return tmp;
}
int main()
{
A a;
return 0;
}
忘记在.cpp中添加类作用域,即
class MainClass::NestedClass * getNestedClassFor(int i)
{
//...
}
应该是
class MainClass::NestedClass * MainClass::getNestedClassFor(int i)
{
//...
}
愚蠢的我您在哪一行得到错误?是否还有其他可能相关的错误?类定义后缺少分号。这是实际代码吗?缺少两个分号。为什么要将
class
放在getNestedClassFor
的前面?如果将getNestedClassFor
的定义放在标题中,应该可以使用。您对声明或定义有问题吗?但是函数是私有的。为什么不将私有内部对象传递给另一个私有函数?第一个(冗余<代码>类< /C> >不是错误,而是C风格。第一个“错误”不是一个,它不是非常C++,而是使用<代码>类< /代码>或<代码>结构> /代码>这里是合法C++。(出于与C兼容的原因:C在这里需要struct
,因为class
和struct
基本上是一样的…)缺少分号是一个错误,尽管错误消息非常奇怪。谢谢@JamesKanze和MSalters:-)或者使其不透明(比如句柄
).这是关于隐藏实现的东西。有时,您需要一些数据结构来计算某些内容,并且不希望公开此API,以便以后可以在不更改API的情况下更改实现。
class MainClass::NestedClass * getNestedClassFor(int i)
{
//...
}
class MainClass::NestedClass * MainClass::getNestedClassFor(int i)
{
//...
}