【问题标题】:Can't make a private method in C++ return a pointer to a private nested class无法使 C++ 中的私有方法返回指向私有嵌套类的指针
【发布时间】:2012-01-26 09:13:30
【问题描述】:

这个不想编译:

class MainClass
{
public:
    ...

private:
    class NestedClass
    { //Line 39
        ...
    };

    class NestedClass * getNestedClassFor(int i);
};

编译器说:

错误:'class MainClass::NestedClass' 是私有的

但是,如果我创建了 NestedClass public,它会起作用。

为什么它不起作用?我不是通过公共方法导出嵌套类吗?它只是一个返回指向私有类的指针的私有方法。有什么想法吗?

谢谢!

更新

修复了半列。他们不是问题。也不是在 NestedClass 前面写class

这是错误信息:

MainClass.h:在函数'MainClass::NestedClass* getNestedClassFor(int i)'中:

MainClass.h:39: 错误:'class MainClass::NestedClass' 是私有的

MainClass.cpp:49:错误:在此上下文中

下面是 .cpp 文件中同样抱怨的部分:

class MainClass::NestedClass * getNestedClassFor(int i) //Line 49
{
    return NULL;
}

【问题讨论】:

  • 你在哪一行得到错误?还有更多可能相关的错误吗?
  • 类定义后缺少分号。
  • 这是实际代码吗?缺少两个分号。
  • 你为什么把class放在getNestedClassFor前面?
  • 如果您将getNestedClassFor 的定义放在标题中,它应该可以工作。您的声明或定义有问题吗?

标签: c++


【解决方案1】:

忘记在.cpp中添加类范围,即

class MainClass::NestedClass * getNestedClassFor(int i)
{
   //...
}

应该是

class MainClass::NestedClass * MainClass::getNestedClassFor(int i)
{
   //...
}

愚蠢的我!

【讨论】:

    【解决方案2】:

    这编译和工作正常:

    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;
    }
    

    【讨论】:

      【解决方案3】:

      一个错误是:(其实不是错误,只是一个时髦,见下面的cmets)

      class NestedClass * getNestedClassFor(int i);
      

      应该只是:

       NestedClass * getNestedClassFor(int i);
      

      另一个是:当你声明一个嵌套类时,你应该用“;”结束声明

      private:
        class NestedClass
        {
            ...
        };
      

      可能还有其他错误...

      【讨论】:

      • 第一个(冗余class)不是错误,只是C风格。
      • 第一个“错误”不是一个——它不是很 C++,但在这里使用 classstruct 是合法的 C++。 (出于 C 兼容性的原因:C 在这里需要struct,并且由于classstruct 基本上是同一件事......)缺少分号是一个错误,尽管错误消息对于它来说真的很奇怪。
      • 感谢@JamesKanze 和 MSalters :-)
      【解决方案4】:

      你为什么要这样做?您不应该将私人内容暴露给外部客户。这就是封装的全部意义所在。如果需要从外部访问,请将其公开。

      【讨论】:

      • 或使其不透明(如HANDLE)。
      • 这是关于隐藏实现的东西。有时你需要一些数据结构来计算一些东西,而你又不想暴露这个 API,这样你以后可以在不改变 API 的情况下改变实现。
      【解决方案5】:

      为什么它不起作用?我不是通过公共方法导出嵌套类吗?它只是一个返回指向私有类的指针的私有方法。有什么想法吗?

      编译器信息非常清楚。您正在返回一个指向私有嵌套类的指针。这个函数的调用需要知道这个类的结构,但是由于这个类是私有的,所以禁止获取这个结构。您应该私有一些类的属性和方法,而不是类本身。即便如此,如果您将所有属性和方法设为私有,那么这个类将没有用例。

      你到底想达到什么目的?

      【讨论】:

      • 但是函数是私有的。为什么不将私有内部对象传递给另一个私有函数?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-05
      • 1970-01-01
      • 2020-01-21
      • 1970-01-01
      • 1970-01-01
      • 2015-02-16
      相关资源
      最近更新 更多