Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Can';t在C+中创建私有方法+;返回指向私有嵌套类的指针_C++ - Fatal编程技术网

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)
{
   //...
}