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

时间:2014-11-16 17:50:13

标签: c++ namespaces

分辨
抱歉所有的困惑 - 我将来会更加努力地提出更好的问题!

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

  

我为此寻找了很多,但我还没找到解决办法   基本上,我希望能够做到这一点:

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

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

     

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

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

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

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 :(得分:-1)

你应该明白,你不能访问:: second,因为它是私有的;默认情况下,当没有命名访问说明符时,一个类中的所有内容都是私有的。如果要访问类外的元素,则应将成员公开。不要忘记每节课后的分号&#39;端支架。