【问题标题】:Accessing members in same namespace in C++ [closed]在 C++ 中访问同一命名空间中的成员 [关闭]
【发布时间】:2015-01-13 14:57:20
【问题描述】:

已解决
很抱歉给大家带来了困惑 - 以后我会更加努力地提出更好的问题!

我最初的问题基本上是在定义类之前是否可以创建类的实例。

我已经为此寻找了很多,但我还没有真正找到解决方案。
基本上,我希望能够做到这一点:

namespace a {
    class first
    {
    private:
        second s; //Throws an error
    }
    class second
    {
    private:
        first f; //Seems to work
    }
}

但它不起作用。即使我指定a::second,它也无法识别它们。

那么,是否可以在同一个命名空间的成员在该命名空间中声明之前访问它们?如果有,怎么做?

我已经想通了,答案是不,你不能在一个类被声明之前创建它的实例,但是你可以前向声明这个类并创建一个指向它的指针。

【问题讨论】:

  • public class first 这没有意义,类没有访问说明符。
  • 哦 - 嗯。这对我来说从来没有出错 - 我会修复它。

标签: c++ namespaces


【解决方案1】:

您可以使用第二个类的前向声明并使用指针。只有实现必须知道您的类 Second 的声明。

namespace A {
    class Second;  // Forward declaration
    class First
    {
    public:
        First();
    ~First();
    private:
        Second* s; // Pointer on a forward class
    };

    class Second
    {
    private:
        First f;
    };


    First::~First()
    {
        delete s;
    }

    First::First()
    {
        s = new Second();
    }

}

【讨论】:

【解决方案2】:

你应该明白你不能访问 a::second 因为它是私有的;默认情况下,当没有命名访问说明符时,类中的所有内容都是私有的。如果你想访问类之外的元素,那么你应该公开成员。不要忘记每个类的大括号后的分号。

【讨论】:

  • "...您不能访问 a::second,因为它是私有的" - 只有类范围内的元素可以是 publicprotected、@ 987654323@。 second 在命名空间范围内声明,因此访问说明符在这里没有应用。
  • 我认为我们误解了这个问题。我首先在课堂上读到“second s”在私有范围内,因此无法访问。其类在命名空间范围内声明;因此,要解决有关声明的任何问题,应设置“第二”类的前向声明。
  • 这个问题与s 是否为私有无关,而是Second 在声明s 时是否可见。无论如何,a::Second 不是私人的,也不能是私人的,所以你的答案的第一部分是错误的和误导性的。
  • 这个问题具有误导性;但您的回答也具有误导性。我会弃权这个!
【解决方案3】:

那么是否可以在同一个命名空间的成员在同一个命名空间中声明之前访问它们? - 不,您使用的所有内容都必须先声明:

namespace a {
    // here you declare class second, but it's an incomplete class
    // until it's defined below
    class second;

    class first
    {
    private: 
        // Note that you can't write "second s;"
        // because second would have to be a complete class in this case
        second* s;
        // or you can use a smart pointer like std::shared_ptr<second>
    };

    class second
    {
    private:
        first f;
    };
}

【讨论】:

    猜你喜欢
    • 2021-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-29
    相关资源
    最近更新 更多