Закрытый конструктор C ++ (с аргументом) не позволяет создавать экземпляры - PullRequest
1 голос
/ 18 марта 2012

У меня проблема в личном конструкторе, как показано ниже:

Lane.hpp:

namespace sim_mob
{
class B
{

    friend class A;

private:
    B(int){}

};
}

xmll.hpp:

#include"Lane.hpp"
namespace geo
{
class A
{
public:
    A()
    {
        sim_mob::B b(2);
     }
};
}

main.cpp:

#include"xmll.hpp"



int main()
{
    geo::A a;
    return 0;
}

Команда: $ g ++ main.cpp

In file included from main.cpp:2:0:
Lane.hpp: In constructor ‘geo::A::A()’:
Lane.hpp:10:5: error: ‘sim_mob::B::B(int)’ is private
xmll.hpp:9:23: error: within this context

Дело в том, что если бы у меня не было аргументов в конструкторе, я бы не получил эту ошибку. Могу ли я знать, почему я получаю это и как это решить? Большое спасибо

Ответы [ 3 ]

6 голосов
/ 18 марта 2012

В классе sim_mob::B вы подружитесь с классом sim_mob:A, но надеетесь, что эта дружба простирается до geo::A, чего, очевидно, нет.Чтобы решить эту проблему, вам нужно объявить geo::A, прежде чем сделать его другом:

namespace geo { class A; }
namespace sim_mob
{
    class B
    {
        friend class geo::A;
    private:
        B(int){}
    };
}

Тот факт, что он "работает" с конструктором по умолчанию, я полагаю, вы скорее объявили функциючем создать экземпляр объекта:

sim_mob::B b();

- это объявление функции.Если вы пропустите скобки, то получите сообщение об отсутствии конструктора по умолчанию или, если вы действительно его объявите, о недоступности.

3 голосов
/ 18 марта 2012

Форвард объявляет:

namespace geo{
class A;
}

В классе B:

friend class geo::A;
0 голосов
/ 18 марта 2012

friend class A; класс друзей A в текущем пространстве имен, т.е. sim_mob::A, а не geo::A.Вам нужно объявить класс, а затем использовать полное имя:

namespace bar { struct bar; }
namespace foo {
    struct foo {
    private:
        friend struct bar::bar;
        explicit foo(int) {}
    };
}

namespace bar {
    struct bar {
        bar() { foo::foo x(42); }
    };
}
...