访问 C++ 中同一命名空间中的成员

Accessing members in same namespace in C++

本文关键字:成员 命名空间 C++ 访问      更新时间:2023-10-16

已解决
很抱歉所有的困惑 - 我将在未来更加努力地提出更好的问题!

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

我为此环顾四周,但还没有真正找到解决方案。
基本上,我希望能够做到这一点:

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

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

那么,是否可以

在命名空间中声明之前访问同一命名空间的成员?如果是这样,如何?

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

您可以使用类的 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();
    }
}
那么,是否可以

在命名空间中声明之前访问同一命名空间的成员? - 不,您使用的所有内容都必须首先声明:

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

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